我希望在比较两个文件后显示不同的行数。想要在程序完成后显示为行数差异作为消息。
我的尝试:
with open(file2) as b:
blines = set(b)
with open(file1) as a:
with open(file3, 'w') as result:
for line in a:
if line not in blines:
result.write(line)
lines_to_write = []
with open(file2) as b:
blines = set(b)
with open(file1) as a:
lines_to_write = [l for l in a if l not in blines]
print('count of lines are in difference:', len(lines_to_write))
答案 0 :(得分:2)
如果您可以将所有内容加载到内存中,则可以在集上执行以下操作:
union = set(alines).union(blines)
intersection = set(alines).intersection(blines)
unique = union - intersection
编辑:更简单(更快)的是:
set(alines).symmetric_difference(blines)
答案 1 :(得分:1)
编辑:此答案假定您要比较两个文件中的相应行。如果那不是您想要的,请忽略此答案。我将这里留给未来的读者。
如果您只想计算行数,请避免创建大型列表。文件是内存有效的迭代器,并且您的任务不需要比一次查看两行所需的内存更多的内存。
演示(有两个假文件)
>>> fake_file_1 = '''1
... 2
... 3'''.splitlines()
>>>
>>> fake_file_2 = '''1
... 1
... 3
... 4'''.splitlines()
我假设你想要答案2
,因为第二行不同而fake_file_2
还有第四行。
>>> from itertools import zip_longest # izip_longest in Python2
>>> sum(1 for line1, line2 in zip_longest(fake_file_1, fake_file_2, fillvalue=float('nan'))
... if line1 != line2)
2
zip_longest
的工作方式与zip
类似,并会从两个文件中生成相应的行对。另外,如果一个文件较长,则插入fillvalue float('nan')
,它总是比较不等于任何东西(当然,你可以使用任何其他虚拟值,如0
,但我喜欢这样)。
只需使用实际打开文件的句柄,而不是假文件。
答案 2 :(得分:0)
我提出了一个基于熊猫的解决方案。
import pandas as pd
<强> 1。创建两个pandas数据帧
df1 = pd.read_csv(filepath_1)
df2 = pd.read_csv(filepath_2)
<强> 2。对于您的句子包含任何潜在分隔符的情况,请将所有列加入一个
df1 = df1.astype(str).apply(''.join)
df2 = df2.astype(str).apply(''.join)
第3。 Concat两个框架为一个
frames = [df1, df2]
df_merged = pd.concat(frames)
<强> 4。删除所有重复项的两个副本
df_unique = df_merged.drop_duplicates(keep = False)
<强> 5。计算和打印结果
print('count of lines are in difference:', len(df_unique))