2016-12-24 196 views
1

我使用python 2.7和我的代碼中使用中國字,所以......「ASCII」編解碼器不能編碼字符:有序不在範圍內(128)

# coding = utf-8 

和問題是我的代碼部分,如下所示:

def fileoutput(): 
    global percent_shown 
    date = str(datetime.datetime.now()).decode('utf-8') 
    with open("result.txt","a") as datafile: 
     datafile.write(date+" "+str(percent_shown.get())) 

percent_shown是包括中國文字

當我運行一個字符串,我得到:

UnicodeEncodeError:'ascii'編解碼器無法對位置0-2中的字符進行編碼:序號不在範圍內(128)

如何解決?謝謝

+0

請發佈堆棧跟蹤。至於你還沒有告訴我們哪條線有錯誤。 – tdelaney

+0

你能告訴我們什麼'print repr(percent_shown.get())'顯示?第一個問題可能是當你執行'str(percent_shown.get())'時,但由於我們不知道這是什麼,所以很難猜測。 – tdelaney

+0

此外,你寫入一個文件...你想用什麼編碼的文件? – tdelaney

回答

0

按照PEP 263,編碼聲明必須在正則表達式r"^[ \t\v]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)"所以你需要得到「編碼」和等號之間擺脫了空間的匹配:

# coding=utf-8 

這個聲明告訴Python的.py文件本身是UTF-8編碼,但不改變程序的其餘部分。如果你正在編寫unicode字面值,這很有用,但你仍然需要將它們轉換爲unicde來確保正常工作。

由於您沒有向我們展示您想要打印的內容,因此我找到了一些中文字符來演示。我不知道他們的意思是什麼......所以對任何我侮辱的人來說,

foo = u"學而設" # Good! you've got a unicode string 
bar = "學而設" # Bad! you've got a utf-8 encoded string that python 
       # thinks is ascii 

我認爲你可以通過一些調整來修復你的程序。首先,不要嘗試解碼datetime.now()。它只是ascii。它僅僅因爲你聲明瞭源文件編碼而沒有改變它的返回類型。其次,使用codecs模塊打開你使用的編碼文件(我假設它的utf-8)。現在,由於您使用的是unicode字符串,因此您可以直接將它們寫入文件。

import codecs 

def fileoutput(): 
    date = unicode(datetime.datetime.now()) 
    with codecs.open("result.txt","a", encoding="utf-8") as datafile: 
     datafile.write(date+" "+percent_shown.get()) 
+0

編解碼器是在Python 2.7中? –

+0

因此,在datefile.write()中將ascii日期時間字符串與中文字符中定義的中文字符結合起來會起作用嗎? –

+0

@NicholasHuang - 是的,'編解碼器是在python 2.7中,並允許您在打開文件時設置編碼。在我的例子中,我假設'percent_shown.get()'返回一個'unicode'對象,所以我將日期轉換爲unicode('unicode(datetime.datetime.now())'),現在寫入只有2個unicode字符串。它應該工作,但你必須嘗試它,讓我們知道! – tdelaney

0

在編碼註釋中,=之前不能有空格。嘗試:

# coding=utf-8 

見正則表達式:https://www.python.org/dev/peps/pep-0263/

+0

這是真的,但顯示的代碼都是ascii,所以它不能解決問題。我認爲在寫入文件時,會使用'str()'強制轉換。 – tdelaney

相關問題