Python - ConfigParser бросает комментарии - PullRequest
1 голос
/ 19 февраля 2009

На основе модуля ConfigParser, как я могу отфильтровать и выбросить все комментарии из INI-файла?

import ConfigParser
config = ConfigParser.ConfigParser()
config.read("sample.cfg")

for section in config.sections():
    print section
    for option in config.options(section):
        print option, "=", config.get(section, option)

например. в файле ini ниже приведенный выше базовый скрипт выводит следующие строки комментариев, например:

something  = 128     ; comment line1
                      ; further comments 
                       ; one more line comment

Что мне нужно, так это иметь в них только имена разделов и пары ключ-значение без каких-либо комментариев. ConfigParser обрабатывает это как-то или я должен использовать регулярное выражение ... или? Приветствия

Ответы [ 5 ]

5 голосов
/ 19 февраля 2009

в соответствии с документами строки, начинающиеся с ; или #, будут игнорироваться. не похоже, что ваш формат удовлетворяет этому требованию. Можете ли вы случайно изменить формат вашего входного файла?

edit : поскольку вы не можете изменить свои входные файлы, я бы посоветовал предварительно проанализировать их следующим образом:

tmp_fname = 'config.tmp'
with open(config_file) as old_file:
    with open(tmp_fname, 'w') as tmp_file:
        tmp_file.writelines(i.replace(';', '\n;') for i in old_lines.readlines())
# then use tmp_fname with ConfigParser

очевидно, если в опциях присутствует точка с запятой, вам нужно быть более креативным.

3 голосов
/ 19 февраля 2009

Лучший способ написать бесподобный file подкласс:

class CommentlessFile(file):
    def readline(self):
        line = super(CommentlessFile, self).readline()
        if line:
            line = line.split(';', 1)[0].strip()
            return line + '\n'
        else:
            return ''

Вы можете использовать его тогда с configparser (ваш код):

import ConfigParser
config = ConfigParser.ConfigParser()
config.readfp(CommentlessFile("sample.cfg"))

for section in config.sections():
    print section
    for option in config.options(section):
        print option, "=", config.get(section, option)
2 голосов
/ 19 февраля 2009

Похоже, ваши комментарии не в строках, которые начинаются с лидера комментария. Это должно работать, если лидер комментария является первым символом в строке.

1 голос
/ 12 января 2011

Как сказал доктор: "(Только для обратной совместимости; запускает встроенный комментарий, а # нет.)" Так что используйте ";" а не "#" для встроенных комментариев. У меня это хорошо работает.

0 голосов
/ 20 апреля 2012

Python 3 поставляется со встроенным решением: класс configparser.RawConfigParser имеет аргумент конструктора inline_comment_prefixes. Пример:

class MyConfigParser(configparser.RawConfigParser):
    def __init__(self):
      configparser.RawConfigParser.__init__(self, inline_comment_prefixes=('#', ';'))
...