UnicodeDecodeError только с помощью cx_freeze

1

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

Теги:
python-3.x
encoding
cx-freeze

4 ответа

1
Лучший ответ

Расскажите нам, какую версию 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 в Интернете. Просто запустите этот маленький script (untested):

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 aka  ... вы можете редактировать свои файлы, чтобы изменить их на обычные пространства.

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

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

  • 0
    Я использую Python v3.1 на Windows, пробовал на ботах x86 и 64. Я бы показал вам полный трассировку. Последний вызов моего кода в стеке - цикл for для получения моих данных из файла csv: 'для строки в DataReader:'. Я не уверен, почему используется кодек ascii, я не использую его явно, я попытался открыть 2 проблемных файла в блокноте и изменить кодировку на UTF-8 и повторно сохранить ее, потому что, возможно, Excel сохраняет в кодировке ascii, но все же нет помощи. поэтому я предполагаю, что cx_freeze оставляет использование ascii, что имеет смысл, если проблема появляется только после того, как я заморозил скрипт. Так как мне это исправить?
  • 0
    @ Брок С .: отредактируйте свой вопрос вместо добавления новой информации в комментариях. Показать полный трекбек . Покажите, как вы открываете входной файл.
Показать ещё 1 комментарий
1

исправить по умолчанию:

reload(sys)
sys.setdefaultencoding("utf-8")
  • 0
    Из документации Python по sys.setdefaultencoding : «Эта функция предназначена только для реализации модуля сайта и, при необходимости, для sitecustomize».
1

Эта ошибка сама по себе указывает, что у вас есть символ в строке 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)

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

EDIT: вот как это выглядело

try:
    # ... your script here
except UnicodeDecodeError as e:
    print("Exception happened in string '...%s...'"%(e.object[e.start-50:e.start+51],))
    raise
  • 0
    Хорошо, обновите информацию о проблеме, добавив немного больше информации. Проблема возникает в строке «для строки в DataReader:», где DataReader является объектом для чтения csv. Таким образом, чтобы добавить к странному эффекту, что эта ошибка возникает только после того, как я замерзла, она также возникает только для моих первых 2 из 4 файлов, из которых я считываю данные в начале моей программы. Я включил каждый цикл for в попытку / исключение, и когда произошла ошибка, это произошло в начале, поэтому он не извлекал данные из файла csv. Есть идеи? Я мог бы как-то опубликовать все 4 файла CSV, если бы вы могли сказать мне разницу между первыми 2 и последними 2, чтобы сделать ошибку.
  • 0
    Вы захотите распечатать ту часть строки, которая все испортила, чтобы вы могли понять, почему (см. Мое последнее изменение в ответе выше). Если сразу неясно, что происходит и почему, попробуйте отладить скрипт, когда он обрабатывает одну и ту же часть той же строки в не замороженной версии, и проверьте, не содержит ли сама строка другие символы или что-то еще происходит.
0

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

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

  • 1
    Потерять . в 'utf8.'
  • 0
    \xa0 сам по себе не является допустимым UTF-8, скорее всего, это ISO 8859-1 или Windows-1252.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню