Ordinal not in range 128 ошибка

I have to read an XML file in Python and grab various things, and I ran into a frustrating error with Unicode Encode Error that I couldn’t figure out even with googling.

Here are snippets of my code:

#!/usr/bin/python
# coding: utf-8
from xml.dom.minidom import parseString
with open('data.txt','w') as fout:
   #do a lot of stuff
   nameObj = data.getElementsByTagName('name')[0]
   name = nameObj.childNodes[0].nodeValue
   #... do more stuff
   fout.write(','.join((name,bunch of other stuff))

This spectacularly crashes when a name entry I am parsing contains a Euro sign. Here is the error:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 60: ordinal not in range(128)

I understand why Euro sign will screw it up (because it’s at 128, right?), but I thought doing # coding: utf-8 would fix that. I also tried adding .encode(utf-8) so that the name looks instead like

name = nameObj.childNodes[0].nodeValue.encode(utf-8)

But that doesn’t work either. What am I doing wrong? (I am using Python 2.7.3 if anyone wants to know)

EDIT: Python crashes out on the fout.write() line — it will go through fine where the name field is like:

<name>United States, USD</name>

But will crap out on name fields like:

<name>France, € </name>

Back to top

Toggle table of contents sidebar

Ошибки при конвертации#

При конвертации между строками и байтами очень важно точно знать, какая
кодировка используется, а также знать о возможностях разных кодировок.

Например, кодировка ASCII не может преобразовать в байты кириллицу:

In [32]: hi_unicode = 'привет'

In [33]: hi_unicode.encode('ascii')
---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
<ipython-input-33-ec69c9fd2dae> in <module>()
----> 1 hi_unicode.encode('ascii')

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)

Аналогично, если строка «привет» преобразована в байты, и попробовать
преобразовать ее в строку с помощью ascii, тоже получим ошибку:

In [34]: hi_unicode = 'привет'

In [35]: hi_bytes = hi_unicode.encode('utf-8')

In [36]: hi_bytes.decode('ascii')
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-36-aa0ada5e44e9> in <module>()
----> 1 hi_bytes.decode('ascii')

UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)

Еще один вариант ошибки, когда используются разные кодировки для
преобразований:

In [37]: de_hi_unicode = 'grüezi'

In [38]: utf_16 = de_hi_unicode.encode('utf-16')

In [39]: utf_16.decode('utf-8')
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-39-4b4c731e69e4> in <module>()
----> 1 utf_16.decode('utf-8')

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

Наличие ошибок — это хорошо. Они явно говорят, в чем проблема.
Хуже, когда получается так:

In [40]: hi_unicode = 'привет'

In [41]: hi_bytes = hi_unicode.encode('utf-8')

In [42]: hi_bytes
Out[42]: b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'

In [43]: hi_bytes.decode('utf-16')
Out[43]: '뿐胑룐닐뗐苑'

Обработка ошибок#

У методов encode и decode есть режимы обработки ошибок, которые
указывают, как реагировать на ошибку преобразования.

Параметр errors в encode#

По умолчанию encode использует режим strict — при возникновении ошибок
кодировки генерируется исключение UnicodeError. Примеры такого поведения
были выше.

Вместо этого режима можно использовать replace, чтобы заменить символ
знаком вопроса:

In [44]: de_hi_unicode = 'grüezi'

In [45]: de_hi_unicode.encode('ascii', 'replace')
Out[45]: b'gr?ezi'

Или namereplace, чтобы заменить символ именем:

In [46]: de_hi_unicode = 'grüezi'

In [47]: de_hi_unicode.encode('ascii', 'namereplace')
Out[47]: b'gr\\N{LATIN SMALL LETTER U WITH DIAERESIS}ezi'

Кроме того, можно полностью игнорировать символы, которые нельзя
закодировать:

In [48]: de_hi_unicode = 'grüezi'

In [49]: de_hi_unicode.encode('ascii', 'ignore')
Out[49]: b'grezi'

Параметр errors в decode#

В методе decode по умолчанию тоже используется режим strict и
генерируется исключение UnicodeDecodeError.

Если изменить режим на ignore, как и в encode, символы будут просто
игнорироваться:

In [50]: de_hi_unicode = 'grüezi'

In [51]: de_hi_utf8 = de_hi_unicode.encode('utf-8')

In [52]: de_hi_utf8
Out[52]: b'gr\xc3\xbcezi'

In [53]: de_hi_utf8.decode('ascii', 'ignore')
Out[53]: 'grezi'

Режим replace заменит символы:

In [54]: de_hi_unicode = 'grüezi'

In [55]: de_hi_utf8 = de_hi_unicode.encode('utf-8')

In [56]: de_hi_utf8.decode('ascii', 'replace')
Out[56]: 'gr��ezi'

I have to read an XML file in Python and grab various things, and I ran into a frustrating error with Unicode Encode Error that I couldn’t figure out even with googling.

Here are snippets of my code:

#!/usr/bin/python
# coding: utf-8
from xml.dom.minidom import parseString
with open('data.txt','w') as fout:
   #do a lot of stuff
   nameObj = data.getElementsByTagName('name')[0]
   name = nameObj.childNodes[0].nodeValue
   #... do more stuff
   fout.write(','.join((name,bunch of other stuff))

This spectacularly crashes when a name entry I am parsing contains a Euro sign. Here is the error:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 60: ordinal not in range(128)

I understand why Euro sign will screw it up (because it’s at 128, right?), but I thought doing # coding: utf-8 would fix that. I also tried adding .encode(utf-8) so that the name looks instead like

name = nameObj.childNodes[0].nodeValue.encode(utf-8)

But that doesn’t work either. What am I doing wrong? (I am using Python 2.7.3 if anyone wants to know)

EDIT: Python crashes out on the fout.write() line — it will go through fine where the name field is like:

<name>United States, USD</name>

But will crap out on name fields like:

<name>France, € </name>

Ошибки, связанные с кодировкой символов, часто встречаются при работе с Python, особенно при обработке текстовых данных. Одна из таких ошибок — это

Ошибки, связанные с кодировкой символов, часто встречаются при работе с Python, особенно при обработке текстовых данных. Одна из таких ошибок — это UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128). Эта ошибка говорит о том, что Питон пытается преобразовать символ, которого нет в кодировке ASCII.

Пример кода, который вызывает такую ошибку, может выглядеть следующим образом:

s = u'Привет, мир!'
s = str(s)

В этом коде мы пытаемся преобразовать строку, содержащую некоторые символы (в данном случае, кириллические буквы), которых нет в кодировке ASCII. Когда Питон пытается выполнить str(s), он вызывает ошибку UnicodeEncodeError, потому что не может найти эти символы в ASCII.

Решение проблемы

Для решения этой проблемы можно использовать метод .encode(), который преобразует строку в байты с использованием указанной кодировки. Чаще всего используется кодировка ‘utf-8’, которая поддерживает большинство символов.

Исправленный код будет выглядеть следующим образом:

s = u'Привет, мир!'
s = s.encode('utf-8')

Теперь этот код работает без ошибок, потому что все символы в строке s могут быть закодированы с использованием ‘utf-8’.

Однако стоит учесть, что после преобразования строка s становится объектом типа bytes, а не str. Если нужно работать со строкой как с текстом (например, вызывать методы .upper(), .lower(), .replace() и т.д.), то её нужно декодировать обратно в строку с помощью метода .decode().

s = u'Привет, мир!'
s = s.encode('utf-8')
s = s.decode('utf-8')

Теперь s снова строка, и с ней можно работать как с обычным текстом.

Иногда на нашем сервере выскакивает следующая ошибка:
UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\u200e’ in position 13: ordinal not in range(128)

Ошибка: порядковый номер вне диапазона (128)
Причина: это ошибка, вызванная проблемой с кодировкой китайских символов в Python, в основном вызванной символом \ u200e

естьУправляющие символы обозначают надписи слева направо, Это не пробел, полностью невидимый, символ без ширины, мы обычно не видим его на веб-страницах.
аналогичен управляющим символам формата Unicode, таким как «писать метку справа налево» (\ u200F) и «писать метку слева направо» (\ u200E), нулевая ширина Соединитель (\ u200D) и не-коннектор нулевой ширины (\ uFEFF) управляют визуальным отображением текста, что важно для правильного отображения некоторых неанглийских текстов.

Решение: добавьте следующий блок операторов в заголовок файла, в котором расположен код Python.

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

Если вы добавите приведенный выше блок кода, чтобы представить проблему сбоя функции печати в python,Затем замените приведенный выше блок кода следующим блоком кода

import sys # здесь просто ссылка на sys, перезагружается только перезагрузка
stdi,stdo,stde=sys.stdin,sys.stdout,sys.stderr 
reload(sys)  # При ссылке при импорте,Функция setdefaultencoding удаляется после вызова системой, поэтому ее необходимо перезагрузить один раз.
sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde 

Понравилась статья? Поделить с друзьями:
  • Order not found ошибка
  • Orcs must die 3 ошибка unreal engine
  • Orangeemu64 dll ошибка симс 4
  • Ora 00984 ошибка
  • Ora 00600 код внутренней ошибки аргументы