【问题标题】:Python unicode errors while writing to file写入文件时出现 Python unicode 错误
【发布时间】:2015-10-15 06:42:27
【问题描述】:

我正在使用 Python 2.7 解析一堆网页并从中获取内容,但是这些网页包含诸如“”和“”之类的字符,它们都以某种方式转换为“Äô”。这给了我一个文件,其内容看起来像这样(不包括引号):“我认为这很重要......”

使用print() 方法在终端中可以很好地打印字符串,但使用print >> file, stringfile.write(string) 似乎无法获得相同的效果。显然这是一个编码问题,但我没有成功地寻找解决这个问题的方法。我正在像这样打开文件:file = codecs.open("file.txt","w+", encoding='utf-8') 并且我正在使用 BeautifulSoup4 的 getText() 方法为字符串分配它们的值。有没有办法解决这个问题?

【问题讨论】:

标签: python string file-io unicode encoding


【解决方案1】:

尝试在函数开头添加以下代码,这将解决您的问题。

        import sys
        reload(sys)
        sys.setdefaultencoding('utf8')

【讨论】:

  • 这是一个令人讨厌的修复所有黑客。你会很快发现它掩盖了其他问题,因为你用大锤敲碎了坚果
  • 这可能修复了未定义编码的输入或输出
【解决方案2】:

你可以试着写成:

file.write(output_str.encode('utf-8', 'ignore'))

【讨论】:

    【解决方案3】:

    在代码开头强制执行 utf8 编码:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    myfile = open('./myfile.txt', 'w')
    myfile.write("I think it's important to be able to see all characters")
    myfile.write("\nIt woùld be Ñìçè to see foreign letters as well")
    myfile.write("\n")
    myfile.close()
    

    【讨论】:

    • 这只是意味着您的源代码中的非ASCII可以被正确解释。当你创建 Unicode 对象时,它真的有任何意义,而你不是
    【解决方案4】:

    一些源代码会很好。

    BeautifulSoup 通常可以很好地猜测给定字符串的编码:

    from bs4 import BeautifulSoup as bs4
    
    >>> print bs4("\x80", "html.parser").text # Windows 1252
    €
    
    >>> print bs4("\xe2\x82\xac", "html.parser").text # UTF-8
    €
    

    除非它不能:

    >>> print bs4("\xa4", "html.parser").text # ISO-8859-15
    ¤
    

    因此,您应该向 BeautifulSoup 传递一个解码后的 Unicode:

    >>> print bs4("\xa4".decode("iso-8859-15"), "html.parser").text # ISO-8859-15
    €
    

    这意味着您的输入数据需要正确解码。使用io.open(filename, "r", encoding="utf-8")(或适当的编码)打开输入文件。

    如果拉取远程网站,请检查“Content-type”标头或使用请求,它会在响应对象的.text 属性中返回解码后的 Unicode。

    在写入文件时,使用编解码器模块是正确的想法。 io 模块是执行此操作的较新方法。

    当您将所有这些放在一起时,您将写入已正确编码的数据。

    【讨论】:

      猜你喜欢
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      相关资源
      最近更新 更多