【问题标题】:Python unicode normalization issuePython unicode 规范化问题
【发布时间】:2014-02-03 13:01:56
【问题描述】:

我正在尝试转换其中包含一些 unicode 字符的文件并将其替换为普通字符。我遇到了一些问题并收到以下错误。

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 1-3: invalid data

我的文件如下所示:

ecteDV
ecteBl
agnéto

替换重音的代码如下:

 #!/usr/bin/python
 # -*- coding: utf-8 -*-

 import re, sys, unicodedata, codecs

 f = codecs.open(sys.argv[1], 'r', 'utf-8')
 for line in f:
     name = line.lower().strip()
     normal = unicodedata.normalize('NFKD', name).encode('ASCII', 'ignore')
     print normal
 f.close()

有没有办法可以替换所有重音并规范文件的内容?

【问题讨论】:

  • 您的输入文件已损坏;它包含无效的 UTF-8 数据。您是否 100% 确定它是 UTF-8 数据?
  • 你也没有调用f.close函数;你可以正常使用f.close(),或者使用f作为上下文管理器。
  • 'é' 不是 utf-8 的一部分吗?
  • UTF-8 是一种编码;它可以编码é,但也可以使用 ISO-8859 Latin 1 编码。许多其他编解码器也可以。
  • 我想做的事情是我有一个文件,它有像“é”这样的重音符号,我希望它们被普通字符替换。我可以通过使用普通的 re.sub() 函数来做到这一点,但我想使用 unicodedate。

标签: python unicode utf-8 codec


【解决方案1】:

请考虑您的文件可能不使用 UTF-8 作为编码。

您正在使用 UTF-8 编解码器读取文件,但解码失败。检查您的文件编码是否真的 UTF-8。

请注意,UTF-8 是多种编码中的一种,并不意味着“神奇地解码为 Unicode”。

如果您还不了解什么是编码(相对于 Unicode,这是一个相关但独立的概念),您需要阅读:

【讨论】:

    【解决方案2】:

    尝试使用以下代码打开文件并将 sys.argv[1] 替换为文件名。

    import re, sys, unicodedata, codecs
    
    with codecs.open("filename", 'r', 'utf-8') as f:
        for line in f:
            do something 
    
     f.close()
    

    【讨论】:

    • 如何解决文件数据中的错误?
    • 如果您想通过首先打开文件来查找文件中的错误,然后使用编解码器识别非 ASCII 字符,然后您可以循环进入文件中的行并查找错误。在我看来,您似乎是在尝试剥离代码并打开它,以便它识别非 ASCII,所以在我看来,问题在于文件的打开而不是文件内容本身。
    • 你不是在和 OP 说话,我没有发布这个问题。 OP 没有包含回溯,但它不是是导致解码错误的文件名,因为来自sys.argv[1] 的文件名没有被解码。但是文件contents 正在被解码。
    • 从我在 cmets 中的对话看来,OP 对 UTF-8 是什么 感到困惑;我怀疑该术语与 Unicode 混淆了。该文件可能不是以 UTF-8 编码的,而是其他一些编解码器。
    • 这就是打开文件时使用编解码器的目的。上面的代码适用于使用 utf-8 打开,以便解码/识别非 ASCII 字符,例如“é”。请原谅将您称为 OP,但回复与上述相同。
    猜你喜欢
    • 2013-05-04
    • 1970-01-01
    • 2011-04-06
    • 2011-12-08
    • 2023-03-06
    • 2018-04-16
    相关资源
    最近更新 更多