Python

Как читать и записывать файлы INI и Conf с помощью Python

Как читать и записывать файлы INI и Conf с помощью Python
Язык программирования Python поставляется с полезным встроенным модулем под названием «ConfigParser», который можно использовать для чистой записи параметров конфигурации для приложений. ConfigParser использует четко определенный и структурированный язык конфигурации, полностью совместимый с INI-файлами в Microsoft Windows. Эти файлы INI можно использовать с приложениями Python, работающими в Linux, и они обеспечивают постоянный способ хранения и извлечения значений.

В Linux чаще встречается «.conf "файлы, чем".ini »файлы. Файлы conf в Linux похожи на любые другие текстовые файлы, поэтому их можно структурировать любым способом. Это зависит от парсера, как он интерпретирует «.conf »файл. Модуль Python ConfigParser может анализировать «.conf »(или любое другое случайное расширение), при условии, что эти файлы определены на INI-совместимом языке конфигурации. В этой статье рассказывается о чтении и письме «.conf »в Linux с использованием последней стабильной версии Python 3. Обратите внимание, что если вы замените все вхождения «.conf »в этой статье с«.ini », результат будет таким же. Процесс и код, описанные ниже, должны быть в основном совместимы с Microsoft Windows, с некоторыми незначительными отличиями. Хотя эти различия не будут рассмотрены в этой статье.

Модуль ConfigParser

Анализатор файла конфигурации или ConfigParser - это модуль Python, который позволяет вам читать и записывать файлы конфигурации, используемые в приложениях Python. Как объяснялось выше, этот модуль поддерживает синтаксис файла INI. Очень упрощенный ".ini »/«.conf »файл выглядит так.

[ПО УМОЛЧАНИЮ]
звук = 1
музыка = 1
объем = 0.8
разрешение = 1920x1080
[Пользователь]
# звук может иметь возможные значения 0 (ложь) и 1 (истина)
звук = 1
; музыка может иметь возможные значения 0 (ложь) и 1 (истина)
музыка = 0
Объем = 0.4
разрешение = 1280x720

Пример ".conf », приведенный выше, имеет два раздела:« ПО УМОЛЧАНИЮ »и« Пользователь ». Обычно программы Python кодируются таким образом, что значения раздела DEFAULT никогда не меняются. Раздел ПО УМОЛЧАНИЮ используется для сброса общих или отдельных значений до значений по умолчанию. Раздел пользователя отражает изменения, внесенные конечным пользователем, использующим программу Python. Обратите внимание, что имена разделов могут быть любыми, и нет необходимости иметь раздел DEFAULT. Однако всякий раз, когда присутствует раздел «DEFAULT» (имя должно быть в верхнем регистре), он будет использоваться для безопасного предоставления значений по умолчанию, если ConfigParser не сможет проанализировать определенные переменные. Логика обработки этих разделов, переменных в них и резервных значений должна быть определена в самой программе Python. Такие символы, как «#» и «;» может использоваться для обозначения комментариев в «.conf »файлы. Все пары ключ-значение в файле конфигурации не чувствительны к регистру, обычно записываются в нижнем регистре.

Обработка типов данных с помощью ConfigParser

Прежде чем перейти к некоторым примерам ConfigParser, важно понять, как этот модуль обрабатывает типы данных. Для ConfigParser каждый фрагмент написанного или проанализированного кода представляет собой строку. Он не может различать числа или любой другой формат. Программистам необходимо написать логику в своей программе для преобразования строки «1234» в число, используя int («1234») при чтении данных из «.conf »файл.

В то время как преобразование в числа с использованием методов int и float - довольно простая задача, преобразование в логическое значение может быть сложным, поскольку Python рассматривает bool («any_string») как True. Чтобы решить эту проблему, вы можете использовать условные операторы, проверяющие конкретную строку. Модуль ConfigParser также предоставляет метод под названием «getboolean ()». Этот метод может правильно различать логические значения 'да' / 'нет', 'вкл' / 'выкл', 'истина' / 'ложь' и '1' / '0', даже если они являются строками. ConfigParser также включает методы getint () и getfloat () для вашего удобства.

