2010-03-01 6 views
11

Angenommen, ich lese eine Datei mit 3 durch Komma getrennten Zahlen. Die Datei wurde mit einer unbekannten Kodierung gespeichert, bisher habe ich es mit ANSI und UTF-8 zu tun. Wenn die Datei in UTF-8 war und es hatte 1 Zeile mit Werten 115,113,12 dann:Umgang mit UTF-8-Nummern in Python

with open(file) as f: 
    a,b,c=map(int,f.readline().split(',')) 

würde dies werfen:

invalid literal for int() with base 10: '\xef\xbb\xbf115' 

Die erste Zahl mit diesem immer verstümmelt ist ‚\ XeF \ xbb \ xbf 'Zeichen. Für den Rest 2 Nummern funktioniert die Konvertierung einwandfrei. Wenn ich '\ xef \ xbb \ xbf' manuell durch '' ersetze und dann die int-Konvertierung vornimmt, funktioniert es.

Gibt es eine bessere Möglichkeit, dies für jede Art von codierter Datei zu tun?

Antwort

17
import codecs 

with codecs.open(file, "r", "utf-8-sig") as f: 
    a, b, c= map(int, f.readline().split(",")) 

Dies funktioniert in Python 2.6.4. Der Aufruf codecs.open öffnet die Datei und gibt Daten als Unicode zurück, dekodiert aus UTF-8 und ignoriert die ursprüngliche Stückliste.

+0

Danke. Dies funktioniert bei meinen UTF-8-Dateien, scheitert jedoch beim Unicode- und Unicode-Big-Endian. Gibt es eine idiotensichere Möglichkeit, jede Art von verschlüsselter Datei zu öffnen und diese Zahlen zu erhalten, oder müsste ich die Codierung explizit angeben? –

+0

AFAIK müssen Sie die Codierung angeben. Offensichtlich können Sie eine kleine Funktion schreiben, die die drei Tests durchführt und eine entsprechend decodierte Datei zurückgibt. – tzot

+0

Großartig. Ich fand das chardet-Modul, das genau das tut http://chardet.feedparser.org/ –

13

Was Sie sehen, ist eine UTF-8 codiert BOM oder "Byte Order Mark". Die Stückliste wird normalerweise nicht für UTF-8-Dateien verwendet. Daher besteht die beste Möglichkeit darin, die Datei mit einem UTF-8-Codec zu öffnen und das Zeichen U+FEFF (falls vorhanden) zu überspringen.