如何将文件中的差异写入 Python 中的新文件?
How to write differences in files to new file in Python?
作为一个更大项目的一部分,我需要根据匹配元素和不同元素创建文件。代码示例如下:
with open('TestFile1.csv', 'r') as file_1:
with open('TestFile2.csv', 'r') as file_2:
same = set(file_1).intersection(file_2)
different = set(file_1).difference(file_2)
same.discard('\n')
with open('output_file_same.txt', 'w') as file_out_1:
for line in same:
file_out_1.write(line)
with open('output_file_different.txt', 'w') as file_out_2:
for line in different:
file_out_2.write(line)
比较相同的行并将其写入文件的行运行良好,但是应该return具有不同行的文件的代码return是一个空白文件。它应该 return 一个包含不同行的文件。有什么建议吗?
file_1
和 file_2
是文件对象,这意味着它们是 迭代器;迭代器只能迭代一次,之后尝试再次迭代它时什么也读不到。所以当你这样做时:
same = set(file_1).intersection(file_2)
它清空 file_1
和 file_2
,所以:
different = set(file_1).difference(file_2)
的行为与 set([]).difference([])
大致相同。要修复,请确保预先将数据吞噬一次,然后重新使用它,例如:
with open('TestFile1.csv', 'r') as file_1, open('TestFile2.csv', 'r') as file_2:
file_1 = set(file_1) # slurp to reusable set
file_2 = set(file_2) # slurp to reusable set
# Can be done outside the with block, since files no longer needed
same = file_1.intersection(file_2) # Or: same = file_1 & file_2
different = file_1.difference(file_2) # Or: different = file_1 - file_2
旁注:您不需要显式循环来写出结果;
for line in same:
file_out_1.write(line)
可以简化为:
file_out_1.writelines(same)
运行速度更快,也更简单。
作为一个更大项目的一部分,我需要根据匹配元素和不同元素创建文件。代码示例如下:
with open('TestFile1.csv', 'r') as file_1:
with open('TestFile2.csv', 'r') as file_2:
same = set(file_1).intersection(file_2)
different = set(file_1).difference(file_2)
same.discard('\n')
with open('output_file_same.txt', 'w') as file_out_1:
for line in same:
file_out_1.write(line)
with open('output_file_different.txt', 'w') as file_out_2:
for line in different:
file_out_2.write(line)
比较相同的行并将其写入文件的行运行良好,但是应该return具有不同行的文件的代码return是一个空白文件。它应该 return 一个包含不同行的文件。有什么建议吗?
file_1
和 file_2
是文件对象,这意味着它们是 迭代器;迭代器只能迭代一次,之后尝试再次迭代它时什么也读不到。所以当你这样做时:
same = set(file_1).intersection(file_2)
它清空 file_1
和 file_2
,所以:
different = set(file_1).difference(file_2)
的行为与 set([]).difference([])
大致相同。要修复,请确保预先将数据吞噬一次,然后重新使用它,例如:
with open('TestFile1.csv', 'r') as file_1, open('TestFile2.csv', 'r') as file_2:
file_1 = set(file_1) # slurp to reusable set
file_2 = set(file_2) # slurp to reusable set
# Can be done outside the with block, since files no longer needed
same = file_1.intersection(file_2) # Or: same = file_1 & file_2
different = file_1.difference(file_2) # Or: different = file_1 - file_2
旁注:您不需要显式循环来写出结果;
for line in same:
file_out_1.write(line)
可以简化为:
file_out_1.writelines(same)
运行速度更快,也更简单。