Добавление комментария с помощью configparser - PullRequest
4 голосов
/ 16 декабря 2011

Я могу использовать модуль ConfigParser в python для создания ini-файлов, используя методы add_section и set (см. Пример в http://docs.python.org/library/configparser.html). Но я не вижу ничего о добавлении комментариев. Это возможно? Я знаю оиспользуя # и; но как заставить объект ConfigParser добавить это для меня? Я не вижу ничего об этом в документации для configparser.

Ответы [ 3 ]

4 голосов
/ 16 декабря 2011

Если вы хотите избавиться от конечного =, вы можете создать подкласс ConfigParser.ConfigParser в соответствии с предложением atomocopter и реализовать свой собственный метод write для замены исходного:

import sys
import ConfigParser

class ConfigParserWithComments(ConfigParser.ConfigParser):
    def add_comment(self, section, comment):
        self.set(section, '; %s' % (comment,), None)

    def write(self, fp):
        """Write an .ini-format representation of the configuration state."""
        if self._defaults:
            fp.write("[%s]\n" % ConfigParser.DEFAULTSECT)
            for (key, value) in self._defaults.items():
                self._write_item(fp, key, value)
            fp.write("\n")
        for section in self._sections:
            fp.write("[%s]\n" % section)
            for (key, value) in self._sections[section].items():
                self._write_item(fp, key, value)
            fp.write("\n")

    def _write_item(self, fp, key, value):
        if key.startswith(';') and value is None:
            fp.write("%s\n" % (key,))
        else:
            fp.write("%s = %s\n" % (key, str(value).replace('\n', '\n\t')))


config = ConfigParserWithComments()
config.add_section('Section')
config.set('Section', 'key', 'value')
config.add_comment('Section', 'this is the comment')
config.write(sys.stdout)

Вывод этого скрипта:

[Section]
key = value
; this is the comment

Примечания:

  • Если вы используете имя опции, имя которой начинается с ;, а значение установлено на None, это будет считаться комментарием.
  • Это позволит вам добавлять комментарии и записывать их в файлы, но не читать их обратно. Для этого у вас будет свой собственный метод _read, который занимается анализом комментариев, и, возможно, добавите метод comments, чтобы можно было получать комментарии для каждого раздела.
1 голос
/ 16 декабря 2011

Сделать подкласс или проще:

import sys
import ConfigParser

ConfigParser.ConfigParser.add_comment = lambda self, section, option, value: self.set(section, '; '+option, value)

config = ConfigParser.ConfigParser()
config.add_section('Section')
config.set('Section', 'a', '2')
config.add_comment('Section', 'b', '9')
config.write(sys.stdout)

Производит этот вывод:

[Section]
a = 2
; b = 9
0 голосов
/ 27 декабря 2013

Чтобы избежать запаздывания "=", вы можете использовать команду sed с модулем подпроцесса после записи экземпляра config в файл

**subprocess.call(['sed','-in','s/\\(^#.*\\)=/\\n\\1/',filepath])**

filepath - это файл INI, созданный вами с помощью ConfigParser

...