繁体   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