我在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()
答案 0 :(得分:1)
如果将python2
与from __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_litreals
和unicode
(python3通过在几乎任何情况下都使它成为错误来解决这个问题)。您应该知道str
将每个非前缀文字更改为unicode,并且不会自动更改您的代码以在所有情况下使用unicode。在许多情况下恰恰相反。