2017-02-06 3 views
4

I kürzlich in einige Probleme (mit Fehlern Mapping 0x81, 0x8D) aus dem biopython Modul mit einer anaconda 4.1.1 Python 3.5.2 Installation auf einem Sony vaio Fenster 10 SystemPython 3 Standard-Codierung cp1252

Dekodieren eines Griffs lief

Nach einigen Nachforschungen scheint das Problem möglicherweise darin zu bestehen, dass der Standarddekodiercodec cp1252 ist. Ich habe den folgenden Code ausgeführt und festgestellt, dass der Standard-Codec tatsächlich auf cp1252 gesetzt ist.

Mehrere Beiträge deuten jedoch darauf hin, dass Python 3 den Standard-Codec auf utf8 gesetzt haben sollte. Ist das korrekt? Wenn ja, warum ist mein CP1252 und wie kann ich das lösen? import locale os_encoding = locale.getpreferredencoding()

Antwort

5

Nach What’s New In Python 3.0,

Es ist eine plattformabhängige Standardcodierung [...] In vielen Fällen, aber nicht alle, das System standardmäßig UTF-8; Sie sollten sich niemals auf diesen Standard verlassen.

und

PEP 3120: Die Standardquellencodierung ist nun UTF-8.

Mit anderen Worten öffnet Python-Source-Dateien als UTF-8 als Standard, aber jede Interaktion mit dem Dateisystem wird auf der Umwelt ab. Es wird dringend empfohlen, open(filename, encoding='utf-8') zu verwenden, um eine Datei zu lesen.

Eine weitere Änderung ist, dass b'bytes'.decode() und 'str'.encode() ohne Argument utf-8 anstelle von ASCII verwenden.

Python 3.6 changes einige weitere Standardwerte:

PEP 529: Ändern Sie Windows-Dateisystem-Kodierung UTF-8

PEP 528: Ändern Sie Windows-Konsole Kodierung UTF-8

Aber der Standard Kodierung für open() ist immer noch was auch immer Python aus der Umgebung herleiten kann.

Es scheint, dass 3.7 einen (Opt-In!) - Modus hinzufügt, in dem die Codierung der Umgebungslokale ignoriert wird und alles immer UTF-8 ist (außer in bestimmten Fällen, in denen Windows UTF-16 verwendet, nehme ich an). Siehe PEP 0540 und entsprechende Issue 29240.

+0

Klar, dass ich .read() verwenden, um das Handle aus dem Entrez.efetch-Modul zu analysieren. Ist es dann möglich, die Codierung wie bei open() zu spezifizieren? –