Python UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3

Python UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3

我正在读取配置文件 python 获取部分并为每个部分创建新的配置文件。

但是..我收到解码错误,因为其中一个字符串包含 Español=spain

self.output_file.write( what.replace( " = ", "=", 1 ) )
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)

我将如何调整我的代码以允许此类编码字符?我对此很陌生,所以如果这很简单,请原谅..

class EqualsSpaceRemover:
    output_file = None
    def __init__( self, new_output_file ):
        self.output_file = new_output_file

    def write( self, what ):
        self.output_file.write( what.replace( " = ", "=", 1 ) )

def get_sections():
    configFilePath = 'C:\test.ini'
    config = ConfigParser.ConfigParser()
    config.optionxform = str
    config.read(configFilePath)
    for section in config.sections():
        configdata = {k:v for k,v in config.items(section)}
        confignew = ConfigParser.ConfigParser()
        cfgfile = open("C:\" + section + ".ini", 'w')
        confignew.add_section(section)
        for x in configdata.items():
            confignew.set(section,x[0],x[1])
        confignew.write( EqualsSpaceRemover( cfgfile ) )
        cfgfile.close()

如果您将 python2from __future__ import unicode_literals 一起使用,那么您编写的每个字符串文字都是一个 unicode 文字,就好像您会在每个文字前加上 u"..." 前缀,除非您明确地写 b"...".

这解释了为什么你在这一行得到 Unicode解码错误:

what.replace(" = ", "=", 1)

因为你实际做的是

what.replace(u" = ",u"=",1 )

ConfigParser 在使用 parser.read() 方法读取文件时使用普通的旧 str 作为其项目,这意味着 what 将是 str .如果您使用 unicode 作为 str.replace() 的参数,则字符串将转换(解码)为 unicode,应用替换并将结果作为 unicode 返回。但是,如果 what 包含无法使用默认编码解码为 un​​icode 的字符,那么你会得到一个 UnicodeDecodeError 而你不会想到一个。

所以要完成这项工作,您可以

  • 为字节串使用显式前缀:what.replace(b" = ", b"=", 1)
  • 或删除 unicode_litreals 未来的导入。

一般来说,您不应该混合使用 unicodestr(python3 通过在几乎任何情况下都将其设为错误来修复此问题)。您应该知道 from __future__ import unicode_literals 将每个非前缀文字更改为 unicode,并且不会在所有情况下自动更改您的代码以使用 unicode。在很多情况下恰恰相反。