Python UnicodeDecodeError:' ascii'编解码器不能解码字节0xc3

时间:2016-08-29 13:51:39

标签: python parsing configparser python-config

我在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()

1 个答案:

答案 0 :(得分:1)

如果将python2from __future__ import unicode_literals一起使用,那么您编写的每个字符串文字都是一个unicode文字,就好像您将每个文字加上u"..."作为前缀,除非您明确写入{{1} }。

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

b"..."

因为你实际做的是

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

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

所以要做好这项工作,你可以

  • 对字节字符串使用显式前缀:what
  • 或删除what.replace(b" = ", b"=", 1)以后的导入。

通常你不应该混合unicode_litrealsunicode(python3通过在几乎任何情况下都使它成为错误来解决这个问题)。您应该知道str将每个非前缀文字更改为unicode,并且不会自动更改您的代码以在所有情况下使用unicode。在许多情况下恰恰相反。