簡體   English   中英

讀取壓縮的標准輸入

[英]Read compressed stdin

我想打這樣的電話:

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參數。 您能否提供一些可行的示例來解決此問題?

更新

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建議后出現的。

在python 3.3+中,您可以將文件對象傳遞給gzip.open

filename參數可以是實際的文件名(str或bytes對象),也可以是要讀取或寫入的現有文件對象。

因此,如果您僅省略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構造函數 但是,這些舊版本的gzip模塊不支持以文本模式打開的文件,因此我們將使用sys.stdin的基礎緩沖區:

with gzip.GzipFile(fileobj=sys.stdin.buffer) as f:

使用gzip.open(sys.stdin.buffer, 'rt')修復了Python 3的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM