如何将Unicode字符串写入文件?

56

我正在使用Python 2.6.5版本。 我想将一些日语字符写入文件。 但我遇到了以下错误,而且不知道如何更改编码。

Python 2.6.5 (r265:79063, Jun 12 2010, 17:07:01)
[GCC 4.3.4 20090804 (release) 1] on cygwin
>>> s = u'\u5E73\u621015'
>>> with open("yop", "wb") as f:
...   f.write( s + "\n" );
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: 
  ordinal not in range(128)
>>> type( s )
<type 'unicode'>
4个回答

85

你需要对 Unicode 字符串进行“编码”处理。

s = u'\u5E73\u621015'
with open("yop", "wb") as f:
   f.write(s.encode("UTF-8"))

尝试查看这个链接,它提供了一些友好的关于 Unicode 和 Python 的信息:http://farmdev.com/talks/unicode/


有没有一种方法可以在文本文件中写入真正的Unicode字符,比如丹麦语?我的意思是我不想在文件中看到像"\u5E73"这样的字符,我希望它在文件内部看起来像真正的字符。 - Ali Sajjad

76

做为替代,你可以使用 codecs 模块:

import codecs
s = u'\u5E73\u621015'
with codecs.open("yop", "w", encoding="utf-8") as f:
    f.write(s)

12

codecs.open()在2.6中的功能与Python3.x内置的open()函数非常相似(因为Py3k字符串总是Unicode)。如果你的代码可能在Py3k中使用,为了提高代码的未来性,可以这样做。

import sys

if sys.version_info[0] < 3:
    import codecs
    _open_func_bak = open # Make a back up, just in case
    open = codecs.open

with open('myfile', 'w', encoding='utf-8') as f:
    f.write(u'\u5E73\u621015')

现在你的代码应该在2.x和3.3+中都能正常工作。


5
在我的脚本开头插入这个通常可以解决Unicode问题。
import sys
reload(sys)
sys.setdefaultencoding('utf8')

我很惊讶这不是被采纳的答案。非常简单,确实解决了Unicode问题。 - Homunculus Reticulli
1
@HomunculusReticulli:(1)总的来说,这是一个糟糕的建议。(2)它没有回答问题:“如何将Unicode字符串写入文件?” - jfs
1
这只是Python 2吗?有Python 3.x的等效版本吗? - Eliezer Miron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接