我正在尝试从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.py
和python 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。
答案 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.
这使得该选项可以在不修改脚本的情况下使用其他编码。