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一次参数.
| 归档时间: |
|
| 查看次数: |
12499 次 |
| 最近记录: |