对于我的工作,我会刮擦网站并将其写入压缩的Web归档文件(扩展名为“ warc.gz”)。我使用Python 2.7.11和warc 0.2.1库。
我注意到对于大多数文件,我无法使用warc库完全读取它们。例如,如果warc.gz文件具有517条记录,那么我只能读取其中的200条记录。
经过一些研究,我发现此问题仅在压缩文件中发生。扩展名为“ 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库本身中介绍了处理两种类型的文件的问题。
最佳答案
看来,gzip
中的自定义warc.gzip2.GzipFile
处理,使用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 - Python无法完全读取“warc.gz”文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36173786/