比较两个文件并将缺失值写入文件

3 投票
6 回答
4582 浏览
提问于 2025-04-17 07:21

我在比较两个大文件的时候遇到了问题。我想做的是从一个文件中取出一行,然后在另一个文件中查找是否有匹配的行。如果没有找到匹配的行,就把这一行写入到另一个文件中。我用下面这个简单的例子重现了这个问题:

file1.txt(内容)

apple
banana
pear
peach
lime

file_old.txt(内容)

lime
apple
pear
peach

因为我想找出file1中不在file_old里的行,所以我本来期待输出文件中只会显示'banana'这个值。但是在输出文件"*fill_diff*"中,我却看到了:

apple
banana
banana

我的代码有什么问题,导致无法正确生成文件中的差异呢?

def main():

    file_old = open(r'C:\Users\test\Desktop\file_old.txt', 'r+')
    file_new = open(r'C:\Users\test\Desktop\file1.txt', 'r+')
    file_diff = open(r'C:\Users\test\Desktop\file_diff.txt', 'w')

    for each_line in file_new: 
        for every_line in file_old:
            if each_line == every_line:
                break
            file_diff.write(each_line)

    file_old.close()
    file_new.close()
    file_diff.close()

main()

谢谢!

6 个回答

1

你需要在每次循环开始时,回到file_old的开头。可以这样做:

for each_line in file_new:
    file_old.seek(0)
    for every_line in file_old:
        ...

另外,你最里面的循环逻辑好像不太对。我觉得你想要的是这样的:

for each_line in file_new:
    file_old.seek(0)
    found = False
    for every_line in file_old:
        if each_line == every_line:
            found = True
            break

    if not found:
        file_diff.write(each_line)
2

你可以通过先对两个文件进行排序,然后同时遍历这两个文件,来实现这个操作,时间复杂度是O(n + n*log(n))。

# sort file1 and file2 on disk or in memory
while len(file1) > 0 and len(file2) > 0:
    while file1[0] < file2[0]:
        diff.append(file1[0])
        file1 = file1[1:]
    while file1[0] > file2[0]:
        diff.append(file2[0])
        file2 = file2[1:]
    while file1[0] == file2[0]:
        file1 = file1[1:]
        file2 = file2[1:]
diff = diff + file1 + file2 # add the rest to the diff
4

srgerg的回答是可行的。

不过,多次读取文件会导致运行时间变得很长。如果这些文件虽然大,但足够小,可以放进内存里,那么你可以考虑把file_old里的所有行放到一个数据结构里,方便进行比较:

old_lines = set((line.strip() for line in open(r'C:\Users\test\Desktop\file_old.txt', 'r+')))
file_new = open(r'C:\Users\test\Desktop\file1.txt', 'r+')
file_diff = open(r'C:\Users\test\Desktop\file_diff.txt', 'w')

for line in file_new:
    if line.strip() not in old_lines:
        file_diff.write(line)
file_new.close()
file_diff.close()

希望这对你有帮助。

撰写回答