Написание комментариев к файлам с ConfigParser - PullRequest
27 голосов
/ 08 июля 2011

Как можно написать комментарии к данному файлу в разделах?

Если у меня есть:

import ConfigParser
with open('./config.ini', 'w') as f:
    conf = ConfigParser.ConfigParser()
    conf.set('DEFAULT', 'test', 1)
    conf.write(f)

Я получу файл:

[DEFAULT]
test = 1

Но как я могу получить файл с комментариями в разделе [DEFAULT], например:

[DEFAULT]
; test comment
test = 1

Я знаю, что могу записать коды в файлы, выполнив:

import ConfigParser
with open('./config.ini', 'w') as f:
    conf = ConfigParser.ConfigParser()
    conf.set('DEFAULT', 'test', 1)
    conf.write(f)
    f.write('; test comment') # but this gets printed after the section key-value pairs

Это возможно с ConfigParser? И я не хочу пробовать другой модуль, потому что мне нужно, чтобы моя программа была как можно более «стоковой».

Ответы [ 4 ]

24 голосов
/ 17 октября 2013

Вы можете использовать опцию allow_no_value, если у вас есть Версия> = 2.7

Этот фрагмент:

import ConfigParser

config = ConfigParser.ConfigParser(allow_no_value=True)
config.add_section('default_settings')
config.set('default_settings', '; comment here')
config.set('default_settings', 'test', 1)
with open('config.ini', 'w') as fp:
    config.write(fp)


config = ConfigParser.ConfigParser(allow_no_value=True)
config.read('config.ini')
print config.items('default_settings')

создаст INI-файл, подобный этому:

[default_settings]
; comment here
test = 1
4 голосов
/ 08 июля 2011

Вы можете создать переменную, которая начинается с # или; характер:

conf.set('default_settings', '; comment here', '')
conf.set('default_settings', 'test', 1)

созданный файл конф.

    [default_settings]
    ; comment here = 
    test = 1

Функция ConfigParser.read не будет анализировать первое значение

config = ConfigParser.ConfigParser()
config.read('config.ini')
print config.items('default_settings')

1010 * дает *

[('test','1')]
2 голосов
/ 07 сентября 2018

Обновление для 3,7

В последнее время я имел дело с configparser и наткнулся на этот пост. Я подумал, что обновлю его информацией, относящейся к 3.7.

Пример 1:

config = configparser.ConfigParser(allow_no_value=True)
config.set('SECTION', '; This is a comment.', None)

Пример 2:

config = configparser.ConfigParser(allow_no_value=True)
config['SECTION'] = {'; This is a comment':None, 'Option':'Value')

Пример 3. Если вы хотите сохранить регистр букв без изменений (по умолчанию все пары параметр: значение преобразованы в нижний регистр)

config = configparser.ConfigParser(allow_no_value=True)
config.optionxform = str
config.set('SECTION', '; This Comment Will Keep Its Original Case', None)

Где "SECTION" - это имя раздела с учетом регистра, к которому вы хотите добавить комментарий. Использование «None» (без кавычек) вместо пустой строки ('') позволит вам установить комментарий, не оставляя после себя "=".

1 голос
/ 07 июля 2018

Вы также можете использовать ConfigUpdater . У него гораздо больше удобных опций для обновления конфигурационных файлов минимально инвазивным способом.

Вы бы в основном сделали:

from configupdater import ConfigUpdater

updater = ConfigUpdater()
updater.add_section('DEFAULT')
updater.set('DEFAULT', 'test', 1)
updater['DEFAULT']['test'].add_before.comment('test comment', comment_prefix=';')
with open('./config.ini', 'w') as f:
    updater.write(f)
...