如何在Python中以UTF-8编码将数据写入磁盘?

如何在Python中以UTF-8编码将数据写入磁盘?,python,unicode,utf-8,Python,Unicode,Utf 8,下面的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(da

下面的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
  • 我的
    编解码器是否有任何问题。打开(…)
    调用会阻止它以UTF-8编码将数据存储到磁盘
  • 好吧,你不能那样做。但是,您可以从header/html中检测编码并重新编码
  • 我不知道。我一直使用二进制模式进行写作,而且一直都很有效
  • 例如:

    data = urlopen(uri).read().decode(encoding)
    f = open(file_name, 'wb')
    f.write(data.encode('utf-8'))
    f.close()
    
  • 好吧,你不能那样做。但是,您可以从header/html中检测编码并重新编码
  • 我不知道。我一直使用二进制模式进行写作,而且一直都很有效
  • 例如:

    data = urlopen(uri).read().decode(encoding)
    f = open(file_name, 'wb')
    f.write(data.encode('utf-8'))
    f.close()
    

    问题不在于
    编解码器。打开
    ——问题在于传递到
    。写入
    一个字节字符串(给定
    \xd0
    代码),该字节字符串在某些
    ISO-8859-*
    或相关编解码器中明确编码

    返回一个响应对象,该对象除了类似文件的行为外,还作为额外方法:

    info()
    -返回元信息 中的页面,例如页眉
    httplib.HTTPMessage的形式
    实例(见)

    尤其是
    内容类型
    标题,对于类似文本的内容,应具有
    字符集
    参数,指定其使用的编码,例如
    内容类型:text/html;字符集=ISO-8859-4
    。您需要解析和隔离
    字符集
    ,并使用它将内容解码为Unicode(因此您的
    编解码器。open
    ed file like对象始终获取要写入的Unicode参数,并在
    utf-8
    中正确写入)


    如果
    字符集
    丢失,或者使用它来解码文本会导致错误(表明
    字符集
    是错误的),作为拯救的最后希望,您可以尝试使用启发式的方法(毕竟,web上的许多页面都有可怕的元数据错误,以及破坏的HTML等等).

    问题不在于
    编解码器。打开
    ——问题在于传递到
    。编写
    一个字节字符串(给定其中的
    \xd0
    代码),该字符串在某些
    ISO-8859-*
    或相关编解码器中明确编码

    返回一个响应对象,该对象除了类似文件的行为外,还作为额外方法:

    info()
    -返回元信息 中的页面,例如页眉
    httplib.HTTPMessage的形式
    实例(见)

    尤其是
    内容类型
    标题,对于类似文本的内容,应具有
    字符集
    参数,指定其使用的编码,例如
    内容类型:text/html;字符集=ISO-8859-4
    。您需要解析和隔离
    字符集
    ,并使用它将内容解码为Unicode(因此您的
    编解码器。open
    ed file like对象始终获取要写入的Unicode参数,并在
    utf-8
    中正确写入)


    如果
    字符集
    丢失,或者使用它来解码文本会导致错误(表明
    字符集
    是错误的),作为拯救的最后希望,您可以尝试使用启发式的方法(毕竟,web上的许多页面都有可怕的元数据错误,以及破坏的HTML等等)。

    ,HTML的默认字符集是“iso-8859-1”,因此如果没有声明任何字符集,则应为iso-8859-1。当然,HTML是一个杂乱无章的世界,所以不能保证没有字符集的文档实际上是iso-8859-1。@Ned,说得好,但我还是会尝试UED以防万一(当然它不能区分不同的iso-8859-etc类或类似CP1252的同源词,但至少它是一个安全的“B计划”;-),HTML的默认字符集是“iso-8859-1”,因此如果没有声明任何字符集,则应为iso-8859-1。当然,HTML是一个杂乱无章的世界,所以不能保证一个没有字符集的文档实际上是iso-8859-1。@Ned,说得好,但我还是会尝试UED以防万一(当然它不能区分各种iso-8859-etc类或类似CP1252的同源词,但至少它是一个安全的“B计划”;-)。