对于我的工作,我会刮擦网站并将其写入压缩的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/

10-12 22:09