Python 2.7 filecmp.cmp возвращает false, даже если сжатые файлы идентичны

Я сравниваю кучу файлов fastq.gz. Каждый файл ~4G:

if filecmp.cmp(f1,f2,shallow=False)

Возвращает false, так как у f1 и f2 разные. Но когда я сравниваю файлы, используя diff/comm, я получаю 0 вывод (я распаковываю и сравниваю). Я попробовал оба мелкие =True и False. Я пытаюсь распечатать разницу, но памяти не хватает.

diff=difflib.ndiff((gzip.open(f1)).readlines(),(gzip.open(f2)).readlines())
print [i for i in diff if i.startswith('+')]

Это потому что файлы разархивированы? какие-нибудь идеи о том, как сравнить их, не расстегивая молнию? (каждый файл - 200M строк)

Спасибо!

1 ответ

Решение

В общем, вам нужно сравнить несжатый вывод. Это единственный способ окончательно определить, имеют ли два файла gzip одинаковое несжатое содержимое. Они могли быть сжаты с разными уровнями сжатия или с помощью другого программного обеспечения gzip, что давало разные сжатые результаты. Единственная гарантия состоит в том, что когда вы сжимаете, а затем распаковываете, вы получаете исходный ввод. Нет никакой гарантии, что когда вы распаковываете, а затем сжимаете, вы получаете исходный ввод.

Если вы контролируете процесс gzip, используя тот же код и те же уровни сжатия и другие параметры, вы все равно можете получить другой вывод из-за содержимого заголовка. Заголовки могут иметь разные метки времени, разные имена файлов или другие варианты. В этом случае вы можете пропустить заголовки для каждого (используя RFC 1952 как руководство к концу заголовков) и сравнить оставшуюся часть каждого. Учитывая заявленные условия, остатки двух файлов будут идентичны.

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

Другие вопросы по тегам