在Python 3中,stdin
和stdout
是具有编码的TextIOWrappers,因此吐出普通字符串(而不是字节)。
我可以使用环境变量PYTHONIOENCODING更改正在使用的编码。是否还有一种方法可以在我的脚本中更改它?
答案 0 :(得分:5)
实际上TextIOWrapper
会返回字节。它采用Unicode字符串并以特定编码返回字节字符串。要更改sys.stdout
以在脚本中使用特定编码,这是一个示例:
Python 3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print('\u5000')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\dev\python32\lib\encodings\cp437.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u5000' in position 0: character maps to <undefined>>>> import io
>>> import io
>>> import sys
>>> sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')
>>> print('\u5000')
倀
(我的终端不是UTF-8)
sys.stdout.buffer
访问原始字节流。您还可以使用以下内容以特定编码写入stdout
:
sys.stdout.buffer.write('\u5000'.encode('utf8'))
答案 1 :(得分:0)
我很确定这是不可能的。它在文档中明确指出“如果在运行解释器之前设置了,它会覆盖用于stdin / stdout / stderr的编码”
我在尝试更改sys.__stdin__.encoding
时也遇到错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: readonly attribute
编辑:在python 2.x中,可以在脚本中更改stdin / out / err的编码。在python 3.x中,您似乎必须使用locale
(或在运行脚本之前从命令行设置环境变量)。
编辑:这对你来说很有意思http://comments.gmane.org/gmane.comp.python.ideas/15313
答案 2 :(得分:0)
由于Python 3.7 TextIOWrapper
具有reconfigure()
方法,该方法可以更改流设置,包括编码:
sys.stdout.reconfigure(encoding='utf-8')
一个警告:如果您尚未开始阅读sys.stdin
的编码,则只能更改它。