Il modo corretto per caricare il testo unicode dal Python 2.7 è qualcosa di simile:Come decodificare unicode una riga alla volta in Python 2.7?
content = open('filename').read().decode('encoding'):
for line in content.splitlines():
process(line)
(Aggiornamento: No, non è vedere le risposte..)
Tuttavia, se il file è molto grande, potrei voler leggere, decodificare ed elaborare una riga alla volta, in modo che l'intero file non venga mai caricato in memoria in una sola volta. Qualcosa di simile:
for line in open('filename'):
process(line.decode('encoding'))
iterazione Il for
del ciclo sul filehandle aperto è un generatore che legge una riga alla volta.
Questo non funziona, però, perché se il file è codificato UTF-32, per esempio, i byte del file (in esadecimale) cerca qualcosa di simile:
hello\n = 68000000(h) 65000000(e) 6c000000(l) 6c000000(l) 6f000000(o) 0a000000(\n)
E la divisione in linee fatto da loop for
divide sulla 0a
byte del carattere \n
, con conseguente (in esadecimale):
lines[0] = 0x 68000000 65000000 6c000000 6c000000 6f000000 0a
lines[1] = 0x 000000
Così parte del carattere \n
è lasciato alla fine della linea 1, e le rimanenti tre byte finire in linea 2 (seguito da qualsiasi testo si trovi effettivamente nella riga 2.) Chiamando decode
su una di queste righe si ottiene comprensibilmente un UnicodeDecodeError
.
UnicodeDecodeError: 'utf32' codec can't decode byte 0x0a in position 24: truncated data
Così, abbastanza ovviamente, la suddivisione di un flusso di byte unicode su 0a
byte non è il modo corretto di dividerlo in linee. Dovrei invece dividere le occorrenze del carattere di nuova riga a quattro byte (0x0a000000). Tuttavia, penso che il modo corretto per rilevare questi caratteri sia quello di decodificare il flusso di byte in una stringa unicode e cercare i caratteri \n
- e questa decodifica dell'intero flusso è esattamente l'operazione che sto cercando di evitare.
Questo non può essere un requisito non comune. Qual è il modo corretto di gestirlo?
Hai provato a leggere il file utilizzando il metodo codecs.open()? –
@ Maulwurfn, non sapevo che esistesse! Ma lo faccio adesso. Grazie. –