UnicodeEncodeError:'ascii'编解码器不能编码字符u'\ u03c0'

时间:2016-05-14 19:17:43

标签: python-2.7 unicode

我正在尝试从pi.xml中的Body元素中提取属性值row

    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=

运行pi.pypython pi.py一样,一切都很好 但是,如果我尝试重定向输出并将pi.py作为python pi.py >> pi.txt运行 - 我收到一条错误消息 - UnicodeEncodeError:'ascii'编解码器无法编码位置101中的字符u'\ u03c0':序号不在范围(128)

如果我将print (i.get('Body'))更改为print (i.get('Body')).encode('utf-8'),则python pi.py >> pi.txt可以正常工作。但是,这是正确的方法吗?

操作系统 - Ubuntu。

1 个答案:

答案 0 :(得分:1)

使用:

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

但是如果您的脚本显式编码其输出,例如:

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

这种方法不起作用。但是,脚本应该只打印Unicode并让终端决定编码,如:

print u'somestring'

如果控制台配置为UTF-8,Python将自动编码为UTF-8。

对于重定向情况,Python不知道打印Unicode时要使用的编码,因此默认为ascii。由于重定向是shell函数,因此请使用以下命令将编码指定给shell:

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

这使得该选项可以在不修改脚本的情况下使用其他编码。