2011-11-20 51 views
0

不知道如何解決UnicodeDecodeError蟒蛇,編解碼器,file.writelines()的UnicodeDecodeError

我不能寫文本文件 - >UnicodeDecodeError有關字符â = '0xe2'

肯定

1)â = '0xe2'漢字不在該字符串

2)re.search無法找到字符串,而我試圖在â字符寫file.writelines(string)

3)有定義存在errors='replace'在文件打開,因此file.writelines()不應該抱怨字符錯誤。

File=codecs.open(fname, 'w','utf-8', errors='replace') 

lines=smart_str(lines, 'utf-8', strings_only=False, errors='replace') 
# lines is 'some webpage text after BeautifulSoup.prettify which does not contain letter â ='0xe2', which is converted with Django smart_str to string' 

FileA.writelines(lines) #gives UnicodeDecodeError : 'ascii' codec can't decode byte 0xe2 in position 9637: ordinal not in range(128). 

myre = re.compile(r'0xe2', re.UNICODE) # letter â = '0xe2' 
print re.search(myre, lines) #gives None 
linessub=myre.sub('', lines) 
print re.search(myre, linessub) #gives None 

FileA.writelines(lines) #gives UnicodeDecodeError : 'ascii' codec can't decode byte 0xe2 in position 9637: ordinal not in range(128). 
+0

如果你想測試一個字符串是否包含一個子,只是在's',而不是這個're'東西「\ XE2」,這無論如何不能工作,因爲''0xe2 '!='\ xe2''。 – yak

回答

3

您使用codecs.open讓你的文件對象預計unicode字符串,而不是字節字符串。

使用此函數的要點是,在將它們寫入文件之前,您不必自己編碼字符串。您編寫unicode字符串,文件對象將在內部編碼它們。

它看起來像smart_str返回UTF-8編碼的字符串(看到您將編碼名稱傳遞給它)。如果你將它傳遞給需要編解碼器的文件對象,它需要unicode,它將首先嚐試將字節串解碼回unicode。因爲它不知道傳入的字符串的編碼,它將使用ascii。而這也正是這個錯誤來自因爲字符串不是ASCII,這是UTF-8:

UnicodeDecodeError : 'ascii' codec can't decode... 

所以,你要跳過編碼階段由smart_str做,簡單的寫unicode字符串的文件,或者,從codecs.open()切換到正常的open()它與字節一起工作,並且因此期望已經編碼的字節字符串。

順便說一句,您對0xE2字符存在的測試將無法正常工作。首先,您使用r'0xe2'作爲模式,它只是一個4個字符的字符串,而不是一個單一的0xE2字符。其次,你不需要re這樣簡單的事情。剛剛嘗試這一點:

print '\xe2' in your_str 
+0

問題是如何解決有關字符'0xe2'的UnicodeDecodeError,當我嘗試將文本「行」寫入文件時出現。 –

+0

我的意思是這個字符當然不存在於文本中。這種錯誤是如何發生的,我應該怎麼做呢? –

+0

我需要smart_str,因爲我在寫入文件之前在字符串上執行搜索,這裏沒有顯示。在搜索後,我得到這些錯誤,我無法將字符串寫入任何文件,既不打開簡單打開也不打開與codecs.open(...)。 –

相關問題