在将代码从Python2移植到Python3时,我在从标准输入读取UTF-8文本时遇到了这个问题。在Python 2中,这可以很好地工作:
for line in sys.stdin:
...
但是Python3期望来自sys.stdin的ASCII码,如果输入中有非ASCII码字符,我会得到错误:
UnicodeDecodeError:'ascii‘编解码器无法解码字节..在位置..:序数不在范围内(128)
对于常规文件,我会在打开文件时指定编码:
with open('filename', 'r', encoding='utf-8') as file:
for line in file:
...
但是如何指定标准输入的编码呢?其他的SO帖子(例如How to change the stdin encoding on python)建议使用
input_stream = codecs.getreader('utf-8')(sys.stdin)
for line in input_stream:
...
然而,这在Python3中不起作用,我仍然得到相同的错误信息。我使用的是Ubuntu 12.04.2,我的locale设置为en_US.UTF-8。
发布于 2013-05-15 01:33:35
Python3不期望来自sys.stdin
的ASCII码。它将以文本模式打开stdin
,并对所使用的编码进行有根据的猜测。这种猜测可能会归结为ASCII
,但这并不是给定的。有关如何选择编解码器,请参阅sys.stdin
documentation。
与以文本模式打开的其他文件对象一样,sys.stdin
对象派生自io.TextIOBase
base class;它有一个指向底层缓冲IO实例的.buffer
属性(而后者又有一个.raw
属性)。
将sys.stdin.buffer
属性包装在新的io.TextIOWrapper()
instance中,以指定不同的编码:
import io
import sys
input_stream = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')
或者,在运行python时将PYTHONIOENCODING
environment variable设置为所需的编解码器。
从Python3.7开始,您还可以使用reconfigure the existing std*
wrappers,前提是您在开始时(在读取任何数据之前)执行此操作:
# Python 3.7 and newer
sys.stdin.reconfigure(encoding='utf-8')
https://stackoverflow.com/questions/16549332
复制相似问题