Python 无法完全读取 "warc.gz" 文件
Python cannot read "warc.gz" file completely
对于我的工作,我抓取网站并将它们写入 gzip 网络存档(扩展名为 "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 库本身中得到解决。
似乎 warc.gzip2.GzipFile
, file splitting with warc.utils.FilePart
and reading in warc.warc.WARCReader
is broken as a whole (tested with python 2.7.9, 2.7.10 and 2.7.11). It stops short when it receives no data instead of a new header 中的自定义 gzip
处理。
基本的 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()
对于我的工作,我抓取网站并将它们写入 gzip 网络存档(扩展名为 "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 库本身中得到解决。
似乎 warc.gzip2.GzipFile
, file splitting with warc.utils.FilePart
and reading in warc.warc.WARCReader
is broken as a whole (tested with python 2.7.9, 2.7.10 and 2.7.11). It stops short when it receives no data instead of a new header 中的自定义 gzip
处理。
基本的 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()