Python 无法完全读取“warc.gz”文件
Posted
技术标签:
【中文标题】Python 无法完全读取“warc.gz”文件【英文标题】:Python cannot read "warc.gz" file completely 【发布时间】:2016-03-23 09:05:58 【问题描述】:对于我的工作,我抓取网站并将它们写入 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-library 本身解决了使用这两种类型的文件。
【问题讨论】:
请添加MCVE,这是一个最小、完整且可验证的示例。甚至github中的链接问题也很模糊。 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")
和for record in self.warc_file:
。问题是没有找到所有记录。
我可以附上一个示例 warc.gz 文件,我知道如何在此处附上它...
请将代码示例添加到您的问题中,以使它们更容易找到(无论如何这就是它们所属的地方)。使示例最小化,但从某种意义上说是完整的,因为它们很容易显示您想要发生的事情和实际发生的事情。一个可以重现您观察到的行为的小型示例数据集也将使人们更容易回答。
Ilja,以上是代码示例。没有更多相关的代码示例。
【参考方案1】:
似乎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()
【讨论】:
谢谢! :) 我已经实施了类似的解决方法。问题主要是它是否是 gzip-library 中的错误。是否要向 Python 开发团队报告? 作为您自己的解决方法和我的展示,stdlibgzip
工作正常。我很确定问题出在自定义 warc.gzip2
库中。它不适用于我的 3 个不同的 python 2.7 版本。以上是关于Python 无法完全读取“warc.gz”文件的主要内容,如果未能解决你的问题,请参考以下文章