我正在尝试使用StringIO来提供ConfigObj.
我想在单元测试中执行此操作,以便我可以动态地模拟配置“文件”,具体取决于我要在配置对象中测试的内容.
我在配置模块中有很多事情要处理(我正在阅读其他应用程序的几个conf文件,聚合和“格式化”信息).但是,在测试中,我面临着来自地狱的unicode错误.我想我已经把我的问题归结为最小的功能代码,我已经提取并过度简化了这个问题的目的.
我正在做以下事情:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import configobj
import io
def main():
"""Main stuff"""
input_config = """
[Header]
author = PloucPlouc
description = Test config
[Study]
name_of_study = Testing
version = 9999
"""
# Just not to trust my default encoding
input_config = unicode(input_config,"utf-8")
test_config_fileio = io.StringIO(input_config)
print configobj.ConfigObj(infile=test_config_fileio,encoding="UTF8")
if __name__ == "__main__":
main()
它产生以下回溯:
Traceback (most recent call last):
File "test_configobj.py",line 101,in
我在linux上使用Python-2.7.2(32位).我对控制台和编辑器(Kile)的语言环境设置为fr_FR.utf8.
我以为我能做到这一点.
从io.StringIO documentation开始,我得到了这个:
The StringIO object can accept either Unicode or 8-bit strings,but mixing the two may take some care.
从ConfigObj documentation开始,我可以这样做:
06002
和this:
infile: None
You don’t need to specify an infile. If you omit it,an empty ConfigObj will be created. infile can be :
06003
‘encoding’: None
By default ConfigObj does not decode the file/strings you pass it into Unicode [8]. If you want your config file as Unicode (keys and members) you need to provide an encoding to decode the file with. This encoding will also be used to encode the config file when writing.
我的问题是为什么会产生这个?还有哪些(简单的)Unicode处理无法理解?…
通过查看answer,我改变了:
input_config = unicode(input_config,"utf8")
to(导入编解码器模块breforehand):
input_config = unicode(input_config,"utf8").strip(codecs.BOM_UTF8.decode("utf8","strict"))
为了摆脱可能包含的字节顺序标记,但它没有帮助.
非常感谢
注意:如果我使用StringIO.StringIO而不是io.StringIO,我有相同的回溯.