Подтвердить что ты не робот

Чтение utf-8 символов из файла gzip в python

Я пытаюсь прочитать файл с gunzipped (.gz) в python и имею некоторые проблемы.

Я использовал модуль gzip для его чтения, но файл был закодирован как текстовый файл utf-8, поэтому в итоге он считывает недопустимый символ и сбой.

Кто-нибудь знает, как читать файлы gzip, закодированные как файлы utf-8? Я знаю, что есть модуль кодеков, который может помочь, но я не могу понять, как его использовать.

Спасибо!

import string
import gzip
import codecs

f = gzip.open('file.gz','r')

engines = {}
line = f.readline()
while line:
    parsed = string.split(line, u'\u0001')

    #do some things...

    line = f.readline()
for en in engines:
  print(en)
4b9b3361

Ответ 1

Я не понимаю, почему это должно быть так сложно.

Чем вы занимаетесь? Пожалуйста, объясните, "в конце концов он читает недопустимый символ".

Это должно быть просто:

import gzip
fp = gzip.open('foo.gz')
contents = fp.read() # contents now has the uncompressed bytes of foo.gz
fp.close()
u_str = contents.decode('utf-8') # u_str is now a unicode string

EDITED

Этот ответ работает на Python2 в Python3, см. ответ @SeppoEnarvi на fooobar.com/questions/231820/... (он использует режим rt для gzip.open.

Ответ 2

Это возможно в Python 3.3:

import gzip
gzip.open('file.gz', 'rt', encoding='utf-8')

Обратите внимание, что gzip.open() требует явно указать текстовый режим ('t').

Ответ 3

Может

import codecs
zf = gzip.open(fname, 'rb')
reader = codecs.getreader("utf-8")
contents = reader( zf )
for line in contents:
    pass

Ответ 4

Вышеописанные тонны ошибок декодирования. Я использовал это:

for line in io.TextIOWrapper(io.BufferedReader(gzip.open(filePath)), encoding='utf8', errors='ignore'):
    ...

Ответ 5

В питонической форме (2,5 или выше)

from __future__ import with_statement # for 2.5, does nothing in 2.6
from gzip import open as gzopen

with gzopen('foo.gz') as gzfile:
    for line in gzfile:
      print line.decode('utf-8')