gpt4 book ai didi

Python 2 和 3 兼容的字符串文件编写器

转载 作者:太空宇宙 更新时间:2023-11-03 14:45:09 27 4
gpt4 key购买 nike

我创建了一个 python 上下文管理器,它捕获所有输出 sys.stdout,例如使用 print(),并将其写入文件。

问题是我无法让它同时适用于 python 2.7 和 3.6。

上下文管理器内部使用

self.file_writer = open(self.log_file, 'w', encoding='utf8')

但是当我在 Python 2.7 中运行它时,则

print(u"a test string")

导致错误信息:

write() argument 1 must be unicode, not str

即使字符串显然是 unicode。

如果我将文件更改为

self.file_writer = open(self.log_file, 'wb')

然后它在 Python 2.7 中工作,但在 3.6 中不工作。

我需要做什么才能使其适用于任何 python 版本?

以下是经理的摘录:

PATH_PREFIX = "some/path/"
class manager:
def __init__(self):
self.log_file = os.path.join(PATH_PREFIX, 'log.txt')
def __enter__(self):
# create a file for logging
self.log_file_stream = open(self.log_file, 'w', encoding='utf8')
self.log_file_stream.__enter__()
# redirect stdout to this file
self.previous_stdout = sys.stdout
sys.stdout = self.log_file_stream
return self
def __exit__(self, etype, value, exception_traceback):
# stop redirecting stdout to the log file
sys.stdout = self.previous_stdout
# close the log file
self.log_file_stream.__exit__()

最佳答案

sys.stdout 在 Python 2 中是字节流,但在 Python 3 中是 Unicode 流。Python 2 的 print 将 Unicode 字符串编码为字节字符串在写入 stdout 之前,但是您已经将 sys.stdout 覆盖为 Python 2 和 Python 3 中的 Unicode 流。

覆盖 sys.stdout 时,您需要为 Python 2 提供字节流,但为 Python 3 提供 Unicode 流。您可以使用 sys.version_info.major决定支持哪个。

关于Python 2 和 3 兼容的字符串文件编写器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50119083/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com