我的ConfigParser问题继续存在。它似乎不能很好地支持Unicode。配置文件确实保存为UTF-8,但是当ConfigParser读取它时,它似乎被编码成其他东西。我认为它是latin-1而我认为压倒optionxform
会有所帮助:
-- configfile.cfg --
[rules]
Häjsan = 3
☃ = my snowman
-- myapp.py --
# -*- coding: utf-8 -*-
import ConfigParser
def _optionxform(s):
try:
newstr = s.decode('latin-1')
newstr = newstr.encode('utf-8')
return newstr
except Exception, e:
print e
cfg = ConfigParser.ConfigParser()
cfg.optionxform = _optionxform
cfg.read("myconfig")
当然,当我读到配置时,我得到了:
'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
我尝试了几种不同的解码方式,但这一点似乎没有实际意义,因为它从一开始就应该是一个unicode对象。毕竟,配置文件是UTF-8?我已经确认ConfigParser通过使用此DummyConfig类将其删除来读取文件的方式有问题。如果我使用它那么一切都很好unicode,罚款和花花公子。
-- config.py --
# -*- coding: utf-8 -*-
apa = {'rules': [(u'Häjsan', 3), (u'☃', u'my snowman')]}
class DummyConfig(object):
def sections(self):
return apa.keys()
def items(self, section):
return apa[section]
def add_section(self, apa):
pass
def set(self, *args):
pass
任何可能导致此问题的想法或其他支持Unicode的配置模块的建议都是最受欢迎的。我不想使用sys.setdefaultencoding()
!
答案 0 :(得分:20)
ConfigParser.readfp()
方法可以采用文件对象,您是否尝试使用编解码器模块使用正确的编码打开文件对象,然后将其发送到ConfigParser,如下所示:
cfg.readfp(codecs.open("myconfig", "r", "utf8"))
对于Python 3.2或更高版本,不推荐使用readfp()
。请改用read_file()
。
答案 1 :(得分:2)
尝试覆盖write
中的RawConfigParser()
功能,如下所示:
class ConfigWithCoder(RawConfigParser):
def write(self, fp):
"""Write an .ini-format representation of the configuration state."""
if self._defaults:
fp.write("[%s]\n" % "DEFAULT")
for (key, value) in self._defaults.items():
fp.write("%s = %s\n" % (key, str(value).replace('\n', '\n\t')))
fp.write("\n")
for section in self._sections:
fp.write("[%s]\n" % section)
for (key, value) in self._sections[section].items():
if key == "__name__":
continue
if (value is not None) or (self._optcre == self.OPTCRE):
if type(value) == unicode:
value = ''.join(value).encode('utf-8')
else:
value = str(value)
value = value.replace('\n', '\n\t')
key = " = ".join((key, value))
fp.write("%s\n" % (key))
fp.write("\n")
答案 2 :(得分:1)
在读取和写入unicode字符串作为值时,配置模块会中断。我试图修复它,但是却以奇怪的方式陷入了解析器的工作状态。
答案 3 :(得分:1)
似乎是python 2x的ConfigParser版本的问题,3x的版本没有这个问题。在this issue of the Python Bug Tracker中,状态为Closed + WONTFIX。
我已修复它编辑ConfigParser.py文件。在write方法中(关于第412行),更改:
key = " = ".join((key, str(value).replace('\n', '\n\t')))
通过
key = " = ".join((key, str(value).decode('utf-8').replace('\n', '\n\t')))
我不知道它是否是一个真正的解决方案,但在Windows 7和Ubuntu 15.04中进行了测试,就像一个魅力,我可以在两个系统中共享和使用相同的.ini文件。 / p>
答案 4 :(得分:1)
在python 3.2 encoding
中引入了read()
参数,因此它现在可以用作:
cfg.read("myconfig", encoding='utf-8')
答案 5 :(得分:0)
我所做的只是:
fruits