2016-05-14 4 views
0

pi30の要素から属性値Bodyを抽出しようとしています。UnicodeEncodeError: 'ascii'コーデックでu ' u03c0'文字をエンコードできません

cat pi.xml 
    <?xml version="1.0" encoding="utf-8"?> 
    <posts> 
     <row Id="19" Body=" The value of π, the value of pi." /> 
    </posts> 

のpythonファイル、pi.py:

from lxml import etree 
    doc = etree.parse('pi.xml') 
    r = doc.findall('row') 
    for i in r: 
     print (i.get('Body')) 

そしてロケール:

$ locale: 
    LANG=en_IN 
    LANGUAGE=en_IN:en 
    LC_CTYPE="en_IN" 
    LC_NUMERIC="en_IN" 
    LC_TIME="en_IN" 
    LC_COLLATE="en_IN"  
    LC_ALL= 

python pi.pyほどpi.pyを実行すると、すべてが正常です。
しかし、私は出力をリダイレクトし、python pi.py >> pi.txtとしてpi.pyを実行しようとした場合 - 私は、エラーメッセージを取得 - UnicodeEncodeErrorを:(ない範囲で、序:「ASCII」コーデックが文字をエンコードすることはできませんuが位置101で「u03c0を\します」 128)

print (i.get('Body'))print (i.get('Body')).encode('utf-8')に変更すると、python pi.py >> pi.txtが正常に動作します。しかし、これは正しい方法ですか?

オペレーティングシステム - Ubuntuの。

+0

てみてください: '$ PYTHONIOENCODING = UTF8のpython pi.py >> py.txt'。 –

+0

Mark、ありがとう!しかし、どこでもうまくいくソリューションはありません。私は他のファイルにこの '$ PYTHONIOENCODING = UTF8のpython somefile.py >> somefile.txt'を使用する場合には、(同じUnicodeEncodeErrorをがスローされます)が動作しませんでした。私が解決策を見つけようとしたら、ここに投稿します。 – abT

+0

ファイルが明示的に出力をエンコードする場合、このメソッドは機能しません。スクリプトはUnicodeを出力し、端末にエンコーディングを決定させるだけでよい。 –

答えて

1

用途:

PYTHONIOENCODING=utf8 python pi.py >> py.txt 

しかし、あなたのスクリプトは、そのように明示的に、その出力をコードする場合:このメソッドは動作しません

print u'somestring'.encode('utf8') 

。コンソールがUTF-8に設定されている場合

print u'somestring' 

Pythonは自動的にUTF-8用にエンコードします:ただし、スクリプトはちょうどのように、Unicodeを印刷し、端末がエンコーディングを決定させる必要があります。あなたのリダイレクトケースについては

、PythonはUnicodeを印刷する際に使用するためにどのようなエンコーディングを知っているので、デフォルトasciiにしません。リダイレクションは、シェル関数であるため、使用してシェルにエンコーディングを指定残す:

PYTHONIOENCODING=utf8 python pi.py >> py.txt. 

これは、スクリプトを変更することなく、他のエンコーディングを使用するオープンオプションを残します。

関連する問題