我正在制作一个删除现有文件中某些行的程序。它将file1作为条目(f1),它查找某个模式,如果找到它,它会修改该行(使其与另一个文件兼容)并将此修改保存在变量“mark”中。它会打开另一个文件f2,并在其中搜索“mark”。如果它在f2中的某一行找到'mark',我必须删除该行和后面的三行。问题是当我运行它时,程序会删除f2中的所有内容,因此我得到一个空文件。
new=''
pattern2 = '2:N:0:8'
i=0
f1=open('test_reverse.txt','r')
for line in f1:
if pattern2 in line:
mark=line.replace('2:N:0:8','1:N:0:8')
f2=open('test_OKforward2.txt','r')
lines=f2.readlines()
for i, line in enumerate(lines):
if mark in lines[i]:
e=lines[i]
e1=lines[i+1]
e2=lines[i+2]
e3=lines[i+3]
new=e+e1+e2+e3
f3=open('test_OKforward2.txt','w')
if line!=new:
f3.write(line)
我也尝试使用next()函数,但是我得到了相同的结果和'stop iteration'错误。
答案 0 :(得分:0)
问题在于,当我运行它时,程序会删除f2中的所有内容,因此我得到一个空文件。
每当您打开文件进行书写时,其中的所有内容都将丢失。您必须重新编写要保留在文件中的所有内容,并首先排除您要删除的内容。
请注意以下几行:
f2=open('test_OKforward2.txt','r')
# ...
f3=open('test_OKforward2.txt','w')
问题是,f3
正在打开与f2
相同的文件,用于在文件f2
的行上为每个循环编写。
基本上,在添加行之后,重新打开文件进行写入,从而消除了以前的内容。
首先:您应该从循环中移除f3=open
,迭代f2
的每一行(即在此循环之外的其他位置执行此操作)。这是主要问题。
第二个:使用临时文件代替流程,最后将临时文件重命名为您拥有的文件。
第三:您没有关闭文件。考虑使用上下文管理器您的代码看起来更像是这样:
with open('something.txt') as f2:
# do something with f2;
# f2 with be automatically closed when it exits the ctx manager
第四:遵循代码的PEP-8样式标准。阅读代码的每个人都会感谢你。
我进行了一次“停止迭代”。错误。
这是正常的;你说你使用的是next()
功能。迭代器和next()
引发StopIteration
以表示它们不能从正在迭代的集合中生成更多元素,并且此迭代过程应该停止。
引用the docs:
exception StopIteration
由内置函数
next()
和迭代器的__next__()
方法引发,表示迭代器没有生成其他项。