Написание и сохранение нового файла конфигурации с помощью ConfigParser

Предположим, что «.conf », упомянутого выше, не существует, и вы хотите создать его автоматически при первом запуске программы. Приведенный ниже код создаст новые «настройки.conf »в каталоге, из которого была запущена программа Python.

импортировать configparser
config = configparser.ConfigParser ()
config ['DEFAULT'] = "звук": "1", "музыка": "1",
"volume": "0.8 "," разрешение ":" 1920x1080 "
config ['User'] = "звук": "1", "музыка": "1",
"volume": "0.8 "," разрешение ":" 1920x1080 "
с открытыми ('настройками.conf ',' w ') как файл конфигурации:
config.написать (файл конфигурации)

Первый оператор в приведенном выше коде импортирует модуль ConfigParser. Второй оператор создает похожий на словарь объект с именем «config». Теперь вы можете использовать стандартный синтаксис словаря Python для определения разделов и переменных, включенных в них, как видно из следующих двух операторов. Наконец, оператор «с открытым» создает новые «настройки.conf »и записывает разделы конфигурации в файл.

Приведенный выше код работает, но с ним есть небольшая проблема. Он создает новый файл настроек каждый раз при запуске программы, что приводит к перезаписи любых изменений, внесенных пользователем в файл настроек. Чтобы решить эту проблему, вам необходимо проверить два условия:

Измененный код ниже проверит два условия и создаст новый файл настроек, только если эти два условия соблюдены.

импортировать configparser
импорт ОС
 
config = configparser.ConfigParser ()
config ['DEFAULT'] = "звук": "1", "музыка": "1",
"volume": "0.8 "," разрешение ":" 1920x1080 "
config ['User'] = "звук": "1", "музыка": "1",
"volume": "0.8 "," разрешение ":" 1920x1080 "
settings_file = ОС.дорожка.dirname (os.дорожка.realpath (__ файл__))
+ Операционные системы.sep + "настройки.conf "
если не ос.дорожка.существует (файл_установок)
или ОС.stat (файл_установок).st_size == 0:
с открытыми ('настройками.conf ',' w ') как файл конфигурации:
config.написать (файл конфигурации)

Второй оператор в приведенном выше коде импортирует модуль «os». В переменной «settings_file» хранится полный путь к «settings.conf », который будет создан в каталоге скрипта Python. Следующий оператор проверяет два условия, упомянутые выше. Первое предложение в заявлении говорит само за себя. Второе предложение проверяет, равен ли размер файла «0 байт». Файл с нулевым байтом будет означать пустой файл без хранящихся в нем данных. Остальная часть кода такая же, как и в первом примере, приведенном выше.

Пока что примеры кода, описанные выше, сохраняют файл конфигурации в каталоге самого скрипта Python. Однако обычной практикой и стандартом Freedesktop является сохранение файлов конфигурации в папке «.config »в домашней папке. В приведенном ниже примере кода будут созданы новые настройки.conf »в« ~ /.config / testapp »папка.

импортировать configparser
импорт ОС
 
app_name = "testapp"
config_folder = ОС.дорожка.присоединиться (os.дорожка.expanduser ("~"), '.config ', имя_приложения)
Операционные системы.makedirs (config_folder, exist_ok = True)
settings_file = "настройки.conf "
full_config_file_path = ОС.дорожка.присоединиться (config_folder, settings_file)
 
config = configparser.ConfigParser ()
config ['DEFAULT'] = "звук": "1", "музыка": "1",
"volume": "0.8 "," разрешение ":" 1920x1080 "
config ['User'] = "звук": "1", "музыка": "1",
"volume": "0.8 "," разрешение ":" 1920x1080 "
 
если не ос.дорожка.существует (full_config_file_path)
или ОС.stat (full_config_file_path).st_size == 0:
с open (full_config_file_path, 'w') в качестве файла конфигурации:
config.написать (файл конфигурации)

Приведенный выше код почти такой же, как и в предыдущем примере, за исключением того, что он изменяет расположение «settings.conf »в« ~ /.config / testapp / настройки.conf ». В переменной «config_folder» хранится полный путь к папке приложения, которая будет создана в «.config »(« ~ /.config / testapp / ”). "ОС".makedirs »создаст новую папку приложения, только если она еще не существует. Переменная full_config_file_path хранит полный путь к файлу настроек («~ /.config / testapp / настройки.conf ”). Остальная часть кода говорит сама за себя.

Чтение файла конфигурации с помощью ConfigParser

Разбор файла конфигурации довольно прост. ConfigParser пытается прочитать значение с помощью методов get (), getfloat (), getboolean () или синтаксиса словаря. В случае ключевой ошибки используются значения из раздела DEFAULT или резервные значения. Рекомендуется определить раздел ПО УМОЛЧАНИЮ или резервные значения, чтобы предотвратить ключевые ошибки. Вы также можете использовать инструкции try-except для подавления ошибок.

config = configparser.ConfigParser ()
config.читать (full_config_file_path)
 
is_sound_on = config ['Пользователь'].getboolean ('звук')
volume_level = config ['Пользователь'].getfloat ('объем')
разрешение = config ['Пользователь'] ['разрешение']
 
# Резервное значение "False" будет проигнорировано, так как раздел DEFAULT уже существует.
# При отсутствии раздела DEFAULT, будет должным образом использоваться резервное значение.
is_music_on = config ['Пользователь'].getboolean ('музыка'; ложь)
 
print (is_sound_on, is_music_on, volume_level, разрешение)

В приведенном выше примере кода «config.read »используется для чтения данных из файла конфигурации. В следующих инструкциях для чтения данных используются различные встроенные методы get и словарные нотации. В объявлении переменной is_music_on вторым аргументом является резервное значение (False). Обратите внимание, что резервные значения будут иметь более низкий приоритет, чем значения, определенные в разделе DEFAULT. Проще говоря, резервные значения не будут иметь никакого эффекта, если пара "ключ-значение" уже присутствует в разделе DEFAULT.

Полный код

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

#! / usr / bin / python3
импортировать configparser
импорт ОС
 
app_name = "testapp"
config_folder = ОС.дорожка.присоединиться (os.дорожка.expanduser ("~"), '.config ', имя_приложения)
Операционные системы.makedirs (config_folder, exist_ok = True)
settings_file = "настройки.conf "
full_config_file_path = ОС.дорожка.присоединиться (config_folder, settings_file)
 
config = configparser.ConfigParser ()
 
config ['DEFAULT'] = "звук": "1", "музыка": "1",
"volume": "0.8 "," разрешение ":" 1920x1080 "
config ['User'] = "звук": "1", "музыка": "1",
"volume": "0.8 "," разрешение ":" 1920x1080 "
 
если не ос.дорожка.существует (full_config_file_path)
или ОС.stat (full_config_file_path).st_size == 0:
с open (full_config_file_path, 'w') в качестве файла конфигурации:
config.написать (файл конфигурации)
 
config.читать (full_config_file_path)
is_sound_on = config ['Пользователь'].getboolean ('звук')
volume_level = config ['Пользователь'].getfloat ('объем')
разрешение = config ['Пользователь'] ['разрешение']
 
# Резервное значение "False" будет проигнорировано, так как раздел DEFAULT уже существует.
# При отсутствии раздела DEFAULT, будет должным образом использоваться резервное значение.
is_music_on = config ['Пользователь'].getboolean ('музыка'; ложь)
 
print (is_sound_on, is_music_on, volume_level, разрешение)

Заключение

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

Учебник OpenTTD
OpenTTD - одна из самых популярных бизнес-симуляторов. В этой игре вам нужно создать замечательный транспортный бизнес. Тем не менее, вы начнете в нач...
SuperTuxKart для Linux
SuperTuxKart - отличная игра, созданная для того, чтобы бесплатно познакомить вас с Mario Kart в вашей системе Linux. Играть в нее довольно сложно и в...
Учебник Battle for Wesnoth
Битва за Веснот - одна из самых популярных стратегических игр с открытым исходным кодом, в которую вы можете играть сейчас. Эта игра не только очень д...