2011-03-30 76 views
42

我正在使用python 2.6.5 我想將一些日文字符寫入文件。 我得到這個錯誤&我不知道如何改變編碼。如何將unicode字符串寫入文件?

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'> 

回答

65

你將不得不'編碼'unicode字符串。

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

嘗試這對於一個有點友好看看Unicode和蟒蛇:http://farmdev.com/talks/unicode/

66

作爲替代方案,可以使用codecs模塊:

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

謝謝您的建議。 – 2011-03-31 00:41:08

9

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+都一樣。

+7

哈哈「做一個備份,以防萬一」 – 2013-08-20 10:28:29

3

在我的腳本的開頭插入這個趨向於解決unicode問題。

import sys 
reload(sys) 
sys.setdefaultencoding('utf8') 
+0

我很驚訝這不是被接受的答案。非常簡單,並且確實可以解決unicode問題 – 2015-09-03 21:46:46

+0

@HomunculusReticulli:(1)這是一個非常糟糕的建議(2)它不回答以下問題:*「如何將unicode字符串寫入文件?」* – jfs 2016-01-29 13:42:14

+0

這是隻有Python 2?有沒有Python 3.x的等價物? – 2016-09-15 17:30:57

相關問題