Python: читать gzip из stdin - PullRequest
       20

Python: читать gzip из stdin

0 голосов
/ 11 ноября 2018

Как читать построчно содержимое gzipped из stdin?


У меня есть файл gzip a.gz в текущем каталоге с содержимым UTF-8.

Сценарий 1:

Использование gzip.open(filename) работает. Я могу напечатать распакованные строки.

with gzip.open('a.gz', 'rt') as f:
    for line in f:
        print(line)

# python3 my_script.py

Сценарий 2:

Я хочу читать сжатый контент со стандартного ввода. Таким образом, я cat GZIP-файл в качестве входных данных для сценария ниже.

with gzip.open(sys.stdin, mode='rt') as f:
    for line in f:
        print(line)

# cat a.gz | python3 script.py

Но для подхода 2 я получаю ошибку ниже:

Traceback (most recent call last):
  File "script.py", line 71, in <module>
    for line in f:
  File "....../python3.6/gzip.py", line 289, in read1
    return self._buffer.read1(size)
  File "....../python3.6/_compression.py", line 68, in readinto
    data = self.read(len(byte_view))
  File "....../python3.6/gzip.py", line 463, in read
    if not self._read_gzip_header():
  File "....../python3.6/gzip.py", line 406, in _read_gzip_header
    magic = self._fp.read(2)
  File "....../python3.6/gzip.py", line 91, in read
    self.file.read(size-self._length+read)
  File "....../python3.6/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

1 Ответ

0 голосов
/ 11 ноября 2018

Вы хотите открыть sys.stdin.buffer, а не sys.stdin, потому что последний прозрачно декодирует байты в строки. Это работает для меня:

with gzip.open(sys.stdin.buffer, mode='rt') as f:
    for line in f:
        print(line)
...