Подтвердить что ты не робот

Переход на Python 3, вызывающий UnicodeDecodeError

Я только что добавил интерпретатор Python3 в Sublime, и следующий код перестает работать:

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()

Я получаю следующее исключение:

  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)

Я нашел это довольно странным, потому что, насколько я знаю, Python3 должен поддерживать utf-8 всюду. Что еще, тот же самый точный код работает без проблем на Python2.7. Я читал о добавлении переменной окружения PYTHONIOENCODING, но я попробовал - безрезультатно (однако, похоже, не так просто добавить переменную окружения в OS X Mavericks, так что, возможно, я сделал что-то не так с добавлением переменной? я modidified/etc/launchd.conf)

4b9b3361

Ответ 1

Python 3 декодирует текстовые файлы при чтении. Кодировка по умолчанию берется из locale.getpreferredencoding(False), что, очевидно, для вашей установки возвращает 'ASCII'. См. open() функция documenation:

В текстовом режиме, если кодировка не указана, используемая кодировка зависит от платформы: locale.getpreferredencoding(False) вызывается, чтобы получить текущую кодировку локали.

Вместо того, чтобы полагаться на системный параметр, вы должны открыть текстовые файлы с помощью явного кодека:

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

где вы устанавливаете параметр encoding в соответствии с файлом, который вы читаете.

Python 3 поддерживает UTF-8 как исходный код по умолчанию.

То же самое относится к записи в текстовый файл для записи; записанные данные будут закодированы, и если вы будете полагаться на системную кодировку, вы можете получить исключения UnicodeEncodingError, если вы явно не установите подходящий кодек.

Вы можете прочитать на Python 3 и Unicode в Unicode HOWTO, который объясняет как кодирование исходного кода, так и чтение и запись Данные Unicode.