Python: сравните два больших файла - PullRequest
0 голосов
/ 07 июня 2018

Это следующий вопрос к Сравните два больших файла , на которые отвечает 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 голосов
/ 07 июня 2018

Если вы можете загрузить все в память, вы можете выполнить следующие операции над наборами:

union = set(alines).union(blines)
intersection = set(alines).intersection(blines)
unique = union - intersection

РЕДАКТИРОВАТЬ: Еще проще (и быстрее):

set(alines).symmetric_difference(blines)
0 голосов
/ 07 июня 2018

Предлагаю решение на основе панд.

import pandas as pd

1.Создайте два кадра данных панд

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.Сконцентрируйте оба кадра на один

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))
0 голосов
/ 07 июня 2018

edit : В этом ответе предполагается, что вы хотите сравнить соответствующие строки из двух файлов.Если это не то, что вы хотите, игнорируйте этот ответ.Я оставлю это здесь для будущих читателей.


Если вы просто хотите подсчитать количество строк, избегайте создания больших списков.Файлы являются итераторами с эффективным использованием памяти, и вашей задаче не требуется больше памяти, чем необходимо для просмотра двух строк одновременно.

Демонстрация (с двумя поддельными файлами)

>>> 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 и даст пары соответствующих строк издва файла.Кроме того, если один файл длиннее, вставляется значение заполнения float('nan'), которое всегда сравнивается с чем угодно (конечно, вы можете просто использовать любое другое фиктивное значение, например 0, но мне это нравится).

Вместо поддельных файлов просто используйте дескрипторы ваших фактически открытых файлов.

...