webentwicklung-frage-antwort-db.com.de

Wechsel zu Python 3 führt zu UnicodeDecodeError

Ich habe gerade einen Python3-Interpreter zu Sublime hinzugefügt und der folgende Code funktioniert nicht mehr:

for directory in directoryList:
    fileList = os.listdir(directory)
    for filename in fileList:
        filename = os.path.join(directory, filename)
        currentFile = open(filename, 'rt')
        for line in currentFile:               ##Here comes the exception.
            currentLine = line.split(' ')
            for Word in currentLine:
                if Word.lower() not in bigBagOfWords:
                    bigBagOfWords.append(Word.lower())
        currentFile.close()

Ich bekomme folgende Ausnahme:

  File "/Users/Kuba/Desktop/DictionaryCreator.py", line 11, in <module>
    for line in currentFile:
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcc in position 305: ordinal not in range(128)

Ich fand das ziemlich seltsam, denn soweit ich weiß, soll Python3 utf-8 überall unterstützen. Außerdem funktioniert derselbe genaue Code auf Python2.7 ohne Probleme. Ich habe über das Hinzufügen der Umgebungsvariable PYTHONIOENCODING gelesen, aber ich habe es versucht - ohne Erfolg (es scheint jedoch nicht so einfach zu sein, in OS X Mavericks eine Umgebungsvariable hinzuzufügen modidified /etc/launchd.conf)

21
3yakuya

Python 3 decodiert Textdateien beim Lesen. Die Standardcodierung stammt von locale.getpreferredencoding(False) , die offensichtlich für Ihr Setup 'ASCII' zurückgibt. Siehe die Funktionsdokumentation open() :

Wenn im Textmodus nicht coding angegeben ist, ist die verwendete Codierung plattformabhängig: locale.getpreferredencoding(False) wird aufgerufen, um die aktuelle Ländereinstellungscodierung abzurufen.

Anstatt sich auf eine Systemeinstellung zu verlassen, sollten Sie Ihre Textdateien mit einem expliziten Codec öffnen:

currentFile = open(filename, 'rt', encoding='latin1')

wo Sie den Parameter encoding so einstellen, dass er mit der Datei übereinstimmt, die Sie gerade lesen.

Python 3 unterstützt UTF-8 als Standard für Quellcode.

Gleiches gilt für das Schreiben in eine beschreibbare Textdatei. Die geschriebenen Daten werden verschlüsselt. Wenn Sie sich auf die Systemcodierung verlassen, kann es sein, dass Sie UnicodeEncodingError-Ausnahmen erhalten, sofern Sie nicht ausdrücklich einen geeigneten Codec festgelegt haben.

Sie können Python 3 und Unicode im Unicode HOWTO nachlesen, in dem sowohl die Codierung des Quellcodes als auch das Lesen und Schreiben von Unicode-Daten erläutert wird.

54
Martijn Pieters

"Soweit ich weiß, soll Python3 überall Utf-8 unterstützen ..." Nicht wahr. Ich habe Python 3.6 und meine Standardcodierung ist NICHT utf-8. Um es in meinem Code zu utf-8 zu ändern, verwende ich:

import locale
def getpreferredencoding(do_setlocale = True):
   return "utf-8"
locale.getpreferredencoding = getpreferredencoding

wie in Ändern der bevorzugten Codierung für die Ländereinstellung in Python 3 in Windows

0
farid khafizov