gpt4 book ai didi

python - 如何使用相同的代码在 python 2 和 3 中将 unicode 文本写入文件?

转载 作者:太空宇宙 更新时间:2023-11-03 12:54:08 25 4
gpt4 key购买 nike

我正在尝试编写一个可以通过 python 2 和 3 运行的程序。它从网站读取字符并写入文件。我已经从 __future__ 导入了 unicode_literals

直接尝试写一个看起来像这样的字符串:

txt = u'his$\u2026\n'

将导致 UnicodeEncodeError:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2026' in position 4: ordinal not in range(128)

在 python2 中将其写入文件的唯一方法是:

fp = open("/tmp/test", "w")
txt2 = txt.encode('utf-8')
fp.write(txt2) # It works
type(txt2) # str - that is why it works

但是,尝试在 python3 中重用相同的代码是行不通的,因为在 python 3 中,

type(txt2) # is byte type

例如

txt.encode('utf-8')
b'his$\xe2\x80\xa6\n'

强制执行 fp.write(txt2) 将抛出 TypeError:

TypeError: write() argument must be str, not bytes

因此,txt = u'his$\u2026\n' 能否在 python 2 和 3 中使用相同的代码块写入文件中。(除了在 fp 上使用包装器。写)

最佳答案

你说:

The only way to write it to a file in python2 is:

fp = open("/tmp/test", "w")
txt2 = txt.encode('utf-8')
fp.write(txt2) # It works

但事实并非如此。有很多方法比这更好。一种显而易见的方法是使用 io.open .在 3.x 中,这与内置的 open 功能相同。在 2.6 和 2.7 中,它实际上是 3.x 内置函数的向后移植。这意味着您在两个版本中都获得了 3.x 风格的 Unicode 文本文件:

fp = io.open("/tmp/test", "w", encoding='utf-8')
fp.write(txt2) # It works

如果您需要与 2.5 或更早版本兼容——或者可能是 2.6 和 3.0(它们支持 io.open,但在某些情况下速度很慢),您可以使用旧方法,codecs.open :

fp = codecs.open("/tmp/test", "w", encoding='utf-8')
fp.write(txt2) # It works

两者之间存在本质上的差异,但是您编写的大多数代码不会对底层原始文件或编码器缓冲区或除了基本的类文件对象 API 之外的任何其他内容感兴趣,因此您也可以如果 io 不可用,请使用 try/except ImportError 回退到 codecs

关于python - 如何使用相同的代码在 python 2 和 3 中将 unicode 文本写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49702626/

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