选择txt文档的多行并在python中写入新文本文档时出现问题

2024-05-15 09:04:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我是个业余Python。我有一个文本文件,列出了上千行的信息,我试图选择一行和下面的2-3行的基础上,他们是否匹配的模式。 我已将文件从原始文件筛选下来,只包含我感兴趣的文件部分,因此我的当前文件如下所示:

trig1.RESP: 
stim4: silence.wav 
trig1.RESP: 
trig6.RESP: 1 
trig1.RESP:
trig1.RESP: 
trig5.RESP: 1
stim5: silence.wav
trig1.RESP:
trig6.RESP: 1
stim3: silence.wav
trig1.RESP:
stim5: silence.wav
trig1.RESP:
trig6.RESP: 1

等等等等。。。 基本上我要做的就是写下每一行沉默.wav行的一部分,然后是其后的两行。我使用了以下代码:

parsed_output = open("name-of-file-to-be-written", "w")
filtered_input = open("name-of-file-that-has-above-data", "r")
for line in filtered_input:
    if "silence.wav" in line and "trig1" in filtered_input.next():
        parsed_output.write(line)
        parsed_output.write(filtered_input.next())
parsed_output.close()

这在大多数情况下都很好,因为它可以打印沉默.wav行和具有响应的行(我最感兴趣的部分,此时响应之前的trig1不太重要)。然而,我遇到的问题是,当线路走到:

stim3: silence.wav
trig1.RESP: 
stim5: silence.wav

因为我的输出将写入stim3(当前行)和stim5(跳过trig1后的下一行),所以我认为它将转到下一行刺激:沉默.wav并跳过stim5,因为它在编写时包含在上一个命令中。 我想要在stim5之后使用trig6.RESP:1,但是由于我描述的原因,我的输出没有显示它。 有没有办法让它不跳过那一步?你知道吗

抱歉,如果时间太长了。提前谢谢!你知道吗


Tags: 文件ininputoutputlineparsedresp感兴趣
3条回答

一种可能的方法是使用deque,这样您可以一次跟踪三行:

import collections

parsed_output = open("name-of-file-to-be-written", "w")
filtered_input = open("name-of-file-that-has-above-data", "r")

window = collections.deque([None]*3, maxlen=3)
for line in filtered_input:
    window.append(line)
    if 'silence.wav' in window[0]:
        parsed_output.write(window[0])
        # only output next two lines if they don't also contain 'silence.wav'
        if 'silence.wav' not in window[1]:
            parsed_output.write(window[1])
            if 'silence.wav' not in window[2]:
                parsed_output.write(window[2])
# following if/elif in case last or second to last line contain 'silence.wav'
if 'silence.wav' in window[1]:
    parsed_output.write(window[1])
    parsed_output.write(window[2])
elif 'silence.wav' in window[2]:
    parsed_output.write(window[2])
parsed_output.close()

如果您向deque提供maxlen参数,那么当您向一端添加其他元素时,另一端会弹出一个元素,例如:

>>> x = collections.deque([1, 2, 3], maxlen=3)
>>> x
deque([1, 2, 3], maxlen=3)
>>> x.append(4)
>>> x
deque([2, 3, 4], maxlen=3)
>>> x.append(5)
>>> x
deque([3, 4, 5], maxlen=3)

这允许您迭代文件,但以方便的方式保存读取的最后3行,window的第一个元素与您的条件匹配时,只需输出匹配的行和以下两行,只要它们与您的条件不匹配即可。你知道吗

像这样的怎么样?(完全未经测试

count = 3
for line in filtered_input:
    if "silence.wav" in line:
        count = 0
    else:
        count += 1

    if count <= 2:
        filtered_output.write(line)

这不花哨,但我认为它应该很结实。你知道吗

我试图把它翻译成psuedocode:

For each (Line) {
      If Next Line is "Trig1" AND Current Line is "silence.wav"
          Log it
}
## And We're Done

(请在这里纠正我)

你错过了Trig6,因为你要求的下一行不存在。你能把它改写成向后而不是向前,这样就解决了你的问题吗?你知道吗

相关问题 更多 >