【问题标题】:Python : Delete certain lines from a filePython:从文件中删除某些行
【发布时间】:2016-03-03 04:50:45
【问题描述】:

我正在制作一个从现有文件中删除某些行的程序。它将 file1 作为 entry(f1),它查找某个模式,如果找到它,它会修改该行(以使其与另一个文件兼容)并将此修改保存在变量“mark”中。它打开另一个文件 f2,并在其中搜索“标记”。如果它在 f2 的某一行中找到“标记”,我必须删除该行和之后的三行。问题是,当我运行它时,程序会从 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() 函数,但得到了相同的结果和“停止迭代”错误。

【问题讨论】:

  • 请记得回来并接受您认为对您最有用的答案。它对您、那些试图回答您问题的人以及整个社区都有好处。这就是我们在这里说“谢谢”的方式。

标签: python file lines readlines


【解决方案1】:

问题是,当我运行它时,程序会删除 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__() 方法引发,表示迭代器不再生成任何项目。

【讨论】:

    猜你喜欢
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2021-03-13
    相关资源
    最近更新 更多