Я получаю сообщение об ошибке: "UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 7338: ordinal not in range(128)"
как только я попытаюсь запустить программу после того, как заморожу script с помощью cx_freeze. Если я запускаю Python 3 script нормально, он работает нормально, но только после того, как я заморожу его и попробую запустить исполняемый файл, это даст мне эту ошибку. Я бы опубликовал свой код, но я точно не знаю, какие части отправлять, поэтому, если есть какие-то определенные части, которые помогут просто сообщить мне, и я опубликую их, иначе мне кажется, что у меня была эта проблема раньше и решалась это было, но прошло некоторое время, и я не могу вспомнить, в чем проблема, или как я ее исправил, поэтому любая помощь или указатели, чтобы заставить меня двигаться в правильном направлении, очень поможет. Спасибо заранее.
Расскажите нам, какую версию 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 файле? Возможно, что-то читает весь ваш файл...
reload(sys)
sys.setdefaultencoding("utf-8")
sys.setdefaultencoding
: «Эта функция предназначена только для реализации модуля сайта и, при необходимости, для sitecustomize».
Эта ошибка сама по себе указывает, что у вас есть символ в строке 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
Используйте для этой строки функцию str.decode()
. А также вы можете указать кодировку как myString.decode('cp1252')
.
Смотрите также: http://docs.python.org/release/3.0.1/howto/unicode.html#unicode-howto
.
в 'utf8.'
\xa0
сам по себе не является допустимым UTF-8, скорее всего, это ISO 8859-1 или Windows-1252.