我正在尝试使用StringIO来给ConfigObj喂食。我想在我的单元测试中这样做,这样我就可以动态地模拟配置“file”,这取决于我想在配置对象中测试什么。
我在配置模块中处理了很多事情(我正在读取几个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 <module>
main()
File "test_configobj.py", line 98, in main
print configobj.ConfigObj(infile=test_config_fileio, encoding='UTF8')
File "/work/irlin168_1/USER/Apps/python272/lib/python2.7/site-packages/configobj-4.7.2-py2.7.egg/configobj.py", line 1242, in __init__
self._load(infile, configspec)
File "/work/irlin168_1/USER/Apps/python272/lib/python2.7/site-packages/configobj-4.7.2-py2.7.egg/configobj.py", line 1302, in _load
infile = self._handle_bom(infile)
File "/work/irlin168_1/USER/Apps/python272/lib/python2.7/site-packages/configobj-4.7.2-py2.7.egg/configobj.py", line 1442, in _handle_bom
if not line.startswith(BOM):
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)我在linux上使用Python-2.7.2 (32位)。控制台和编辑器(Kile)的区域设置为fr_FR.utf8。
我以为我能做到。
从io.StringIO文档上,我得到了这个:
StringIO对象可以接受Unicode或8位字符串,但是混合两者可能需要注意。
从ConfigObj文档,我可以这样做:
config = ConfigObj('config.ini',编码=‘UTF8 8’) >>> config‘’name‘u’‘
和这
幼稚:无 你不需要指定一个婴儿。如果省略它,将创建一个空的ConfigObj。婴儿可以是: ..。StringIO实例或文件对象,或任何具有读取方法的对象。ConfigObj的文件名属性为None 5。 “编码”:无 默认情况下,ConfigObj不对文件/字符串进行解码,而是将其传递给Unicode 8。如果您希望配置文件作为Unicode (键和成员),则需要提供一个编码来对文件进行解码。此编码还将用于在编写配置文件时对其编码。
我的问题是,为什么会产生这种情况?我从(简单的) Unicode处理中还不明白什么?
通过查看这个回答,我改变了:
input_config = unicode(input_config, "utf8")致(进口编解码器模块短正手):
input_config = unicode(input_config, "utf8").strip(codecs.BOM_UTF8.decode("utf8", "strict"))为了摆脱可能包含的字节顺序标记,但没有帮助。
非常感谢
注:如果我使用StringIO.StringIO而不是io.StringIO,我也有相同的回溯。
发布于 2012-08-06 20:08:15
这一行:
input_config = unicode(input_config, "utf8")正在将输入转换为Unicode,但这一行:
print configobj.ConfigObj(infile=test_config_fileio, encoding="UTF8")将输入声明为UTF-8编码字节字符串。该错误表示当需要字节字符串时传递了一个Unicode字符串,因此注释掉上面的第一行应该可以解决这个问题。我目前没有configobj,所以不能测试它。
https://stackoverflow.com/questions/11830480
复制相似问题