从字符串或列表中读取配置的方法是什么?

30

能否从字符串或列表中读取ConfigParser的配置?
而不需要在文件系统上创建任何临时文件。

或者
是否有类似的解决方案?

3个回答

47

您可以使用类似文件的缓冲区:

Python 3解决方案。
import configparser
import io

s_config = """
[example]
is_real: False
"""
buf = io.StringIO(s_config)
config = configparser.ConfigParser()
config.read_file(buf)
print(config.getboolean('example', 'is_real'))

Python 2.7中,这个实现是正确的:

import ConfigParser
import StringIO

s_config = """
[example]
is_real: False
"""
buf = StringIO.StringIO(s_config)
config = ConfigParser.ConfigParser()
config.readfp(buf)
print config.getboolean('example', 'is_real')

那么缓冲区应该在哪里使用呢?ConfigParser.Read()需要一个文件名作为参数。 - Lucas
1
cStringIO 对象不是 buffer字符串 是缓冲区,但缓冲区不能用于需要类似于“文件”的对象的地方;cStringIO 包装 一个 buffer 以使其表现得像一个 file。此外,您的示例并未演示 cStringIO 如何像文件一样运行;getvaluecStringIO 实例特有的方法,但文件没有它。 - lanzz
@Lucas 我已经发布了一个完整的示例,它使用StringIO缓冲区并获取样本值。 - Noel Evans
1
请注意,config.readfp已被弃用,建议使用config.read_file 自Python 3.2起 - mindthief

32

虽然问题被标记为 python-2.7,但出于完整性的考虑:自3.2起,您可以使用 ConfigParser 函数 read_string(),因此您不再需要使用 StringIO 方法。

import configparser

s_config = """
[example]
is_real: False
"""
config = configparser.ConfigParser()
config.read_string(s_config)
print(config.getboolean('example', 'is_real'))

我讨厌使用Python 2.7的另一个原因(感谢RHEL 7)。 - Nick T
公平地说,对于RHEL7来说,完全可以安装Python 3.x。https://developers.redhat.com/blog/2018/08/13/install-python3-rhel/ - RCross

0
Python自3.2版本起就有了read_stringread_dict函数。但它不支持从列表中读取数据。
下面的示例展示了如何从字典中读取数据。键是节的名称,值是包含节中应该存在的键值对的字典。
#!/usr/bin/env python3

import configparser

cfg_data = {
    'mysql': {'host': 'localhost', 'user': 'user7',
              'passwd': 's$cret', 'db': 'ydb'}
}

config = configparser.ConfigParser()
config.read_dict(cfg_data)

host = config['mysql']['host']
user = config['mysql']['user']
passwd = config['mysql']['passwd']
db = config['mysql']['db']

print(f'Host: {host}')
print(f'User: {user}')
print(f'Password: {passwd}')
print(f'Database: {db}')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接