将剩余行保存到文件

Saving remaining lines to file

我有一个我读过的文件,如果文件中的行包含 "something",它将把文件保存到另一个文件,如果那么我试图将不包含它的行保存到另一个文件但它不起作用。 任何帮助表示赞赏。我仍然是 Python 的初学者,如果我遗漏了一些愚蠢的东西,我深表歉意。

with open("my.txt", errors='ignore') as f:
    lines = [l for l in f if "findme" in l]
    nolines = [l for l in f if "findme" not in l]
    with open("save.txt", 'a') as fi:
       for listitem in lines:
         fi.write(listitem)
    with open("remaining.txt", 'a') as fu:
       for listfail in nolines:
         fu.write(listfail)

您的代码存在问题,您只读取了文件内容一次。

我建议你先阅读内容,然后将列表拆分为两个

with open("my.txt", errors='ignore') as f:
    all_lines = [l for l in f]
    lines = [l for l in all_lines if "findme" in l]
    nolines = [l for l in all_lines if "findme" not in l]
    with open("save.txt", 'a') as fi:
       for listitem in lines:
         fi.write(listitem)
    with open("remaining.txt", 'a') as fu:
       for listfail in nolines:
         fu.write(listfail)

不过,还有许多可以改进的地方。

问题是在第一次循环遍历文件行之后,您的文件指针指向文件末尾。解决问题的一种方法是将指针设置回 file.seek(0) 开头,例如:

with open("my.txt", errors='ignore') as f:
    lines = [l for l in f if "findme" in l]
    f.seek(0)  # reset the file pointer position to the beginning
    nolines = [l for l in f if "findme" not in l]
    with open("save.txt", 'a') as fi:
       for listitem in lines:
         fi.write(listitem)
    with open("remaining.txt", 'a') as fu:
       for listfail in nolines:
         fu.write(listfail)

但是,解决该问题的更好方法是只循环遍历行一次并随时编写行:

with open('my.txt', 'r', errors='ignore') as src_file, \
        open('save.txt', 'a') as tgt1_file, \
        open('remaining.txt', 'a') as tgt2_file:
    for line in src_file:
        print(line, file=tgt1_file if 'findme' in line else tgt2_file, end='')

这在计算方面(可能更快,但尚未测试)和内存方面(因为不需要创建可能很大的中间列表)都更短、更清晰、更高效。

请注意,此处使用 print() 会使此代码实际上 运行 比原始方法慢一些。这可以通过恢复为 file.write():

轻松解决
with open('my.txt', 'r', errors='ignore') as src_file, \
        open('save.txt', 'a') as tgt1_file, \
        open('remaining.txt', 'a') as tgt2_file:
    for line in src_file:
        (tgt1_file if 'findme' in line else tgt2_file).write(line)