2014-07-07 3 views
11

Devo leggere un file di testo in Python. La codifica del file è:UnicodeDecodeError in Python durante la lettura di un file, come ignorare l'errore e passare alla riga successiva?

file -bi test.csv 
text/plain; charset=us-ascii 

Questo file e di terze parti, e ottengo uno nuovo ogni giorno, quindi preferirei non cambiarlo. Il file ha caratteri non ascii, ad esempio Ö, ad esempio. Ho bisogno di leggere le righe usando python, e posso permettermi di ignorare una linea che ha un carattere non-ascii.

Il mio problema è che quando leggo il file in Python, ottengo l'errore UnicodeDecodeError quando raggiungo la linea in cui esiste un carattere non-ascii e non riesco a leggere il resto del file.

C'è un modo per evitare questo. Se provo questo:

fileHandle = codecs.open("test.csv", encoding='utf-8'); 
try: 
    for line in companiesFile: 
     print(line, end=""); 
except UnicodeDecodeError: 
    pass; 

poi, quando viene raggiunto l'errore del ciclo per fini e non riesco a leggere il restante del file. Voglio saltare la linea che causa l'errore e andare avanti. Preferirei non apportare alcuna modifica al file di input, se possibile.

C'è un modo per farlo? Grazie mille.

+0

Perché stai usando 'codecs.open()' in Python 3? 'open()' gestisce UTF-8 ** bene **. –

+0

Ho anche provato ad usare open, ricevo lo stesso errore – Chicoscience

+0

Sapete cosa sta veramente usando la codifica del file? Non è chiaramente 'us-ascii' come mostrato dall'output' file', poiché contiene caratteri non ascii. – dano

risposta

24

Il file non sembra utilizzare la codifica UTF-8. È importante utilizzare il codec corretto quando si apre un file.

È può dire open() come trattare gli errori di decodifica, con la parola chiave errors:

errori è una stringa opzionale che specifica come gli errori di codifica e decodifica devono essere gestiti, questo non può essere utilizzato in modalità binaria. Sono disponibili numerosi gestori di errori standard, sebbene sia valido anche qualsiasi nome di gestione degli errori registrato con codecs.register_error(). I nomi standard sono:

  • 'strict' per sollevare un'eccezione ValueError se c'è un errore di codifica. Il valore predefinito di None ha lo stesso effetto.
  • 'ignore' ignora gli errori. Nota che ignorare gli errori di codifica può portare alla perdita di dati.
  • 'replace' fa sì che un marker di sostituzione (come '?') Venga inserito in presenza di dati non validi.
  • 'surrogateescape' rappresenterà qualsiasi byte errato come punti di codice nell'area di utilizzo privato Unicode che va da U + DC80 a U + DCFF. Questi punti di codice privati ​​verranno quindi restituiti agli stessi byte quando viene utilizzato il gestore degli errori surrogateescape durante la scrittura dei dati. Questo è utile per l'elaborazione di file in una codifica sconosciuta.
  • 'xmlcharrefreplace' è supportato solo durante la scrittura su un file. I caratteri non supportati dalla codifica vengono sostituiti con il riferimento di carattere XML appropriato.
  • 'backslashreplace' (supportato anche solo durante la scrittura) sostituisce i caratteri non supportati con le sequenze di escape backslash di Python.

Aprendo il file con 'ignore' o 'replace' sarà quindi permetterà di leggere il file senza eccezioni essere sollevate.

+0

Ho provato a trovare una soluzione alternativa prendendo le stesse eccezioni di decodifica. Sfortunatamente sembra (almeno in Python 2) che la decodifica avvenga * prima che vengano rilevate le terminazioni di linea *, quindi non si ottengono risultati coerenti - si potrebbe perdere più di una riga, oppure si potrebbe rimanere appesi allo stesso buffer per sempre. –

+0

Questo NON funziona in python 2.x. –

+1

@AndrejGajduk: no, non lo è e non è mai stato pensato. La domanda riguarda Python 3. In Python 2 puoi * usare 'io.open()' comunque (che è fondamentalmente la stessa funzione). –