比较两个文件并将缺失值写入文件
我在比较两个大文件的时候遇到了问题。我想做的是从一个文件中取出一行,然后在另一个文件中查找是否有匹配的行。如果没有找到匹配的行,就把这一行写入到另一个文件中。我用下面这个简单的例子重现了这个问题:
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()
希望这对你有帮助。