Python的3:如何指定标准输入编码[复制](Python 3: How to specify s

2019-09-03 04:55发布

这个问题已经在这里有一个答案:

  • 如何更改标准输入编码的蟒蛇 4个回答

虽然移植在Python 2到Python 3代码,我读取标准输入的UTF-8文本时遇到了这个问题。 在Python 2,这工作得很好:

for line in sys.stdin:
    ...

但是Python 3预计从sys.stdin ASCII,如果有输入非ASCII字符,我得到的错误:

UnicodeDecodeError错误:“ASCII”编解码器不能在位置解码字节.. ..:在范围序数不(128)

对于一个普通的文件,我会在打开文件时指定编码方式:

with open('filename', 'r', encoding='utf-8') as file:
    for line in file:
        ...

但我怎么能指定标准输入编码? 其他SO职位(例如如何改变蟒蛇标准输入编码 )使用建议

input_stream = codecs.getreader('utf-8')(sys.stdin)
for line in input_stream:
    ...

然而,这并不工作在Python 3我仍然得到同样的错误消息。 我使用Ubuntu 12.04.2和我的语言环境设置为en_US.UTF-8。

Answer 1:

Python 3里并不指望从ASCII sys.stdin 。 它会打开stdin在文本模式下,使一个受过教育的猜测是用于什么编码。 这可以猜测归结为ASCII ,但是这不是一个给定的。 见sys.stdin文件的编解码器是如何选择的。

像在文本模式下打开的其他文件中的对象,则sys.stdin对象从所述派生io.TextIOBase基类 ; 它有一个.buffer指向底层缓冲IO实例(其又具有属性.raw属性)。

包裹sys.stdin.buffer为新的属性io.TextIOWrapper()实例来指定不同的编码:

import io
import sys

input_stream = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')

可替换地,设置PYTHONIOENCODING环境变量运行时蟒到所需的编解码器。

通过Python 3.7起,您还可以重新配置现有std*包装 ,只要你做到这一点在启动(所有数据已被阅读前):

# Python 3.7 and newer
sys.stdin.reconfigure(encoding='utf-8')


文章来源: Python 3: How to specify stdin encoding [duplicate]