Python 3 подавляется чтением CP-1252 / ANSI - PullRequest
5 голосов
/ 20 июля 2010

Я работаю над серией синтаксических анализаторов, в которых я получаю несколько трассировок от своих модульных тестов, таких как:

  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>

Файлы открываются с помощью open () без дополнительных аргументов.Могу ли я передать дополнительные аргументы в open () или использовать что-то в модуле кодека, чтобы открыть их по-другому?

В результате появился код, написанный на Python 2 и преобразованный в 3 с помощью инструмента 2to3.

ОБНОВЛЕНИЕ: оказывается, это результат подачи zip-файла в парсер.Модульный тест на самом деле ожидает, что это произойдет.Парсер должен распознавать это как нечто, что не может быть проанализировано.Итак, мне нужно изменить обработку исключений.В процессе это сейчас.

Ответы [ 3 ]

14 голосов
/ 20 июля 2010

Позиция 0x81 не назначена в Windows-1252 (она же cp1252). Ему присваивается управляющий символ U + 0081 HIGH OCTET PRESET (HOP) на латинице 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.

3 голосов
/ 20 июля 2010

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

Например:

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

Или:

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

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

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

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

2 голосов
/ 20 июля 2010

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

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

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

Вы говорите, что "некоторые файлы проанализированы с xml.dom.minidom" - проанализированы успешно или неудачно?

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

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

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

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

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

...