Файлы конфигурации используются как пользователями, так и программистами. Как правило, их используют для хранения настроек вашего приложения, или операционной системы. Библиотека в ядре Python включает в себя модуль, под названием configparser, который вы можете использовать для создания и работы с файлами конфигурации. Что ж, давайте выделим несколько минут на то, чтобы узнать, как это работает.
Совместимость с Python 3
Из за нововведений в стандарте PEP 8 модуль ConfigParser в Python 3 был переименован в configparser. Возможные ошибки:
ImportError: no module named ConfigParser
Решение проблемы совместимости
1 2 3 4 5 6 7 |
try: import configparser except ImportError: import ConfigParser as configparser # Продолжаем писать код нашей программы... config = configparser.ConfigParser() |
Создание файла
Создание файла config при помощи configparser невероятно просто. Давайте напишем небольшой код, чтобы посмотреть, как это работает:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import 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” для написания в бинарном режиме.
Как читать, обновлять и удалять опции
Теперь мы готовы к тому, что бы научиться чтению файла config, обновлять его опции и даже удалять их. В нашем случае учиться будет намного проще, если мы попробуем на практике написать какой-нибудь код. Просто добавьте следующую функцию в код, который вы писали ранее.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import configparser import 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, указываем ему наименование секции и опции.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Это вернет значение параметра. Если вы хотите изменить значение опции, вам нужно использовать метод set, в котором вы указываете название секции, опции, и новое значение. Наконец, мы можем использовать метод remove_option, чтобы удалить опцию. В нашем примере мы изменили значение font_size, и задали ему размер 12, затем мы удалили опцию font_style. После этого мы записали наши изменения на диск. Этот пример на на столько хорош, давайте упростим наш код. Для этого мы разделим наш код на на несколько функции:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
import configparser import 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. Давайте уделим несколько минут, и взглянем на оба случая.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import configparser import 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) |
Если вы запустите данный код, вы получите примерно следующий результат:
1 2 |
You are using Courier at 12 pt You are using Arial at 100 pt |
Подведем итоги
С этого момента вы должны знать достаточно о возможностях configparser, которые вы можете применять в своих собственных проектах. Существует еще один проект, под названием ConfigObj, который не является частью Python, но которую вы определенно хотели бы рассмотреть. ConfigObj более гибкий, и обладает большим количеством функций, чем configparser. Но, если в вашей компании воспрещается использовать пакеты от третьих лиц, тогда configparser – определенно то, что вам нужно.
ConfigParser — проблемы с Unicode
Если у вас возникли проблемы с Unicode, советуем прочитать данную статью на Хабре: ConfigParser и Unicode
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»