Python:比较两个大文件

时间:2018-06-07 07:39:26

标签: python large-data large-files

这是Compare two large files

回答phihag的后续问题

我希望在比较两个文件后显示不同的行数。想要在程序完成后显示为行数差异作为消息。

我的尝试

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))

3 个答案:

答案 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))