33 Stimmen

Lesen von utf-8-Zeichen aus einer gzip-Datei in Python

Ich versuche, eine gunzipped Datei (.gz) in Python zu lesen und habe einige Probleme.

Ich habe das gzip-Modul verwendet, um sie zu lesen, aber die Datei ist als utf-8-Textdatei kodiert, so dass sie schließlich ein ungültiges Zeichen liest und abstürzt.

Weiß jemand, wie man gzip-Dateien lesen kann, die als utf-8-Dateien kodiert sind? Ich weiß, dass es ein Codecs-Modul gibt, das helfen kann, aber ich verstehe nicht, wie man es benutzt.

Danke!

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)

0 Stimmen

Können Sie den Code, den Sie bisher haben, veröffentlichen?

0 Stimmen

Können Sie die utf-8-Datei in ascii konvertieren und dann versuchen, sie zu dekomprimieren? hmm....

0 Stimmen

Wenn Sie einen UnicodeDecodeError erhalten, lesen Sie diesen verwandten Beitrag, der die Verwendung des open('errors')-Parameters zeigt und eine Warnung bei der Verwendung der ISO-8859-1 (latin-1)-Kodierung aufführt: stackoverflow.com/questions/35028683/

56voto

Seppo Enarvi Punkte 2830

Dies ist seit Python 3.3 möglich:

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

Beachten Sie, dass Sie bei gzip.open() den Textmodus ('t') explizit angeben müssen.

24voto

sjbrown Punkte 542

Ich wüsste nicht, warum das so schwer sein sollte.

Was machen Sie genau? Erläutern Sie bitte, dass "eventuell ein ungültiges Zeichen gelesen wird".

Es sollte so einfach sein wie:

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

BEARBEITET

Diese Antwort gilt für Python2 in Python3 siehe @SeppoEnarvi 's Antwort unter https://stackoverflow.com/a/19794943/610569 (es verwendet die rt Modus für gzip.open .

21voto

Jochen Ritzel Punkte 99416

Vielleicht

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

7voto

Yuri Astrakhan Punkte 7318

Dies führte zu einer Vielzahl von Dekodierungsfehlern. Ich habe dies verwendet:

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

0voto

Douglas Mayle Punkte 19645

In pythonischer Form (2,5 oder höher)

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')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X