write() - 在Python 3.x中编码的字符串

Tom*_*Tom 5 unicode python-3.x

我有一个unicode字符串,我想写入一个文件.

在Python 2中我可以写:

open('filename', 'w').write(s.encode('utf-8'))
Run Code Online (Sandbox Code Playgroud)

但是这对于Python 3来说是失败的.显然,s.encode()返回类型为'bytes'的东西,write()函数不接受:

TypeError: must be str, not bytes
Run Code Online (Sandbox Code Playgroud)

有谁知道如何将上述代码移植到Python 3?

编辑:

感谢所有建议使用二进制模式的人!不幸的是,这会导致\n字符出现问题.有没有办法实现与Python 2相同的结果(即在UTF-8中编码非ANSI字符,同时保持\n的特定于操作系统的再现)?

谢谢!

tch*_*ist 14

希望手动编码这样的每一个数据!只需将编码作为参数传递给open,如下所示:

#!/usr/bin/env python3.2

slist = [
    "Ca\N{LATIN SMALL LETTER N WITH TILDE}on City",
    "na\N{LATIN SMALL LETTER I WITH DIAERESIS}vet\N{LATIN SMALL LETTER E WITH ACUTE}",
    "fa\N{LATIN SMALL LETTER C WITH CEDILLA}ade",
    "\N{GREEK SMALL LETTER BETA}-globulin"
]

with open("/tmp/sample.utf8", mode="w", encoding="utf8") as f:
    for s in slist:
        print(s, file=f)
Run Code Online (Sandbox Code Playgroud)

现在,如果你是你制作的文件,你会看到它说:

$ cat /tmp/sample.utf8
Cañon City
naïveté
façade
?-globulin
Run Code Online (Sandbox Code Playgroud)

你可以通过这种方式看到那些是正确的代码点:

$ uniquote -x /tmp/sample.utf 
Ca\x{F1}on City
na\x{EF}vet\x{E9}
fa\x{E7}ade
\x{3B2}-globulin
Run Code Online (Sandbox Code Playgroud)

看看有多容易?让流对象为您处理任何低级编码或解码.

简介:当您所做的只是使用它们处理同一个流中的所有流时,不要打电话encode或打电话给decode您.这对于零增益来说太麻烦了.只使用encoding一次参数.

  • 没理由不在3.2中使用`with`.另外,`f.close()`,而不是`f.close`. (2认同)

Art*_*jka 3

以二进制模式打开文件,就更改而言,这是侵入性最小的方式。

另一方面,您可以使用 open() 设置输出文件编码,并完全避免显式字符串编码。

您可能想阅读open()函数的手册。