如何根据其他文件的内容删除txt文件中的行,Python3

how to delete lines in txt file, according to other files' content, Python3

我有两个 txt 文件(file_srs.txt 和 file_rm.txt)

这两个文件的内容是:

# content of file_srs.txt, note \n is a newline symbol
APPLE\n
PEAR\n
ORANGE\n
BANANA\n
MELON\n

# content of file_rm.txt
PEAR\n
BANANA\n 

我想根据file_rm.txt中的内容删除file_srs.txt中的内容。所以在这个例子中,我想删除 file_srs.txt 中的 'PEAR\n' 和 'BANANA\n',结果文件是:

# resulting content in file_srs.txt
APPLE\n
ORANGE\n
MELON\n

在实际情况下,file_srs.txt可以有几百个名字,file_rm.txt可以有几十个名字。所以高效的方法是必要的。

谢谢。

如果你想要最高效的速度解决方案并且你不介意会有浪费space,你可以覆盖要删除的单词行(包括换行符)例如 spaces.

但是,如果你不想浪费space,你必须覆盖整个文件,即你必须将file_srs.txt的内容加载到内存中,删除所有单词file_rm.txt 然后你必须用内存中的新内容覆盖 file_srs.txt,即 file_srs.txt 没有 file_rm.txt.

中的单词

您首先应该阅读原文中的行 original.read().splitlines() 并将此列表分配给一个变量。请注意,这与 original.readlines() 不同,因为文件包含:

APPLE
PEAR
ORANGE
BANANA
MELON

original.read().splitlines() returns ['APPLE', 'PEAR', 'ORANGE', 'BANANA', 'MELON']

然而,

original.readlines() returns ['APPLE\n', 'PEAR\n', 'ORANGE\n', 'BANANA\n', 'MELON']

使用实际的行字符串比使用包含 \n 的行字符串更容易,因为它更容易比较;在将它与 'BANANA'.

进行比较之前,无需检查(例如)'BANANA\n' 是否具有 \n

然后用同样的方法读入第二个文件的数据。使用这两个列表,您可以创建一个新列表(如果您想要处理您希望稍后保留的行)或直接写入一个新文件:

假设 all_lines= ['APPLE', 'PEAR', 'ORANGE', 'BANANA', 'MELON']

lines_delete = ['PEAR', 'BANANA']

lines_to_keep = []
        for line in all_lines:
            if line not in lines_delete:
                lines_to_keep.append(line)

然后这些行可以写入一个新的(或相同的)文件:

with open("new.txt","w") as new:
    for line in lines_to_keep:
        line = line+"\n"
        new.write(line)

示例程序:

with open("original.txt","r") as original:
    all_lines = original.read().splitlines()

    with open("delete.txt","r") as delete:
        lines_delete = delete.read().splitlines()
        print(lines_delete)
        lines_to_keep = []
        for line in all_lines:
            if line not in lines_delete:
                lines_to_keep.append(line)

with open("new.txt","w") as new:
    for line in lines_to_keep:
        line = line+"\n"
        new.write(line)