在 Python 2 中设置默认输出编码是一个众所周知的习惯用法:
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)
这将sys.stdout对象包装在以 UTF-8 编码输出的编解码器编写器中。
sys.stdout
然而,这种技术在 Python 3 中不起作用,因为它sys.stdout.write()期望的是str,但编码的结果却是,因此在尝试将编码后的字节写入原始时bytes会发生错误。codecs``sys.stdout
sys.stdout.write()
str
bytes
codecs``sys.stdout
在 Python 3 中执行此操作的正确方法是什么?
在 Python 3 中,处理输出编码需要不同的方法,因为sys.stdout类似的 I/O 流需要 Unicode 字符串(str),而不是字节字符串(bytes)。在 Python 2 中,codecs.getwriter()可用于包装sys.stdout以达到编码目的,但在 Python 3 中,编码通常更直接、更隐式地处理。
codecs.getwriter()
您不应sys.stdout使用编解码器编写器进行包装,而应在打开或创建文件对象或 I/O 流时设置编码。但是,如果您需要确保所有输出都采用 UTF-8 编码,则可以设置环境变量PYTHONIOENCODING或使用sys.stdoutwith io.TextIOWrapper。
PYTHONIOENCODING
io.TextIOWrapper
以下是在 Python 3 中处理输出编码的几种方法:
您可以在运行脚本之前将PYTHONIOENCODING环境变量设置为。这将影响标准 I/O 流使用的编码。utf-8
utf-8
export PYTHONIOENCODING=utf-8 python your_script.py
sys.stdout``io.TextIOWrapper
您可以使用io.TextIOWrapper来包装sys.stdout并指定编码。此方法允许您设置编码 osys.stdout以编程方式。
import sys import io # Reassign sys.stdout to use UTF-8 encoding sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding= sys.stdout = io.TextIOWrapper(sys.stdout.buffe 'utf-8') # Example usage print("This will be printed in UTF-8 encoding")
如果你
with open('output.txt', 'w', encoding='utf-8') as f: f.write( f.w "This will be written to the file in UTF-8 encoding")
sys.stdout.buffer
encoding='utf-8'
通过使用这些方法,您可以在 Python 3 中有效地处理 UTF-8 编码。