簡體   English   中英

如何在Python中以UTF-8編碼將數據寫入磁盤?

[英]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等)。

  1. AFAIK,您不能這樣做。 但是,您可以檢測標頭/ html中的編碼並重新編碼。
  2. 我不知道。 我一直使用二進制模式進行編寫,並且始終有效

例:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM