读取压缩标准输入
问题描述:
我想有这样的电话:读取压缩标准输入
pv -ptebar compressed.csv.gz | python my_script.py
里面my_script.py
我想解压compressed.csv.gz
和使用Python CSV解析器解析它。我希望这样的事情:
import csv
import gzip
import sys
with gzip.open(fileobj=sys.stdin, mode='rt') as f:
reader = csv.reader(f)
print(next(reader))
print(next(reader))
print(next(reader))
当然它不会因为gzip.open
工作没有fileobj
说法。你能提供一些解决这个问题的实例吗?
UPDATE
Traceback (most recent call last):
File "my_script.py", line 8, in <module>
print(next(reader))
File "/usr/lib/python3.5/gzip.py", line 287, in read1
return self._buffer.read1(size)
File "/usr/lib/python3.5/_compression.py", line 68, in readinto
data = self.read(len(byte_view))
File "/usr/lib/python3.5/gzip.py", line 461, in read
if not self._read_gzip_header():
File "/usr/lib/python3.5/gzip.py", line 404, in _read_gzip_header
magic = self._fp.read(2)
File "/usr/lib/python3.5/gzip.py", line 91, in read
self.file.read(size-self._length+read)
File "/usr/lib/python3.5/codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
回溯上述申请@Rawing建议后出现。
答
使用gzip.open(sys.stdin.buffer, 'rt')
修复问题为Python 3
答
在蟒蛇3.3+,你可以把一个文件对象gzip.open
:
The filename argument can be an actual filename (a str or bytes object), or an existing file object to read from or write to.
所以,你的代码应该工作,如果你只是省略fileobj=
:
with gzip.open(sys.stdin, mode='rt') as f:
或者,会更有效解决方案:
with gzip.open(sys.stdin.buffer, mode='rb') as f:
如果由于某种奇怪的原因,您使用的是比3.3更早的python,则可以直接调用gzip.GzipFile
constructor。然而,gzip
模块的这些老版本没有以文本方式打开文件的支持,所以我们将使用sys.stdin
的,而不是潜在的缓冲区:
with gzip.GzipFile(fileobj=sys.stdin.buffer) as f:
您是否试图转储一些'f.readline()'结果来查看您的解压缩流是什么样的? – 9000