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()
如果您将 python2
与 from __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
包含无法使用默认编码解码为 unicode 的字符,那么你会得到一个 UnicodeDecodeError 而你不会想到一个。
所以要完成这项工作,您可以
- 为字节串使用显式前缀:
what.replace(b" = ", b"=", 1)
- 或删除
unicode_litreals
未来的导入。
一般来说,您不应该混合使用 unicode
和 str
(python3 通过在几乎任何情况下都将其设为错误来修复此问题)。您应该知道 from __future__ import unicode_literals
将每个非前缀文字更改为 unicode,并且不会在所有情况下自动更改您的代码以使用 unicode。在很多情况下恰恰相反。
我正在读取配置文件 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()
如果您将 python2
与 from __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
包含无法使用默认编码解码为 unicode 的字符,那么你会得到一个 UnicodeDecodeError 而你不会想到一个。
所以要完成这项工作,您可以
- 为字节串使用显式前缀:
what.replace(b" = ", b"=", 1)
- 或删除
unicode_litreals
未来的导入。
一般来说,您不应该混合使用 unicode
和 str
(python3 通过在几乎任何情况下都将其设为错误来修复此问题)。您应该知道 from __future__ import unicode_literals
将每个非前缀文字更改为 unicode,并且不会在所有情况下自动更改您的代码以使用 unicode。在很多情况下恰恰相反。