2013-11-14 2 views
4

Я хотел бы использовать следующий файл .ini с ConfigParser.Python: как читать конфигурационный файл только с ключами (без значений)

[Site1] 
192.168.1.0/24 
192.168.2.0/24 

[Site2] 
192.168.3.0/24 
192.168.4.0/24 

К сожалению, вызов read() выводит следующее сообщение об ошибке:

import ConfigParser 
c = ConfigParser.ConfigParser() 
c.read("test.ini") 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\ConfigParser.py", line 305, in read 
    self._read(fp, filename) 
    File "C:\Python27\lib\ConfigParser.py", line 546, in _read 
    raise e 
ConfigParser.ParsingError: File contains parsing errors: test.ini 
     [line 2]: '192.168.1.0/24\n' 
     [line 3]: '192.168.2.0/24\n' 
     [line 6]: '192.168.3.0/24\n' 
     [line 7]: '192.168.4.0/24\n' 

Я понимаю, что ожидаемый формат key = valuevalue требуется).

Мои вопросы:

  • является ConfigParser использовать для таких файлов?
  • если нет: есть ли хорошая альтернатива для разбора подобных файлов?

можно переформатировать файл конфигурации, но хотел бы сохранить простой, необработанный список записей в разделе - в отличие от подделки формат key = value с чем-то вроде range1 = 192.168.1.0/24

+0

У ConfigParser есть несколько вариантов при создании объекта. Я не помню сейчас. Поиск – Farhadix

+0

@Farhadix: Я прочитал документы, упомянутые в моем сообщении. В них явно не упоминается возможность использовать значения без значения. Однако я узнал, что иногда существуют скрытые или менее очевидные способы делать вещи в Python :) и ii) Я надеюсь, что есть хорошая альтернатива простым файлам .ini, которые соответствуют моему формату. – WoJ

+0

Комментируя мой комментарий: выясняется, что я, очевидно, должен улучшить свое чтение, так как документы говорят, что можно использовать записи без стоимости :) – WoJ

ответ

8

Использование allow_no_value параметра:

import ConfigParser 
c = ConfigParser.ConfigParser(allow_no_value=True) 
c.read("test.ini") 

в соответствии с ConfigParser.RawConfigParser (базовый класс ConfigParser):

When allow_no_value is true (default: False), options without values are accepted; the value presented for these is None.

Примечание: доступен в Python 2.7+, 3.2+

+0

Фантастично, спасибо! Я не знаю, как я пропустил это в документах. – WoJ

-1

вам необходимо установить параметр allow_no_value в True

import ConfigParser 
c = ConfigParser.ConfigParser(allow_no_value=True) 
c.read("test.ini") 

Также проверьте ConfigObj в качестве альтернативы.

+0

Пожалуйста, не дублируйте ответ. – falsetru

+0

@falsetru: извините, вашего ответа не было, когда я начал писать. Это случается довольно часто со мной. это, вероятно, мета-вопрос, но что мне делать, когда такие вещи случаются? – lalli

+0

Я удаляю свой ответ, если мой ответ не предоставляет никакой дополнительной информации, и мой ответ был отправлен после другого. – falsetru

-3

Ваш ini-файл недействителен. Вы можете использовать форматирование стиля JSON:

{ 
    "site1": ["192.168.1.0/24", "192.168.2.0/24"], 
    "site2": ["192.168.3.0/24", "192.168.4.0/24"] 
} 

Затем используйте библиотеку json для python.

>>> import json 
>>> with open("hello.json") as f: 
    ... foo = f.read() 
    ... a = json.loads(foo) 
    ... 
>>> a 
    {'site2': ['192.168.3.0/24', '192.168.4.0/24'], 'site1': ['192.168.1.0/24', '192.168.2.0/24']} 
Смежные вопросы