web-dev-qa-db-ja.com

Python Unicodeエンコードエラー

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を読み取ったとおりに印刷させる簡単な方法はありますか?

100
Alex B

おそらく、あなたの問題はあなたがそれを大丈夫に解析したことです、そして今あなたはXMLの内容を印刷しようとしています、そしてあなたはいくつかの外国のUnicode文字があるのであなたはできません。最初にUnicode文字列をasciiとしてエンコードしてみてください:

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

「無視」部分は、それらの文字をスキップするように指示します。 pythonドキュメントから:

>>> 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 何が起こっているかのチュートリアル。読んだ後は、使用するコマンドを推測しているだけのように感じることはなくなります(または、少なくとも私にはそれが起こりました)。

183
Scott Stafford

より良い解決策:

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)

理由についてさらに読みたい場合:

http://docs.plone.org/manage/troubleshooting/unicode.html#id1

15
Paxwell

スクリプト内で環境の文字エンコーディングをハードコードしないでください。代わりに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_ALLLC_CTYPELANG envvars-set LANG必要に応じてutf-8ロケールに変更)。

WindowsでUnicodeを印刷するには、Windowsコンソール、ファイル、またはIDLEを使用してUnicodeを印刷する方法を示すこの回答を参照してください

5
jfs

素晴らしい投稿: 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
1
Ranvijay Sachan

厄介な非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
0
user5910

これらの印刷できない文字を無視するのではなく、文字列の近似表現を画面に印刷する必要がある場合は、unidecodeパッケージをここで試してください。

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

説明はここにあります:

https://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/

これは、特定の文字列uu.encode('ascii', 'ignore')を使用するよりも優れており、文字精度が望んでいるものではないが、人間が読みやすいようにしたい場合に不要な頭痛からあなたを救うことができます。

ウィラワン

0

Python 3.5、2018

エンコードがわからないが、Unicodeパーサーに問題がある場合は、Notepad++でファイルを開き、トップバーでEncoding->Convert to ANSIを選択します。その後、次のようにpythonを書くことができます

with open('filepath', 'r', encoding='ANSI') as file:
    for Word in file.read().split():
        print(Word)
0
Atomar94

次の形式のものを使用できます

s.decode('utf-8')

uTF-8でエンコードされたバイト文字列をPython Unicode文字列に変換します。ただし、使用する正確な手順は、XMLファイルの読み込みと解析の方法によって異なります。 XML文字列に直接アクセスしない場合は、 codecs module のデコーダーオブジェクトを使用する必要があります。

0
David Z