【问题标题】:read a file and try to remove all non UTF-8 chars读取文件并尝试删除所有非 UTF-8 字符
【发布时间】:2016-07-25 13:46:54
【问题描述】:

我正在尝试读取文件并将字符串转换为UTF-8 字符串,以便删除文件字符串中的一些非utf-8 字符,

file_str = open(file_path, 'r').read()
file_str = file_str.decode('utf-8')

但我收到以下错误,

AttributeError: 'str' object has no attribute 'decode'

更新:我尝试了答案建议的代码,

file_str = open(file_path, 'r', encoding='utf-8').read()

但它并没有消除非utf-8 字符,那么如何删除它们呢?

【问题讨论】:

  • 您使用的是 python 3 吗?在这种情况下,所有字符串都已经是 unicode 对象。你不需要解码。
  • 您使用的是 Python 3; open() 返回了一个已为您解码为 Unicode 的文件对象。 Python 3 str 是 Unicode 类型,它没有 decode() 方法,因为您无法进一步解码 Unicode。
  • 对于编码问题...请务必提及 Python 版本或相应地标记它..

标签: python python-3.x utf-8 decode


【解决方案1】:

删除.decode('utf8') 调用。您的文件数据已经被解码,因为在 Python 3 中,open() 使用文本模式(默认)调用返回了一个文件对象,该对象将数据解码为 Unicode 字符串为您.

您可能确实想将编码添加到open() 调用中以使其明确。否则 Python 使用系统默认值,可能不是 UTF-8:

file_str = open(file_path, 'r', encoding='utf8').read()

例如,在 Windows 上,对于 UTF-8 数据,默认编解码器几乎肯定会出错,但在您尝试阅读文本之前,您不会看到问题;你会发现你有一个Mojibake,因为 UTF-8 数据是使用 CP1252 或类似的 8 位编解码器解码的。

有关详细信息,请参阅open() function documentation

【讨论】:

  • 这只是读取一个 UTF-8 编码的文件。 OP 要求在读取包含一些脏字符的文件时忽略非 UTF-8 字符的方法。当读取脏字符时,此答案会导致UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in position 80189: invalid continuation byte
  • @mareoraft:OP 从未正确指定 非 UTF8 字符 的含义,他们希望在解码后将其删除。对于具有一些无效数据的文件,您可以使用不同的错误处理程序,例如errors='ignore'errors='escape'errors='surrogateescape'。见docs.python.org/3/library/codecs.html#error-handlers
  • @mareoraft:请确保 100% 确定文件意味着可解码为 UTF-8。 UTF-8 可以抵抗某些损坏,忽略或替换错误值不会使后续正确的数据不可读。
【解决方案2】:

如果你使用

file_str = open(file_path, 'r', encoding='utf8', errors='ignore').read()

,那么非 UTF-8 字符将基本上被忽略。阅读open() function documentation 了解详情。文档中有一节介绍了errors 参数的可能值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2015-05-12
    • 2020-06-01
    • 2014-12-09
    相关资源
    最近更新 更多