2016-05-11 5 views
1

ich ein Stück Code haben verwenden sollte:Python verwendet 'ascii' Codec bei der Decodierung, wo es 'UTF-8'

with open('filename.txt','r') as textfile: 
    kwList = [x.strip('\n') for x in textfile.readlines()] 

ich eine bekommen: UnicodeDecodeError: 'ascii' Codec Byte nicht dekodieren kann 0xC4 in Position 5595: ordinal nicht im Bereich (128) auf der Leitung 2

Das Problem besteht darin, dass nach dem Python-Doc: https://docs.python.org/3/library/functions.html#open

Python3 locale.getpreferredencoding(False) verwendet die Standardcodierung zu erhalten w zu verwenden, Wenn in der offenen Methode keine Codierung angegeben ist.

Wenn ich locale.getpreferredencoding (False) ausführen, bekomme ich "UTF-8".

Warum bekomme ich 'Ascii' Codec im UnicodeDecodeError fehlgeschlagen, wenn Python 'UTF-8' verwenden soll, um dies zu tun?

+2

Das Gebietsschema hängt vom * Kontext * ab, in dem Sie das Skript ausführen. Führen Sie den Befehl 'locale.getpreferredencoding (False)' im selben Kontext aus. –

+1

Ist die UTF-8 bevorzugte Kodierung im selben Lauf des gleichen Codes angegeben (zB haben Sie einen 'print (locale.getpreferredencoding (False))' direkt über Ihrem 'mit open (...) as textfile' oder via hinzugefügt einige andere Mittel? –

+2

Und warum nicht einfach das 'coding' Argument auf den' open() 'Anruf setzen? –

Antwort

2

Das Gebietsschema stammt aus dem Kontext; Auf POSIX-Systemen, also den Umgebungsvariablen, siehe POSIX locale documentation. Sie müssen den genauen Kontext Ihrer Produktionsumgebung reproduzieren, wenn Sie testen möchten, für welche Kodierung sich Python entscheidet (z. B. die von der Produktionsumgebung verwendeten Umgebungsvariablen kopieren).

Wahrscheinlich führen Sie Ihr Programm als Subprozess von etwas aus, das nur den effektiven Benutzer setzt (oder erbt), aber nicht die Umgebung für diesen Benutzer kopiert. Entweder wurde ein explizites Gebietsschema von diesem übergeordneten Prozess festgelegt, oder, wenn keines festgelegt ist, wird das standardmäßige C-Gebietsschema verwendet. Die Standardcodierung für dieses Gebietsschema ist ASCII. einige Systeme wird dies durch den Namen ANSI_X3.4-1968 berichten:

$ LANG=C python -c 'import locale; print(locale.getpreferredencoding(False))' 
ANSI_X3.4-1968 

Wenn zum Beispiel Ihre Produktionscode von cron ausgeführt wird, dann werden die Umgebungsvariablen sind nicht gesetzt, wenn Sie einen bestimmten Benutzer eingestellt. Set LC_ALL Umgebungsvariable explizit an der Spitze Ihres crontab:

LC_ALL=en.UTF-8 

wenn Ihre cron Implementierung Variablen auf diese Weise Einstellung unterstützt, oder legen Sie es auf der Kommandozeile Sie ausführen werden:

* * * * * LC_ALL=nb_NO.UTF-8 /path/to/your/program 

See

+0

Irgendeine Idee, was der Grund sein könnte, um 'ANSI_X3.4-1968' von' LC_ALL = en_US.utf8 python -c 'zu importieren; Gebietsschema; print locale.getpreferredencoding (False) ''while' locale -a' kehrt zurück (Anzahl anderer Ergebnisse) 'en_US.utf8'? –

+0

@PiotrDobrogost: Dies kann auch von Ihrem Betriebssystem abhängen. Ich finde auch, dass verschiedene Python-Versionen schwierig in der Rechtschreibung sind; In Python 3.6 funktioniert 'UTF-8' (also' LC_ALL = en_US.UTF-8'). Ich schaue mir das jetzt genauer an, aber es funktioniert auch nicht so, wie ich es von meinem Mac erwartet habe. –