ConfigParser в Python — как его использовать?

ConfigParser в Python — как его использовать?

Файлы конфигурации используются как пользователями, так и программистами. Как правило, их используют для хранения настроек вашего приложения, или операционной системы. Библиотека в ядре Python включает в себя модуль, под названием configparser, который вы можете использовать для создания и работы с файлами конфигурации. Что ж, давайте выделим несколько минут на то, чтобы узнать, как это работает.

Совместимость с Python 3

Из за нововведений в стандарте PEP 8 модуль ConfigParser в Python 3 был переименован в configparser. Возможные ошибки:
ImportError: no module named ConfigParser

Решение проблемы совместимости

Pythontry: import configparserexcept ImportError: import ConfigParser as configparser# Продолжаем писать код нашей программы…config = configparser.ConfigParser()1234567try:    import configparserexcept ImportError:    import ConfigParser as configparser # Продолжаем писать код нашей программы…config = configparser.ConfigParser()

Создание файла

Создание файла config при помощи configparser невероятно просто. Давайте напишем небольшой код, чтобы посмотреть, как это работает:

Pythonimport configparserdef createConfig(path): «»» Create a config file «»» config = configparser.ConfigParser() config.add_section(«Settings») config.set(«Settings», «font», «Courier») config.set(«Settings», «font_size», «10») config.set(«Settings», «font_style», «Normal») config.set(«Settings», «font_info», «You are using %(font)s at %(font_size)s pt») with open(path, «w») as config_file: config.write(config_file)if __name__ == «__main__»: path = «settings.ini» createConfig(path)123456789101112131415161718192021import configparser def createConfig(path):    «»»    Create a config file    «»»    config = configparser.ConfigParser()    config.add_section(«Settings»)    config.set(«Settings», «font», «Courier»)    config.set(«Settings», «font_size», «10»)    config.set(«Settings», «font_style», «Normal»)    config.set(«Settings», «font_info»,                «You are using %(font)s at %(font_size)s pt»)        with open(path, «w») as config_file:        config.write(config_file)  if __name__ == «__main__»:    path = «settings.ini»    createConfig(path)

Данный код создает файл config с одной секцией, под названием Settings, которая будет содержать наши опции: font, font_size, font_style и font_info. Обратите внимание на то, что в Python 3 нам нужно указать, что мы пишем файл в режиме write-only, или “w”. А в Python 2.7, мы использовали “wb” для написания в бинарном режиме.

(adsbygoogle = window.adsbygoogle || []).push({});

Как читать, обновлять и удалять опции

Теперь мы готовы к тому, что бы научиться чтению файла config, обновлять его опции и даже удалять их. В нашем случае учиться будет намного проще, если мы попробуем на практике написать какой-нибудь код. Просто добавьте следующую функцию в код, который вы писали ранее.

Pythonimport configparserimport osdef crudConfig(path): «»» Create, read, update, delete config «»» if not os.path.exists(path): createConfig(path) config = configparser.ConfigParser() config.read(path) # Читаем некоторые значения из конфиг. файла. font = config.get(«Settings», «font») font_size = config.get(«Settings», «font_size») # Меняем значения из конфиг. файла. config.set(«Settings», «font_size», «12») # Удаляем значение из конфиг. файла. config.remove_option(«Settings», «font_style») # Вносим изменения в конфиг. файл. with open(path, «w») as config_file: config.write(config_file)if __name__ == «__main__»: path = «settings.ini» crudConfig(path)12345678910111213141516171819202122232425262728293031import configparserimport os def crudConfig(path):    «»»    Create, read, update, delete config    «»»    if not os.path.exists(path):        createConfig(path)        config = configparser.ConfigParser()    config.read(path)        # Читаем некоторые значения из конфиг. файла.    font = config.get(«Settings», «font»)    font_size = config.get(«Settings», «font_size»)        # Меняем значения из конфиг. файла.    config.set(«Settings», «font_size», «12»)        # Удаляем значение из конфиг. файла.    config.remove_option(«Settings», «font_style»)     # Вносим изменения в конфиг. файл.    with open(path, «w») as config_file:        config.write(config_file)  if __name__ == «__main__»:    path = «settings.ini»    crudConfig(path)

Этот код сначала проверяет, существует ли файл config в принципе. Если его нет, то он использует созданную нами ранее функцию createConfig, чтобы создать файл. Далее мы создаем объект ConfigParser и указываем путь к файлу config для чтения. Чтобы прочесть опцию в вашем config файле, мы вызываем метод нашего объекта ConfigParser, указываем ему наименование секции и опции.

window.yaContextCb.push(()=>{ Ya.Context.AdvManager.render({ renderTo: ‘yandex_rtb_R-A-457373-7’, blockId: ‘R-A-457373-7’ })})

Это вернет значение параметра. Ес
ли вы хотите изменить значение опции, вам нужно использовать метод set, в котором вы указываете название секции, опции, и новое значение. Наконец, мы можем использовать метод remove_option, чтобы удалить опцию. В нашем примере мы изменили значение font_size, и задали ему размер 12, затем мы удалили опцию font_style. После этого мы записали наши изменения на диск. Этот пример на на столько хорош, давайте упростим наш код. Для этого мы разделим наш код на на несколько функции:

