2017-06-22 77 views
0

我想有这样的电话:读取压缩标准输入

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建议后出现。

+0

您是否试图转储一些'f.readline()'结果来查看您的解压缩流是什么样的? – 9000

回答

0

使用gzip.open(sys.stdin.buffer, 'rt')修复问题为Python 3

2

在蟒蛇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: 
+0

'TypeError:强制为Unicode:需要字符串或缓冲区,找到文件'。当stdin已经打开时,它并不让我感到惊讶。 – pt12lol

+0

好的,我尝试了Python 3的'gzip.open',它实际上改变了一个错误。目前我有一个涉及编码的问题:'UnicodeDecodeError:'utf-8'编解码器无法解码位置1中的字节0x8b:无效的起始字节。你还能帮忙吗? – pt12lol

+0

该问题已更新。 – pt12lol