5

在 Python 3 中,stdinstdout具有编码的 TextIOWrapper,因此会输出普通字符串(不是字节)。

我可以更改与环境变量PYTHONIOENCODING一起使用的编码。还有一种方法可以在我的脚本本身中更改它吗?

4

3 回答 3

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'))
于 2012-10-10T15:29:33.320 回答
2

由于 Python 3.7TextIOWrapper有一个reconfigure()可以更改流设置的方法,包括编码:

sys.stdout.reconfigure(encoding='utf-8')

sys.stdin一个警告:如果您还没有开始阅读,您只能更改编码。

于 2018-09-17T23:21:22.490 回答
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

于 2012-10-10T12:21:54.470 回答