2011-12-16 2 views
3

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

+3

См. принятый ответ на вопрос [Python ConfigParser вопрос о написании комментариев к файлам] (http://stackoverflow.com/questions/6620637/python-configparser-question-about-writing-comments-to -fil es) – Chris

+0

Oh. Я не видел этого ответа. Сожалею! Это не красивое решение, но я думаю, что так я должен это делать. Благодаря! –

+0

Да, это позор о завершающем знаке '=', но, похоже, вы ничего не можете сделать по этому поводу! – Chris

ответ

4

Если вы хотите избавиться от задней =, вы можете унаследовать 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, чтобы можно было получить комментарии для каждого раздела.
+0

Это выглядит великолепно. Я посмотрю, когда я получу некоторое время ... –

+0

Он отлично работает. Большое спасибо. Но я не понимаю, что делает метод write. Мне это не нужно, или я что-то упускаю? –

+0

Метод 'write' - это тот, который вы используете для записи в файл конфигурации. Вам это нужно, чтобы избежать использования реализации по умолчанию. – jcollado

1

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

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

Спасибо за решение. Я мог бы, конечно, сделать то, что вы сказали (+1 для метода add_comment). Но это не решит проблему с уродливым трейлинг = –

0

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

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

Filepath является INI файл вам сгенерированный с помощью ConfigParser

Смежные вопросы