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