Python не может полностью прочитать файл "warc.gz"

Для своей работы я очищаю веб-сайты и записываю их в сжатые веб-архивы (с расширением "warc.gz"). Я использую Python 2.7.11 и библиотеку warc 0.2.1.

Я заметил, что для большинства файлов я не могу прочитать их полностью с помощью библиотеки warc. Например, если файл warc.gz содержит 517 записей, я могу прочитать только около 200 из них.

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

Я обнаружил, что у некоторых людей также есть эта проблема ( https://github.com/internetarchive/warc/issues/21), хотя решения для нее не найдено.

Я предполагаю, что в Python 2.7.11 может быть ошибка в "gzip". Может быть, кто-то имеет опыт с этим, и знает, что можно сделать с этой проблемой?

Заранее спасибо!

Пример:

Я создаю новые файлы warc.gz, как это:

import warc
warc_path = "\\some_path\file_name.warc.gz"
warc_file = warc.open(warc_path, "wb")

Для записи записей я использую:

record = warc.WARCRecord(payload=value, headers=headers)
warc_file.write_record(record)

Это создает идеальные файлы "warc.gz". С ними проблем нет. Все, включая "\ r \ n", правильно. Но проблема начинается, когда я читаю эти файлы.

Для чтения файлов я использую:

warc_file = warc.open(warc_path, "rb")

Для просмотра записей я использую:

for record in warc_file:
    ...

Проблема в том, что не все записи были найдены во время этого цикла для файла "warc.gz", в то время как все они были найдены для файлов "warc". Работа с обоими типами файлов рассматривается в самой библиотеке warc.

1 ответ

Решение

Кажется, что обычай gzip обработка в warc.gzip2.GzipFile, расщепление файла с warc.utils.FilePart и читать в warc.warc.WARCReader сломан в целом (протестировано с python 2.7.9, 2.7.10 и 2.7.11). Он останавливается, когда не получает данных вместо нового заголовка.

Казалось бы, основной stdlib gzip обрабатывает сгенерированные файлы очень хорошо, так что это должно работать также:

import gzip
import warc

with gzip.open('my_test_file.warc.gz', mode='rb') as gzf:
    for record in warc.WARCFile(fileobj=gzf):
        print record.payload.read()
Другие вопросы по тегам