2013-06-27 3 views
1

Мне просто интересно. Есть ли возможность создать раздел в файле * .ini для хранения только значений без ключей? Я хранить список используемых портов в LOCALHOST и других серверах и мой список выглядит следующим образом:ConfigParser и раздел со значениями без клавиш

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

Для теперь питона трактует имя сервера в качестве ключа и порта в качестве значения. Но хуже всего то, что вызов

print config.items('servers') 

Возвращает мне только это:

localhost:3333 
someserver:3333 

что неправильно, но я мог бы справиться с этим путем замены: в конфигурации, но все-таки раздел нуждается ключ для значений. Любая идея, как это сделать правильно?

+1

Почему бы не сохранить порты в виде разделенных запятыми строк, например localhost: 1111,2222,3333, и проанализировать позже? – thiruvenkadam

+0

Это формат, определенный другой стороной? возможно, с другим форматом будет легче работать, например, yaml позволяет вам иметь упорядоченные или неупорядоченные последовательности в дополнение к картам. – SingleNegationElimination

ответ

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'] 
+0

Yup и я все же разрешаю поместить один сервер в строку. – J33nn

0

На мой взгляд, было бы лучше использовать xml, а не ini ... это альтернатива вам?

+0

Я знаю, но большая часть конфигурации сценария помещается в config.ini, поэтому я пытаюсь разместить этот список там – J33nn

+1

Я бы выбрал JSON над XML в любой день. – Kimvais

+0

Я думаю, что JSON имеет большой недостаток в отношении читаемости человека. Следовательно, XML лучше подходит для файлов конфигурации ... – t7bdh3hdhb

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)] 

Другого варианта заключается в добавлении уникального идентификатора каждую строку, а также отделить его двоеточие. Остальное станет тогда значение:

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')] 
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 
0

Если вы можете, пожалуйста, изменить формат, как это:

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

В то время как вы читаете, читайте ключ как имя сервера и преобразовать значение из файла в виде списка из строки через value.split (','). Вам будет легко проверить порт.