首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python 3:如何指定stdin编码

Python 3:如何指定stdin编码
EN

Stack Overflow用户
提问于 2013-05-15 01:30:58
回答 1查看 25K关注 0票数 42

在将代码从Python2移植到Python3时,我在从标准输入读取UTF-8文本时遇到了这个问题。在Python 2中,这可以很好地工作:

代码语言:javascript
复制
for line in sys.stdin:
    ...

但是Python3期望来自sys.stdin的ASCII码,如果输入中有非ASCII码字符,我会得到错误:

UnicodeDecodeError:'ascii‘编解码器无法解码字节..在位置..:序数不在范围内(128)

对于常规文件,我会在打开文件时指定编码:

代码语言:javascript
复制
with open('filename', 'r', encoding='utf-8') as file:
    for line in file:
        ...

但是如何指定标准输入的编码呢?其他的SO帖子(例如How to change the stdin encoding on python)建议使用

代码语言:javascript
复制
input_stream = codecs.getreader('utf-8')(sys.stdin)
for line in input_stream:
    ...

然而,这在Python3中不起作用,我仍然得到相同的错误信息。我使用的是Ubuntu 12.04.2,我的locale设置为en_US.UTF-8。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中,以指定不同的编码:

代码语言:javascript
复制
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,前提是您在开始时(在读取任何数据之前)执行此操作:

代码语言:javascript
复制
# Python 3.7 and newer
sys.stdin.reconfigure(encoding='utf-8')
票数 87
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16549332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档