【问题标题】:How to fix or remove malformed utf-8 characters in Python3如何在 Python3 中修复或删除格式错误的 utf-8 字符
【发布时间】:2019-08-04 14:17:23
【问题描述】:

我有几个文本文件包含 python 3 无法处理的字符。最麻烦的似乎是“关闭”引号。

我尝试使用以下方式读取文件:

with open(filename, 'r', errors='backslashreplace') as file:
    text = file.read()
with open(filename, 'w', errors='backslashreplace') as file:
    file.write(text)

当在 Notepad++ 中打开文件以查看字符时,我得到 xE2 x80 突出显示以指示非文本字符,然后是普通文本中的 \x9d

我看到this 处理\xE2\x80\x9D 字符。在 python REPL 中,我可以手动创建一个这样的字节对象,将其解码为 utf-8,打印时它显示为我期望的字符。我不确定为什么在读取文件时无法正确理解字符。

将文件读取到ignore 时出现错误,而不是backslashreplace,我仍然会出现xE2 X80 字符,我还没有弄清楚如何执行字符串操作来删除它们。

最终,我的目标是用普通引号替换所有这些奇怪的引号。我可以想象有几种方法可以实现这一点,但它们都需要我以某种方式解决(或删除)xE2 X80 字符,或者正确读取 3 字节的\xE2\x80\x9D 字符。

【问题讨论】:

  • 你试过.open(filename, 'r', encoding='utf8')吗?
  • 哇,我以为默认使用 utf8,但显然在读写时添加编码 utf8 解决了这个问题!如果您想将其添加为答案,我很乐意将其标记为正确。

标签: python unicode utf-8


【解决方案1】:

指定编码类型应该可以解决问题。你可以这样做,

with open(filename, 'r', encoding='utf8', errors='backslashreplace' ) as file:
    text = file.read()
with open(filename, 'w', encoding='utf8', errors='backslashreplace') as file:
    file.write(text)

【讨论】:

    【解决方案2】:

    创建省略错误字符的文件副本:

    def sanitize_file(original_filename, sanitized_filename):
        with open(original_filename, 'r', encoding='utf8', errors='ignore') as original_file:
            with open(sanitized_filename, 'w', encoding='utf8') as sanitized_file:
                sanitized_file.write(original_file.read())
    
    sanitize_file(filename, 'sanitized_' + filename)
    

    【讨论】:

    • 请在代码中添加一些解释。
    猜你喜欢
    • 2014-05-20
    • 2021-11-27
    • 2019-11-04
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多