[英]How do I write data to disk in UTF-8 encoding in Python?
以下Python代碼...
html_data = urllib2.urlopen(some_url).read()
f = codecs.open(filename, 'w', encoding='utf-8')
f.write(html_data)
f.close()
...有時會因UnicodeDecodeError
失敗...
File "/.../lib/python2.6/codecs.py", line 686, in write
return self.writer.write(data)
File "/.../lib/python2.6/codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 5605: ordinal not in range(128)
我的問題:
urllib2.urlopen(some_url).read()
調用始終返回UTF-8? codecs.open(...)
調用有什么問題,阻止它以UTF-8編碼將數據存儲到磁盤上嗎? 問題不codecs.open
,而是通過傳遞.write
一個字節字符串(給定其中的\\xd0
代碼)清楚地以某些ISO-8859-*
或相關編解碼器進行編碼。
urllib2.urlopen返回一個響應對象,該響應對象除了具有類似文件的行為外,還作為附加方法:
info()
—以httplib.HTTPMessage
實例的形式返回頁面的元信息,例如標頭(請參閱HTTP標頭快速參考 )
特別是對於類似文本的內容, Content-Type
標頭應具有一個charset
參數,用於指定其使用的編碼,例如Content-Type: text/html; charset=ISO-8859-4
Content-Type: text/html; charset=ISO-8859-4
。 您需要解析和隔離charset
然后使用它將內容解碼為Unicode(因此,您的codecs.open
ed類似於文件的對象始終會獲取unicode參數以進行write
並在utf-8
正確地將其寫出)。
如果缺少charset
,或者使用charset
解碼文本會導致錯誤(建議charset
是錯誤的),作為拯救的最后希望,您可以嘗試使用啟發式方法的通用編碼檢測器 (畢竟,網絡上有很多頁面)具有可怕的元數據錯誤,以及損壞的HTML等)。
例:
data = urlopen(uri).read().decode(encoding)
f = open(file_name, 'wb')
f.write(data.encode('utf-8'))
f.close()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.