warc.open()
是 的简写warc.WARCFile()
,并且warc.WARCFile()
可以接收一个fileobj
参数,其中sys.stdin
是一个文件对象。所以你需要做的只是这样的事情:
import sys
import warc
f = warc.open(fileobj=sys.stdin)
for record in f:
print record['WARC-Target-URI'], record['Content-Length']
但是当您的输入文件为 时,在 hadoop 流下事情有点困难,因为 hadoop 会将WARC 文件中的.gz
所有内容替换为,这将破坏 WARC 格式(参考这个问题:hadoop converting \r\n to \n and broken ARC格式)。由于包使用正则表达式来匹配标头(完全匹配),您可能会收到此错误:\r\n
\n
warc
"WARC/(\d+.\d+)\r\n"
\r\n
IOError: Bad version line: 'WARC/1.0\n'
因此,您将PipeMapper.java
按照参考问题中的建议修改文件,或者编写自己的解析脚本,逐行解析 WARC 文件。
顺便说一句,简单地修改warc.py
要使用\n
的而不是\r\n
匹配的标头是行不通的,因为它读取的内容与 的长度完全相同Content-Length
,并且在此之后需要两个空行。因此,hadoop 所做的肯定会使内容的长度与属性不匹配,Content-Length
从而导致另一个错误,例如:
IOError: Expected '\n', found 'abc\n'