2016-03-23 12 views
1

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

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

После некоторых исследований выяснилось, что эта проблема возникает только с gzipped-файлами. Файлы с расширением «warc» не имеют этой проблемы.

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

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

Заранее благодарен!

Пример:

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

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

Писать записи я использую:

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

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

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

Переберите записи я использую:

for record in warc_file: 
    ... 

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

+1

Пожалуйста, добавьте [MCVE] (http://stackoverflow.com/help/mcve) , минимальный, полный и проверяемый пример. Даже связанная с этим проблема в github довольно расплывчата. –

+0

Ilja, библиотека warc очень маленькая, в действительности нет особого кода. Чтобы создать файл warc.gz, я использую 'self.warc_file = warc.open (self.warc_path," wb ")'. Для записи записей я использую 'record = warc.WARCRecord (payload = value, headers = headers)'. Для чтения записей я использую 'self.warc_file = warc.open (self.warc_path," rb ")' и 'для записи в self.warc_file:'. Проблема в том, что не все записи найдены. –

+0

Я могу приложить пример файла warc.gz, я узнал, как его прикрепить здесь ... –

ответ

4

Кажется, что обычай gzip обработки в warc.gzip2.GzipFile, разбиения файлов с warc.utils.FilePart и чтения в warc.warc.WARCReader сломана в целом (протестировано с питоном 2.7.9, 2.7.10 и 2.7.11). Он останавливается, когда он receives no data instead of a new header.

Казалось бы, что основной STDLIB gzip обрабатывает catenated файлы просто отлично, и так это должно работать так:

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

Спасибо! :) Я реализовал аналогичную работу. Вопрос в основном, если это ошибка в gzip-библиотеке. Должна ли быть сообщена команде разработчиков Python? –

+0

Как ваш собственный обходной ход и мое шоу, stdlib 'gzip' отлично работает. Я уверен, что проблема лежит в пользовательской библиотеке 'warc.gzip2'. Он не работал с 3 различными версиями python 2.7 для меня. –

 Смежные вопросы

  • Нет связанных вопросов^_^