Python 3 дросселирует на CP-1252/ANSI чтении

Я работаю над рядом синтаксических анализаторов, где я получаю набор 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 в синтаксический анализатор. Модульный тест на самом деле ожидает, что это произойдет. Синтаксический анализатор должен распознать его как что-то, что не может быть проанализировано. Так, я должен изменить свою обработку исключений. В процессе выполнения этого теперь.

5
задан Aaron Altman 19 July 2010 в 23:49
поделиться

3 ответа

Позиция 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 в нем делает.

14
ответ дан 18 December 2019 в 08:26
поделиться

Вы можете ослабить обработку ошибок.

Например:

f = open(filename, encoding="...", errors="replace")

Или:

f = open(filename, encoding="...", errors="ignore")

См. документы .

РЕДАКТИРОВАТЬ:

Но уверены ли вы, что проблема в чтении файла? Может ли быть исключение, когда что-то записывается в консоль? Проверьте http://wiki.python.org/moin/PrintFails

3
ответ дан 18 December 2019 в 08:26
поделиться

Все файлы не в Юникоде. Юникод - это внутреннее представление, которое необходимо закодировать. Вам необходимо определить для каждого файла, какая кодировка была использована, и указать это там, где это необходимо, при открытии файла.

Как указано в трассировке и сообщении об ошибке , рассматриваемый файл НЕ закодирован в cp1252 .

Если он закодирован в latin1 , "\ x81" , на который он жалуется, является управляющим символом C1, у которого даже нет имени (в Unicode). Считайте latin1 крайне маловероятным.

Вы говорите: «Некоторые файлы анализируются с помощью xml.dom.minidom» - проанализированы успешно или безуспешно?

В допустимом XML-файле должна быть указана его кодировка (по умолчанию UTF-8) в первой строке, и вам не нужно указывать кодировку в вашем коде. Покажите нам код, который вы используете для синтаксического анализа xml.dom.minidom.

«другие читаются напрямую как итерации» - пример кода, пожалуйста.

Предложение: попробуйте открыть в браузере несколько файлов каждого типа. Затем щелкните «Просмотр» и выберите «Кодировка символов (Firefox) или Кодировка (Internet Explorer)». Какую кодировку угадал браузер [обычно надежно]?

Другие возможные подсказки по кодировке: Какие языки используются в тексте в файлах? Откуда вы взяли файлы?

Примечание: пожалуйста, отредактируйте свой вопрос, добавив уточняющую информацию; не отвечайте в комментариях.

2
ответ дан 18 December 2019 в 08:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: