Python Unicode Encode Error

Я читаю и анализирую файл Amazon XML, и, хотя в файле XML отображается ', при попытке его распечатать я получаю следующую ошибку:

'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128) 

Из того, что я до сих пор читал в Интернете, ошибка связана с тем, что XML-файл находится в UTF-8, но Python хочет обрабатывать его как кодированный ASCII-символ. Есть ли простой способ устранить ошибку и заставить мою программу распечатать XML-файл во время чтения?

94 голоса | спросил Alex B 11 J000000Sunday10 2010, 23:00:48

9 ответов


0

Вероятно, ваша проблема в том, что вы все правильно проанализировали, и теперь вы пытаетесь напечатать содержимое XML, а вы не можете, потому что есть некоторые иностранные символы Unicode. Попробуйте сначала закодировать строку Unicode как ascii:

unicodeData.encode('ascii', 'ignore')

часть 'ignore' скажет ему просто пропустить эти символы. Из документации по питону:

>>> u = unichr(40960) + u'abcd' + unichr(1972)
>>> u.encode('utf-8')
'\xea\x80\x80abcd\xde\xb4'
>>> u.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode character '\ua000' in position 0: ordinal not in range(128)
>>> u.encode('ascii', 'ignore')
'abcd'
>>> u.encode('ascii', 'replace')
'?abcd?'
>>> u.encode('ascii', 'xmlcharrefreplace')
'&#40960;abcd&#1972;'

Возможно, вы захотите прочитать эту статью: http://www.joelonsoftware.com/articles/Unicode.html , который я нашел очень полезным в качестве основного учебника о том, что происходит. После прочтения вы перестанете чувствовать, что просто угадываете, какие команды использовать (или, по крайней мере, это случилось со мной).

ответил Scott Stafford 11 J000000Sunday10 2010, 23:10:51
0

Лучшее решение:

if type(value) == str:
    # Ignore errors even if the string is not proper UTF-8 or has
    # broken marker bytes.
    # Python built-in function unicode() can do this.
    value = unicode(value, "utf-8", errors="ignore")
else:
    # Assume the value object has proper __unicode__() method
    value = unicode(value)

Если вы хотите узнать больше о причинах:

ответил Paxwell 10 Jam1000000amFri, 10 Jan 2014 00:24:54 +040014 2014, 00:24:54
0

Не жестко кодируйте кодировку символов вашей среды внутри скрипта; Напечатайте текст Unicode напрямую вместо этого:

assert isinstance(text, unicode) # or str on Python 3
print(text)

Если ваш вывод перенаправлен в файл (или канал); Вы можете использовать PYTHONIOENCODING envvar, чтобы указать кодировку символов:

$ PYTHONIOENCODING=utf-8 python your_script.py >output.utf8

В противном случае python your_script.py должно работать как есть - ваши настройки локали используются для кодирования текста (при проверке POSIX: LC_ALL, LC_CTYPE, LANG envvars - установите для LANG локаль utf-8, если необходимо) .

Чтобы распечатать Unicode в Windows, посмотрите этот ответ, в котором показано, как распечатать Unicode на консоли Windows, в файл или с помощью IDLE .

ответил jfs 29 J0000006Europe/Moscow 2015, 10:46:40
0

Отличная запись: http://www.carlosble.com/2010/12 /понимание-питон-и-юникода /

# -*- coding: utf-8 -*-

def __if_number_get_string(number):
    converted_str = number
    if isinstance(number, int) or \
            isinstance(number, float):
        converted_str = str(number)
    return converted_str


def get_unicode(strOrUnicode, encoding='utf-8'):
    strOrUnicode = __if_number_get_string(strOrUnicode)
    if isinstance(strOrUnicode, unicode):
        return strOrUnicode
    return unicode(strOrUnicode, encoding, errors='ignore')


def get_string(strOrUnicode, encoding='utf-8'):
    strOrUnicode = __if_number_get_string(strOrUnicode)
    if isinstance(strOrUnicode, unicode):
        return strOrUnicode.encode(encoding)
    return strOrUnicode
ответил Ranvijay Sachan 13 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 13 Sep 2016 21:31:37 +0300 2016, 21:31:37
0

Вы можете использовать что-то в форме

s.decode('utf-8')

, который преобразует кодированную строку UTF-8 в строку Python Unicode. Но точная процедура зависит от того, как именно вы загружаете и анализируете файл XML, например, если у вас нет прямого доступа к строке XML, вам, возможно, придется использовать объект декодера из codecs модуль .

ответил David Z 11 J000000Sunday10 2010, 23:04:23
0

Я написал следующее, чтобы исправить неприятные кавычки, не связанные с ascii, и принудительно преобразовать их во что-то полезное.

unicodeToAsciiMap = {u'\u2019':"'", u'\u2018':"`", }

def unicodeToAscii(inStr):
    try:
        return str(inStr)
    except:
        pass
    outStr = ""
    for i in inStr:
        try:
            outStr = outStr + str(i)
        except:
            if unicodeToAsciiMap.has_key(i):
                outStr = outStr + unicodeToAsciiMap[i]
            else:
                try:
                    print "unicodeToAscii: add to map:", i, repr(i), "(encoded as _)"
                except:
                    print "unicodeToAscii: unknown code (encoded as _)", repr(i)
                outStr = outStr + "_"
    return outStr
ответил user5910 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 10 Sep 2015 14:31:11 +0300 2015, 14:31:11
0

Если вам нужно напечатать примерное представление строки на экране, а не игнорировать эти непечатаемые символы, попробуйте пакет unidecode здесь:

https://pypi.python.org/pypi/Unidecode

Объяснение можно найти здесь:

https://www.tablix.org/~ Птичий /блог /архивы /2009/01 /unicode_transliteration_in_python /

Это лучше, чем использовать u.encode('ascii', 'ignore') для заданной строки u и может уберечь вас от ненужной головной боли, если точность символов не такая, какая вам нужна, но при этом вы хотите иметь удобочитаемость для человека.

Wirawan

ответил Wirawan Purwanto 23 32016vEurope/Moscow11bEurope/MoscowWed, 23 Nov 2016 21:16:37 +0300 2016, 21:16:37
0

Python 3.5, 2018

Если вы не знаете, что такое кодировка, но у парсера Unicode возникают проблемы, вы можете открыть файл в Notepad++ и в В верхней строке выберите Encoding->Convert to ANSI. Тогда вы можете написать свой питон, как это

with open('filepath', 'r', encoding='ANSI') as file:
    for word in file.read().split():
        print(word)
ответил Atomar94 10 +03002018-10-10T00:56:17+03:00312018bEurope/MoscowWed, 10 Oct 2018 00:56:17 +0300 2018, 00:56:17
0

Попробуйте добавить следующую строку вверху скрипта Python.

# _*_ coding:utf-8 _*_
ответил Abhinav 20 Jam1000000amWed, 20 Jan 2016 08:08:16 +030016 2016, 08:08:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132