Краткое руководство по чтению, записи и обновлению файлов конфигурации с помощью configparser в Python

Вы пишете программу глубокого обучения и хотите сохранить некоторые ключевые параметры в файле конфигурации. Вы хотите использовать значения в конфигурации в качестве значений параметров для обучения модели, таких как путь к набору данных, оптимизатор, скорость обучения, количество эпох и т. Д.

Класс configparser реализует базовую структуру конфигурации, имеющую разделы, содержащие пары ключ-значение.

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

Создание ini-файла для хранения настроек конфигурации

Вы можете использовать любой текстовый редактор для создания ini-файла. Я использовал блокнот.

  • Файл конфигурации состоит из [раздела], за которым следует пара "ключ-значение". значения отделяются от ключей с помощью «=» или «:»
  • Имена разделов чувствительны к регистру, но ключи - без учета регистра.
  • Ключи могут содержать или не содержать значения. Если значения для ключей отсутствуют, убедитесь, что вы добавили «:» или «=», иначе вы получите сообщение об ошибке.
  • Перед ключами и значениями могут быть пробелы перед и после, поскольку они удаляются при чтении файла конфигурации.
  • Значения ключа могут быть распределены по нескольким строкам с правильным отступом. Если значение ключа, которое распространяется на несколько строк, имеет неправильный отступ, мы получаем ошибку.

Чтение данных конфигурации из ini-файла

Чтобы прочитать файл конфигурации, вам потребуется импортировать библиотеку configparser. Приведенный ниже код считывает файл конфигурации, печатает все разделы вместе с парами "ключ-значение" в каждом разделе.

import configparser
filename=r'test_config.ini'
config = configparser.ConfigParser()
config.read(filename)
for sect in config.sections():
    print("\nSection: ",sect)
    for k,v in config.items(sect):
        print("Key: ",k," Value: ",v)

Прочтите одно значение ключа из файла конфигурации.

При обучении модели вам может потребоваться извлечь одно значение ключа из файла конфигурации или извлечь все значения ключей в разделе.

Извлечение значения ключа оптимизатора в разделе обучения

print(config['training']['optimizer'])

Извлечение значения ключа эпох в разделе обучения и преобразование его в int

print(int(config['training']['epochs']))

Извлечение всех разделов из файла конфигурации

Разделы файла конфигурации будут возвращены в виде списка.

print(list(config.sections()))

Извлечение всех ключей из определенного раздела файла конфигурации

Мы извлекаем все ключи в разделе обучения.

print(list(config['training'].keys()))

Извлечение всех значений из определенного раздела файла конфигурации

Мы извлекаем все значения для всех ключей в разделе обучения.

print(list(config['training'].values()))

Обновление значений ключей в разделе

Обновление значений ключей в существующем разделе аналогично перезаписи значений.

filename=r'test_config.ini'
config = configparser.ConfigParser()
config.read(filename)
# the section checkpoint uppdate the value for model_file_name
config['Trained Model Details']={'model_file_name' :'classfication_epoch100.h5'}
with open(filename, 'w') as configfile:
    config.write(configfile)

Раздел «Подробная информация об обученной модели» обновляется значением «classfication_epoch100.h5», а ключ для «контрольной точки» удаляется.

Напишите дополнительные записи в файл конфигурации.

Есть два разных способа записи конфигурационных записей в файл.

  1. Создайте словарь пар "ключ-значение" с названием раздела
#Adding additional entries into Config file
# creating the dictionary for section and key-value pairs
config['Layer 1']={
    'no of hidden units':8,
    'kernel_size':3,
    'stride':2,
    'activation':'relu'
}
# writing to configuration file
with open(filename, 'w') as configfile:
    config.write(configfile)

Этот код будет добавлен к существующему файлу конфигурации, как показано ниже.

Если вы создаете экземпляр configparser, он перезаписывает текущие записи, как показано ниже.

#Overwriting over existsing entries into Config file
filename=r'test_config.ini'
config = configparser.ConfigParser()
config['Layer 1']={
    'no of hidden units':10,
    'kernel_size':3,
    'stride':2,
    'activation':'relu'
}
with open(filename, 'w') as configfile:
    config.write(configfile)

Другой метод - использовать read_dict (), у него есть параметр конфигурации в объекте словаря, где ключ - это имя раздела, а различные пары ключ-значение - значения. словаря.

config.read_dict({'data':{'train_dir' : r'c:\dataset\train',
                          'test_dir': r'c:\dataset\test',
                          'val_dir': r'c:\dataset\val'
                          }
                 })
with open(filename, 'w') as configfile:
    config.write(configfile)

Приведенный выше код не добавил еще один раздел в наш файл конфигурации.

Базовая интерполяция ценностей

Интерполяция - это когда значение ключей в файлах конфигурации предварительно обрабатывается перед их возвратом.

Синтаксис базовой интерполяции :% (key_name)

Приведенный ниже код создает раздел конфигурации «Пути», содержащий два ключа «home_dir,» и «model_dir». Значение для ключ «model_dir» будет создан заменой «home_dir» с помощью интерполяции.

config['Paths']={
    'home_dir' : r'C:\model',
    'model_dir': '%(home_dir)s\dataset'}
with open(filename, 'w') as configfile:
    config.write(configfile)
print(config["Paths"]['model_dir'])

Расширенная интерполяция

Расширенная интерполяция предназначена для предварительной обработки и замены значений ключа из другого раздела файла конфигурации перед их возвратом.

Синтаксис расширенной интерполяции : $ {section: key}

В приведенном ниже коде используется расширенная интерполяция из ключа «home_dir» раздела «Пути».

config['Data_Path']={'train_dir' : '${Paths:home_dir}\\train',
                     'test_dir':'${Paths:home_dir}s\\test',
                     'val_dir':'${Paths:home_dir}s\\val'
                    }
with open(filename, 'w') as configfile:
    config.write(configfile)

Чтобы прочитать расширенную интерполяцию, нам нужно установить интерполяцию файла конфигурации на ExtendedInterpolation () для динамической замены.

config._interpolation = configparser.ExtendedInterpolation()
config.read('test_config.ini')
print(config["Data_Path"]['train_dir'])

Заключение:

Библиотека configparser предоставляет простой способ управления параметрами конфигурации с помощью пар ключ-значение в разделе.

Использованная литература:

Https://docs.python.org/3/library/configparser.html#configparser.ConfigParser