Pythonimport configparserimport osdef create_config(path): «»» Create a config file «»» config = configparser.ConfigParser() config.add_section(«Settings») config.set(«Settings», «font», «Courier») config.set(«Settings», «font_size», «10») config.set(«Settings», «font_style», «Normal») config.set(«Settings», «font_info», «You are using %(font)s at %(font_size)s pt») with open(path, «w») as config_file: config.write(config_file)def get_config(path): «»» Returns the config object «»» if not os.path.exists(path): create_config(path) config = configparser.ConfigParser() config.read(path) return configdef get_setting(path, section, setting): «»» Print out a setting «»» config = get_config(path) value = config.get(section, setting) msg = «{section} {setting} is {value}».format( section=section, setting=setting, value=value ) print(msg) return valuedef update_setting(path, section, setting, value): «»» Update a setting «»» config = get_config(path) config.set(section, setting, value) with open(path, «w») as config_file: config.write(config_file)def delete_setting(path, section, setting): «»» Delete a setting «»» config = get_config(path) config.remove_option(section, setting) with open(path, «w») as config_file: config.write(config_file)if __name__ == «__main__»: path = «settings.ini» font = get_setting(path, ‘Settings’, ‘font’) font_size = get_setting(path, ‘Settings’, ‘font_size’) update_setting(path, «Settings», «font_size», «12») delete_setting(path, «Settings», «font_style»)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273import configparserimport os  def create_config(path):    «»»    Create a config file    «»»    config = configparser.ConfigParser()    config.add_section(«Settings»)    config.set(«Settings», «font», «Courier»)    config.set(«Settings», «font_size», «10»)    config.set(«Settings», «font_style», «Normal»)    config.set(«Settings», «font_info»,                «You are using %(font)s at %(font_size)s pt»)        with open(path, «w») as config_file:        config.write(config_file)  def get_config(path):    «»»    Returns the config object    «»»    if not os.path.exists(path):        create_config(path)        config = configparser.ConfigParser()    config.read(path)    return config  def get_setting(path, section, setting):    «»»    Print out a setting    «»»    config = get_config(path)    value = config.get(section, setting)    msg = «{section} {setting} is {value}».format(        section=section, setting=setting, value=value    )        print(msg)    return value  def update_setting(path, section, setting, value):    «»»    Update a setting    «»»    config = get_config(path)    config.set(section, setting, value)    with open(path, «w») as config_file:        config.write(config_file)  def delete_setting(path, section, setting):    «»»    Delete a setting    «»»    config = get_config(path)    config.remove_option(section, setting)    with open(path, «w») as config_file:        config.write(config_file)  if __name__ == «__main__»:    path = «settings.ini»    font = get_setting(path, ‘Settings’, ‘font’)    font_size = get_setting(path, ‘Settings’, ‘font_size’)        update_setting(path, «Settings», «font_size», «12»)    delete_setting(path, «Settings», «font_style»)

Этот пример выглядит более организованно, по сравнению с первым. Я зашел так далеко, что назвал функции соответственно стандартам PEP8. Каждая функция должна объяснять сама себя и выполнять лишь одну задачу. Вместо того, чтобы помещать всю логику в одну единственную функцию, мы разделяем её на несколько функций, после чего демонстрируем их функционал в конце оператора if. Теперь вы можете импортировать модуль и использовать по назначению. Обратите внимание на то, что в этом примере есть сложная секция, так что вам, возможно, захочется усовершенствовать этот пример в дальнейшем, чтобы сделать его более универсальным.

Как использовать интерполяцию

Модуль configparser также подразумевает возможность интерполяции, что значит, что вы можете использовать существующие опции, для создания другой опции. Мы на самом деле это делали с опцией font_info, чьи параметры основаны на опциях font и font_size. Мы можем изменить интерполированное значение при помощи словаря Python. Давайте уделим несколько минут, и взглянем на оба случая.

Pythonimport configparserimport osdef interpolationDemo(path): if not os.path.exists(path): createConfig(path) config = configparser.ConfigParser() config.read(path) print(config.get(«Settings», «font_info»)) print(config.get( «Settings», «font_info», vars={«font»: «Arial», «font_size»: «100»}) )if __name__ == «__main
__»: path = «settings.ini» interpolationDemo(path)1234567891011121314151617181920import configparserimport os  def interpolationDemo(path):    if not os.path.exists(path):        createConfig(path)        config = configparser.ConfigParser()    config.read(path)     print(config.get(«Settings», «font_info»))    print(config.get(        «Settings», «font_info», vars={«font»: «Arial», «font_size»: «100»})    )  if __name__ == «__main__»:    path = «settings.ini»    interpolationDemo(path)

Если вы запустите данный код, вы получите примерно следующий результат:

PythonYou are using Courier at 12 ptYou are using Arial at 100 pt12You are using Courier at 12 ptYou are using Arial at 100 pt

Подведем итоги

С этого момента вы должны знать достаточно о возможностях configparser, которые вы можете применять в своих собственных проектах. Существует еще один проект, под названием ConfigObj, который не является частью Python, но которую вы определенно хотели бы рассмотреть. ConfigObj более гибкий, и обладает большим количеством функций, чем configparser. Но, если в вашей компании воспрещается использовать пакеты от третьих лиц, тогда configparser – определенно то, что вам нужно.

ConfigParser — проблемы с Unicode

Если у вас возникли проблемы с Unicode, советуем прочитать данную статью на Хабре: ConfigParser и Unicode