Ik ben een Amazon XML-bestand aan het lezen en ontleden en terwijl het XML-bestand een ‘ toont, krijg ik de volgende foutmelding wanneer ik het probeer af te drukken:
'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128)
Van wat ik tot nu toe online heb gelezen, komt de fout voort uit het feit dat het XML-bestand in UTF-8 staat, maar Python wil het behandelen als een ASCII-gecodeerd teken. Is er een eenvoudige manier om de fout te laten verdwijnen en mijn programma de XML te laten afdrukken zoals deze wordt gelezen?
Antwoord 1, autoriteit 100%
Waarschijnlijk is je probleem dat je het goed hebt geparseerd, en nu probeer je de inhoud van de XML af te drukken en dat lukt niet omdat er vreemde Unicode-tekens in zitten. Probeer uw Unicode-tekenreeks eerst als ascii te coderen:
unicodeData.encode('ascii', 'ignore')
het gedeelte ‘negeren’ zal het vertellen om die karakters gewoon over te slaan. Uit de Python-documenten:
>>> # Python 2: u = unichr(40960) + u'abcd' + unichr(1972)
>>> u = chr(40960) + u'abcd' + chr(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')
'ꀀabcd޴'
Misschien wil je dit artikel lezen: http://www.joelonsoftware.com/articles /Unicode.html, wat ik erg handig vond als een eenvoudige tutorial over wat er aan de hand is. Na het lezen heb je niet meer het gevoel dat je aan het raden bent welke commando’s je moet gebruiken (althans dat is mij overkomen).
Antwoord 2, autoriteit 8%
Een betere oplossing:
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)
Als je meer wilt lezen over waarom:
http://docs.plone.org/manage/troubleshooting/unicode.html#id1
Antwoord 3, autoriteit 4%
De karaktercodering van uw omgeving niet hardcoderen in uw script; print in plaats daarvan Unicode-tekst rechtstreeks:
assert isinstance(text, unicode) # or str on Python 3
print(text)
Als uw uitvoer wordt omgeleid naar een bestand (of een pijp); je zou PYTHONIOENCODING
envvar kunnen gebruiken om de tekencodering te specificeren:
$ PYTHONIOENCODING=utf-8 python your_script.py >output.utf8
Anders zou python your_script.py
moeten werken zoals het is — je landinstellingen worden gebruikt om de tekst te coderen (controleer POSIX: LC_ALL
, LC_CTYPE
, LANG
envvars — stel LANG
in op een utf-8 locale indien nodig).
Antwoord 4
Uitstekende post: http://www.carlosble.com/ 2010/12/understanding-python-and-unicode/
# -*- 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
Antwoord 5
Je kunt iets van het formulier gebruiken
s.decode('utf-8')
die een UTF-8-gecodeerde bytestring omzet in een Python Unicode-tekenreeks. Maar de exacte procedure die moet worden gebruikt, hangt af van hoe u het XML-bestand laadt en ontleden, b.v. als u de XML-tekenreeks nooit rechtstreeks opent, moet u mogelijk een decoderobject uit de gebruiken codecs
module.
Antwoord 6
Ik heb het volgende geschreven om de hinderlijke niet-ascii-citaten te corrigeren en de conversie naar iets bruikbaars te forceren.
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
Antwoord 7
Als u een benadering van de tekenreeks op het scherm wilt afdrukken, in plaats van de niet-afdrukbare tekens te negeren, probeer dan het unidecode
-pakket hier:
https://pypi.python.org/pypi/Unidecode
De uitleg is hier te vinden:
https://www.tablix.org/~ avian/blog/archives/2009/01/unicode_transliteration_in_python/
Dit is beter dan het gebruik van de u.encode('ascii', 'ignore')
voor een gegeven string u
, en kan u onnodige hoofdpijn besparen als teken precisie is niet wat u zoekt, maar u wilt toch menselijke leesbaarheid hebben.
Wirawan
Antwoord 8
Probeer de volgende regel bovenaan je python-script toe te voegen.
# _*_ coding:utf-8 _*_
Antwoord 9
Python 3.5, 2018
Als u niet weet wat de codering is, maar de unicode-parser problemen heeft, kunt u het bestand openen in Notepad++
en in de bovenste balk Encoding->Convert to ANSI
. Dan kun je je python zo schrijven
with open('filepath', 'r', encoding='ANSI') as file:
for word in file.read().split():
print(word)