Я работаю над рядом синтаксических анализаторов, где я получаю набор tracebacks от моих модульных тестов как:
File "c:\Python31\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 112: character maps to <undefined>
Файлы открыты с открытым () без дополнительного arguemnts. Я могу передать дополнительные аргументы, чтобы открыться () или использовать что-то в модуле кодека для открытия их по-другому?
Это придумало код, который был написан в Python 2 и преобразован в 3 с 2to3 инструмент.
ОБНОВЛЕНИЕ: оказывается, что это - результат питания zipfile в синтаксический анализатор. Модульный тест на самом деле ожидает, что это произойдет. Синтаксический анализатор должен распознать его как что-то, что не может быть проанализировано. Так, я должен изменить свою обработку исключений. В процессе выполнения этого теперь.
Позиция 0x81 не назначена в Windows-1252 (также известна как cp1252). Ему присваивается управляющий символ U + 0081 HIGH OCTET PRESET (HOP) в Latin-1 (также известный как ISO 8859-1). Я могу воспроизвести вашу ошибку в Python 3.1 следующим образом:
>>> b'\x81'.decode('cp1252')
Traceback (most recent call last):
...
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 0: character maps to <undefined>
или с фактическим файлом:
>>> open('test.txt', 'wb').write(b'\x81\n')
2
>>> open('test.txt').read()
Traceback (most recent call last):
...
UnicodeDecodeError: 'utf8' codec can't decode byte 0x81 in position 0: unexpected code byte
Теперь, чтобы рассматривать этот файл как Latin-1, вы передаете аргумент encoding
, как предлагается codeape:
>>> open('test.txt', encoding='latin-1').read()
'\x81\n'
Помните, что существуют различия между кодировками Windows-1257 и Latin-1, например Latin-1 не имеет «умных кавычек». Если файл, который вы обрабатываете, является текстовым файлом, спросите себя, что этот \ x81 в нем делает.
Вы можете ослабить обработку ошибок.
Например:
f = open(filename, encoding="...", errors="replace")
Или:
f = open(filename, encoding="...", errors="ignore")
См. документы .
РЕДАКТИРОВАТЬ:
Но уверены ли вы, что проблема в чтении файла? Может ли быть исключение, когда что-то записывается в консоль? Проверьте http://wiki.python.org/moin/PrintFails
Все файлы не в Юникоде. Юникод - это внутреннее представление, которое необходимо закодировать. Вам необходимо определить для каждого файла, какая кодировка была использована, и указать это там, где это необходимо, при открытии файла.
Как указано в трассировке и сообщении об ошибке , рассматриваемый файл НЕ закодирован в cp1252
.
Если он закодирован в latin1
, "\ x81"
, на который он жалуется, является управляющим символом C1, у которого даже нет имени (в Unicode). Считайте latin1
крайне маловероятным.
Вы говорите: «Некоторые файлы анализируются с помощью xml.dom.minidom» - проанализированы успешно или безуспешно?
В допустимом XML-файле должна быть указана его кодировка (по умолчанию UTF-8) в первой строке, и вам не нужно указывать кодировку в вашем коде. Покажите нам код, который вы используете для синтаксического анализа xml.dom.minidom.
«другие читаются напрямую как итерации» - пример кода, пожалуйста.
Предложение: попробуйте открыть в браузере несколько файлов каждого типа. Затем щелкните «Просмотр» и выберите «Кодировка символов (Firefox) или Кодировка (Internet Explorer)». Какую кодировку угадал браузер [обычно надежно]?
Другие возможные подсказки по кодировке: Какие языки используются в тексте в файлах? Откуда вы взяли файлы?
Примечание: пожалуйста, отредактируйте свой вопрос, добавив уточняющую информацию; не отвечайте в комментариях.