UnicodeDecodeError только с помощью cx_freeze - PullRequest
1 голос
/ 07 мая 2011

Я получаю сообщение об ошибке: "UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 7338: ordinal not in range(128)", как только я пытаюсь запустить программу после того, как замораживаю свой скрипт с помощью cx_freeze.Если я обычно запускаю сценарий Python 3, он работает нормально, но только после того, как я остановил его и попытался запустить исполняемый файл, он выдаст мне эту ошибку.Я бы опубликовал свой код, но я не знаю точно, какие части публиковать, поэтому, если есть какие-то определенные части, которые помогут, просто дайте мне знать, и я опубликую их, в противном случае кажется, что у меня была эта проблема однажды и решенаэто было, но это было какое-то время, и я не могу вспомнить, в чем именно заключалась проблема или как я ее исправил, поэтому любая помощь или указатели, помогающие мне двигаться в правильном направлении, очень помогут.Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 24 апреля 2013

исправлено с помощью установленной по умолчанию кодировки:

reload(sys)
sys.setdefaultencoding("utf-8")
1 голос
/ 07 мая 2011

Эта ошибка сама по себе означает, что у вас есть символ в строке Python, который не является нормальным символом ASCII:

>>> b'abc\xa0'.decode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 3: ordinal not in range(128)

Я, конечно, не знаю, почему это произойдет только тогда, когда скрипт заморожен. Вы можете заключить весь скрипт в try / except и вручную распечатать всю или часть рассматриваемой строки.

РЕДАКТИРОВАТЬ: вот как это может выглядеть

try:
    # ... your script here
except UnicodeDecodeError as e:
    print("Exception happened in string '...%s...'"%(e.object[e.start-50:e.start+51],))
    raise
1 голос
/ 07 мая 2011

Сообщите нам, какая именно версия Python на какой платформе.

Показать полный трассировку, которую вы получаете, когда происходит ошибка.Посмотри на это сам.Какая последняя строка вашего кода появляется?Как вы думаете, что за строка bytes декодируется?Почему используется кодек ascii ??

Обратите внимание, что автоматическое преобразование bytes в str с кодеком по умолчанию (например, ascii) НЕ выполняется Python 3.x.Так что либо вы делаете это явно, либо cx_freeze имеет значение.

Обновите после получения дополнительной информации в комментариях.

Excel не сохраняет файлы CSV в ASCII.Это сохраняет их в том, что MS называет «кодовой страницей ANSI», которая варьируется в зависимости от региона.Если вы не знаете, что у вас, вероятно, это cp1252.Чтобы проверить, сделайте следующее:

>>> import locale; print(locale.getpreferredencoding())
cp1252

Если бы Excel сохранял файлы в ASCII, ваш байт '\xa0' был бы заменен на '?'и вы не получите UnicodeDecodeError.

Сохранение ваших файлов в UTF-8 потребует от вас открытия файлов с помощью encoding='utf8' и будет иметь ту же проблему (за исключением того, что вы получите ворчание о 0xc2вместо 0xa0).

Вам не нужно размещать все четыре ваших CSV-файла в Интернете.Просто запустите этот небольшой сценарий (без проверки):

import sys
for filename in sys.argv[1:]:
    for lino, line in enumerate(open(filename), 1):
        if '\xa0' in line:
            print(ascii(filename), lino, ascii(line))

'\xa0' - это NO-BREAK SPACE или &nbsp; ... вы можете отредактировать свои файлы, чтобы изменить их на обычные пробелы.

Возможно, вам нужно будет спросить в списке рассылки cx_freeze, чтобы получить ответ, почему происходит эта ошибка.Они захотят узнать полный след.Поэкспериментируйте - покажите это здесь.

Кстати, «смещение 7338» довольно велико - вы ожидаете, что строки в вашем файле CSV будут такими длинными?Возможно, что-то читает все ваши файлы ...

0 голосов
/ 07 мая 2011

Используйте функцию str.decode() для этих строк.А также вы можете указать кодировку как myString.decode('cp1252').

Смотрите также: http://docs.python.org/release/3.0.1/howto/unicode.html#unicode-howto

...