1

我正在读取 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()
4

1 回答 1

1

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

这解释了为什么您会在此行收到 Unicode解码错误:

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

因为你实际上做的是

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

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

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

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

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

于 2016-08-29T14:51:59.057 回答