2009-12-10 13 views
23

Sto cercando di leggere un file gunzipped (.gz) in python e sto avendo qualche problema.Lettura di utf-8 caratteri da un file gzip in python

Ho usato il modulo gzip per leggerlo ma il file è codificato come un file di testo utf-8 così alla fine legge un carattere non valido e si blocca.

Qualcuno sa leggere i file gzip codificati come file utf-8? So che c'è un modulo di codec che può aiutare ma non riesco a capire come usarlo.

Grazie!

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

Puoi pubblicare il codice che hai finora? –

+0

Puoi convertire il file utf-8 in ASCII e poi provare a decomprimerlo? hmm .... – whatsisname

risposta

17

Non vedo perché questo dovrebbe essere così difficile.

Cosa stai facendo esattamente? Per favore spiega "alla fine legge un carattere non valido".

Dovrebbe essere semplice come:

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 

a cura

Questa risposta funziona per Python2 in Python3, vedere la risposta @SeppoEnarvi 's a https://stackoverflow.com/a/19794943/610569 (si utilizza la modalità rt per gzip.open.

+0

+1 ... Questa è la più lucida e meno complicata delle 3 risposte finora. –

+1

Non necessariamente il meno complicato, in quanto devi decodificare ogni riga che leggi. Nell'implementazione del getreader, ciò avviene automaticamente, quindi ogni riga è Unicode – SecurityJoe

+0

Sebbene sia una soluzione piacevole, ho la sensazione che questa soluzione non si adatti bene ai file di grandi dimensioni. –

20

Forse

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

Come one-liner: per la riga in codecs.getreader ('utf-8') (gzip.open (fname), errors = 'replace') che aggiunge anche il controllo sulla gestione degli errori – SecurityJoe

0

Nella forma divinatorio (2.5 o superiore)

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

questo è possibile in Python 3.3:

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

noti che gzip.open() richiede di specificare esplicitamente modalità testo ('t').

4

Le tonnellate di errori di decodifica sopra riportati. Ho usato questo:

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