Python 3:如何指定stdin编码
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python 3:如何指定stdin编码,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1567字,纯文字阅读大概需要3分钟。
内容图文
参见英文答案 > How to change the stdin and stdout encoding on Python 2 4个
在将代码从Python 2移植到Python 3时,我在从标准输入读取UTF-8文本时遇到了这个问题.在Python 2中,这很好用:
for line in sys.stdin:
...
但Python 3期望来自sys.stdin的ASCII,如果输入中有非ASCII字符,我会收到错误:
UnicodeDecodeError: ‘ascii’ codec can’t decode byte .. in position ..: ordinal not in range(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:
...
但是,这在Python 3中不起作用.我仍然得到相同的错误消息.我正在使用Ubuntu 12.04.2,我的语言环境设置为en_US.UTF-8.
解决方法:
Python 3不期望sys.stdin中的ASCII.它将以文本模式打开标准输入,并对使用的编码进行有根据的猜测.这个猜测可能归结为ASCII,但这不是给定的.有关如何选择编解码器的信息,请参见sys.stdin documentation.
与在文本模式下打开的其他文件对象一样,sys.stdin对象派生自io.TextIOBase base class;它有一个.buffer属性,指向底层缓冲的IO实例(后者又有一个.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设置为所需的编解码器.
从Python 3.7开始,如果您在开始时(在读取任何数据之前)执行此操作,您也可以使用reconfigure the existing std* wrappers:
# Python 3.7 and newer
sys.stdin.reconfigure(encoding='utf-8')
内容总结
以上是互联网集市为您收集整理的Python 3:如何指定stdin编码全部内容,希望文章能够帮你解决Python 3:如何指定stdin编码所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。