首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用StringIO实现ConfigObj和Unicode

使用StringIO实现ConfigObj和Unicode
EN

Stack Overflow用户
提问于 2012-08-06 14:39:19
回答 1查看 1.7K关注 0票数 5

我正在尝试使用StringIO来给ConfigObj喂食。我想在我的单元测试中这样做,这样我就可以动态地模拟配置“file”,这取决于我想在配置对象中测试什么。

我在配置模块中处理了很多事情(我正在读取几个conf文件,为其余的应用程序聚合和“格式化”信息)。但是,在测试中,我面临来自地狱的unicode错误。我想我已经把我的问题固定在了最小的功能代码上,为了这个问题,我已经提取并过度简化了这些代码。

我所做的工作如下:

代码语言:javascript
复制
#!/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()

它产生以下回溯:

代码语言:javascript
复制
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处理中还不明白什么?

通过查看这个回答,我改变了:

代码语言:javascript
复制
input_config = unicode(input_config, "utf8")

致(进口编解码器模块短正手):

代码语言:javascript
复制
input_config = unicode(input_config, "utf8").strip(codecs.BOM_UTF8.decode("utf8", "strict"))

为了摆脱可能包含的字节顺序标记,但没有帮助。

非常感谢

注:如果我使用StringIO.StringIO而不是io.StringIO,我也有相同的回溯。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-06 20:08:15

这一行:

代码语言:javascript
复制
input_config = unicode(input_config, "utf8")

正在将输入转换为Unicode,但这一行:

代码语言:javascript
复制
print configobj.ConfigObj(infile=test_config_fileio, encoding="UTF8")

将输入声明为UTF-8编码字节字符串。该错误表示当需要字节字符串时传递了一个Unicode字符串,因此注释掉上面的第一行应该可以解决这个问题。我目前没有configobj,所以不能测试它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11830480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档