2015-11-18 12 views
8

Sto cercando di leggere un file CSV con Python con il seguente codice:Reading UTF-8 con BOM utilizzando il modulo Python CSV provoca caratteri extra indesiderati

with open("example.txt") as f: 
    c = csv.reader(f) 
    for row in c: 
     print row 

mio example.txt ha solo il seguente contenuto:

 
Hello world! 

Per i file ANSI codificati UTF-8 o, questo mi dà i risultati attesi:

> ["Hello world!"] 

Ma se salvare il file come UTF-8 con BOM ottengo questo output:

> ["\xef\xbb\xbfHello world!"] 

Dal momento che non ho alcun controllo su ciò che i file che l'utente utilizzerà come input, vorrei che questo lavorare con BOM anche. Come posso risolvere questo problema? C'è qualcosa che devo fare per assicurarmi che funzioni anche per altre codifiche?

+1

NB: qualunque sia la soluzione che si utilizza, l'importante è utilizzare 'utf-8-sig' per la decodifica. – ekhumoro

+0

'importazione CSV, csvkit, codec, unicodecsv con aperta ("example.txt", 'r') come f: c = csv.reader (f) per la riga in c: stampa [unicode (s, "utf-8") per s nella riga] con aperto ("example.txt", 'r') come f: c = unicodecsv.reader (f) per riga c: riga di stampa con apri ("example.txt", "r") come f: c = csvkit.reader (f) per riga in c: riga di stampa 'tutte le stampe' [u '\ uffffCiao mondo!'] 'così mi piace non è ** duplicato ** - il primo tentativo utilizza http://stackoverflow.com/questions/17245415/read-and-write-csv-files-in cluding-unicode-with-python-2-7 – SIslam

+0

@ekhumoro: Il duplicato è una linea di confine ... L'altra domanda riguarda i dati UTF-8 mentre questa è specificamente sulla BOM nel file utf8. L'altra pagina parla solo (in una sola risposta) di BOM per i file UTF-16. Il tuo commento risponde a questa domanda ma IMHO meriterebbe di essere una risposta a una domanda non duplicata :-) –

risposta

2

Si potrebbe fare uso del modulo unicodecsv Python come segue:

import unicodecsv 

with open('input.csv', 'rb') as f_input: 
    csv_reader = unicodecsv.reader(f_input, encoding='utf-8-sig') 
    print list(csv_reader) 

Così, per un file di input che contiene quanto segue in UTF-8 con BOM:

c1,c2,c3,c4,c5,c6,c7,c8 
1,2,3,4,5,6,7,8 

Si visualizzerà il seguente :

[[u'c1', u'c2', u'c3', u'c4', u'c5', u'c6', u'c7', u'c8'], [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8']] 
+0

ma che dire '\ ufeff'? non è inutile? – SIslam

+2

In effetti, inserirò la codifica errata, come dichiarato 'utf-8-sig' dovrebbe essere usato. –