Python UnicodeDecodeError:';ascii';编解码器可以';t解码字节0xc3

Python UnicodeDecodeError:';ascii';编解码器可以';t解码字节0xc3,python,parsing,configparser,python-config,Python,Parsing,Configparser,Python Config,我正在python中读取一个配置文件,获取部分并为每个部分创建新的配置文件 然而。。我收到一个解码错误,因为其中一个字符串包含Español=Spanish self.output_file.write( what.replace( " = ", "=", 1 ) ) UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128) 我将如何调整我的代码以允许这样的

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

然而。。我收到一个解码错误,因为其中一个字符串包含
Español=Spanish

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

如果将
python2
与来自未来的
导入unicode文本的
一起使用,那么您编写的每个字符串文本都是unicode文本,就像您将每个文本都以
u“…”
作为前缀一样,除非您显式编写
b”…

这就解释了为什么这一行出现UnicodeDecodeError:

what.replace(" = ", "=", 1)
因为你实际上做的是

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

所以要让这一切顺利,你可以

  • 对字节字符串使用显式前缀:
    what.replace(b“=”,b“=”,1)
  • 或者删除将来导入的
    unicode\u litreals

一般来说,您不应该将
unicode
str
混用(python3几乎在任何情况下都会将其作为错误来修复)。您应该知道,
from\uuuuu future\uuuu导入unicode\u文本
会将每个无前缀的文本更改为unicode,并且不会自动将代码更改为在所有情况下都使用unicode。很多情况下正好相反。

检查是否
what.replace(“=”,“=”,1).编码('utf-8')
我刚刚测试过,它给了我以下信息:
self.output_file.write(what.replace(“=”,“=”,1).编码('utf-8'))UnicodeDecodeError:'ascii'编解码器无法解码第4位的字节0xc3:序号不在范围内(128)
删除第一行(+使用utf-8创建)!对不起,如果我很愚蠢,你是什么意思?这是我第一次使用编码,如果用
utf-8
打开文件会怎么样?像
导入编解码器;codecs.open(“C:\\”+section+“.ini”,“w',encoding='utf-8'))
这似乎不是解决问题的“正确”方法。这个解决方案忽略了文本的字符编码,希望得到最好的结果。更好的解决方案是确保以正确的字符编码打开配置文件(读取和写入)(根据OP已删除的答案,显示为utf-8)。默认情况下,py2使用操作系统的默认编码(似乎不是utf-8)。@Dunes-在python2
ConfigParser
中,配置文件不采用任何编码,而是读取为二进制文件(至少在使用
read(path)
方法时是这样),数据存储为字节(
str
)在内部,以字节形式写回。您可以使用类似于
parser.readfp(codecs.open(path,encoding='utf-8'))
的东西,然后unicode将被用于所有事情,但与许多其他模块一样,它打算与
str一起使用,并记录在案。在python3中,情况就不同了,它只适用于unicode。