1

我是在想。是否有机会在 *.ini 文件中创建部分以仅存储没有键的值?我将在 localhost 和其他服务器中存储使用的端口列表,我的列表如下所示:

[servers]
localhost:1111
localhost:2222
localhost:3333
someserver:2222
someserver:3333

目前,python 将服务器名称视为键,将端口视为值。但最糟糕的是打电话

print config.items('servers')

只返回我这个:

localhost:3333
someserver:3333

这是错误的,但我可以通过在配置中替换 : 来处理它,但部分仍然需要值的键。知道怎么做吗?

4

5 回答 5

1

您可以将服务器存储在逗号分隔的列表中,

[servers] 
server_list = localhost:1111, localhost:2222, localhost:3333, someserver:2222, someserver:3333

将其读入一个列表,例如

from ConfigParser import ConfigParser

cp = ConfigParser()
cp.read('derp.config')
print cp.items('servers')[0][1].split(', ')

哪个输出

['localhost:1111', 'localhost:2222', 'localhost:3333', 'someserver:2222', 'someserver:3333']
于 2013-06-27T12:24:08.120 回答
1

您可以选择 allow_no_value,但不能避免“:”作为值分隔符,这是在 ConfigParser.py 中:

OPTCRE = re.compile(
    r'(?P<option>[^:=\s][^:=]*)'          # very permissive!
    r'\s*(?P<vi>[:=])\s*'                 # any number of space/tab,
                                          # followed by separator
                                          # (either : or =), followed
                                          # by any # space/tab
    r'(?P<value>.*)$'                     # everything up to eol
    )

我想到的唯一解决方案:

[servers]

s1 = localhost:1111
s2 = localhost:2222
s3 = localhost:3333
s4 = someserver:2222
s5 = someserver:3333
于 2013-06-27T11:56:36.933 回答
0

如果可以,请更改格式如下:

[servers]
localhost:1111,2222,3333
someserver:4444,5555,6666

在阅读时,将密钥作为服务器名称读取,并将文件中的值通过 value.split(',') 转换为字符串中的列表。您可以轻松检查端口。

于 2013-06-27T12:36:00.157 回答
0

在我看来,使用 xml 而不是 ini 会更好......这是你的替代品吗?

于 2013-06-27T11:44:07.427 回答
0

我认为您不能ConfigParser将冒号视为键/值分隔符。因此,如果您使用冒号,主机名将被解释为键,这对您不起作用,因为它们不是唯一的。因此,您可能必须将冒号更改为其他内容。那么您的条目将是独一无二的。ConfigParser支持没有值的键:

In [1]: from ConfigParser import ConfigParser

In [2]: cp = ConfigParser(allow_no_value=True)

In [3]: cp.read('foo.conf')
Out[3]: ['foo.conf']

In [4]: cp.items('servers')
Out[4]: 
[('localhost;1111', None),
 ('localhost;2222', None),
 ('localhost;3333', None),
 ('someserver;2222', None),
 ('someserver;3333', None)]

另一种选择是为每一行添加一个唯一的 ID,并用冒号分隔。其余的将成为值:

In [1]: from ConfigParser import ConfigParser

In [2]: cp = ConfigParser()

In [3]: cp.read('foo.conf')
Out[3]: ['foo.conf']

In [4]: cp.items('servers')
Out[4]: 
[('1', 'localhost:1111'),
 ('2', 'localhost:2222'),
 ('3', 'localhost:3333'),
 ('4', 'someserver:2222'),
 ('5', 'someserver:3333')]
于 2013-06-27T11:54:24.713 回答