簡體   English   中英

ConfigParser和具有不帶鍵的值的部分

[英]ConfigParser and section with values without keys

我是在想。 有沒有機會在* .ini文件中創建節以僅存儲沒有鍵的值? 我要將已用端口的列表存儲在localhost和其他服務器中,列表如下所示:

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

目前,python將服務器名稱視為鍵,將端口視為值。 但最糟糕的是

print config.items('servers')

只給我返回:

localhost:3333
someserver:3333

這是錯誤的,但是我可以通過在配置中替換:來處理它,但是該部分仍然需要鍵值。 知道怎么做對嗎?

您可以使用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

您可以將服務器存儲在逗號分隔的列表中,

[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']

在我看來,最好使用xml而不是ini ...這是您的替代選擇嗎?

我認為您不能使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')]

如果可以的話,請像這樣更改格式:

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

讀取時,將密鑰讀取為服務器名稱,然后將文件中的值轉換為通過value.split(',')從字符串中的列表。 您可以輕松檢查端口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM