Python无法完全读取 "warc.gz"文件

标签 python gzip warc

在我的工作中,我抓取网站并将它们写入 gzip 压缩的网络存档(扩展名为“warc.gz”)。我使用 Python 2.7.11 和 warc 0.2.1 库。

我注意到对于大多数文件,我无法使用 warc-library 完全读取它们。例如,如果 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 中的自定义 gzip 处理,使用 warc.utils.FilePart 分割文件并阅读warc.warc.WARCReader整体损坏(使用 python 2.7.9、2.7.10 和 2.7.11 测试)。当它 receives no data instead of a new header 时它会停止。 .

看起来基本的 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()

关于Python无法完全读取 "warc.gz"文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36173786/

相关文章:

Java gzip - GZIPOutputStream 不任意关闭/压缩

python - 根据url从WARC文件中检索记录

python - 从 WARC.gz 文件中提取 header

python-2.7 - 用python打开warc文件

python - 在 PyQt4 中单击主屏幕上的按钮后如何打开子窗口

python - 在 python 中使用 csv.DictWriter 写入 csv 时添加列(带有值)

linux - 如何 gzip 文件同时将压缩内容打印到标准输出

unix - 如何将 xml 文件编码为 xfdl (base64-gzip)?

python - 如何使用kivy打印控制台输出

python - 指定文件名路径时出现问题