[英]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.