Python

Как да четем и пишем INI и Conf файлове, използвайки Python

Как да четем и пишем INI и Conf файлове, използвайки Python
Езикът за програмиране на Python се предлага с полезен вграден модул, наречен „ConfigParser“, който може да се използва за чисто писане на конфигурационни параметри за приложения. ConfigParser използва добре дефиниран и структуриран език за конфигуриране, напълно съвместим с INI файлове, намерени в Microsoft Windows. Тези INI файлове могат да се използват и с приложения на Python, работещи в Linux, и те осигуряват постоянен начин за съхраняване и извличане на стойности.

В Linux е по-често да се вижда „.conf “файлове от“.ini ”файлове. Conf файловете в Linux са точно като всички други текстови файлове и следователно те могат да бъдат структурирани по всякакъв начин. Зависи от анализатора как тълкува „.conf ”файл. Модулът ConfigParser на Python може да анализира “.conf ”файлове (или всяко друго произволно разширение), при условие че тези файлове са дефинирани в INI съвместим език за конфигурация. Тази статия ще обясни четенето и писането „.conf ”файлове в Linux, използвайки най-новата стабилна версия на Python 3. Имайте предвид, че ако замените всички случаи на „.conf “разширение в тази статия с„.ini ”, резултатът ще бъде същият. Процесът и кодът, обяснени по-долу, трябва да бъдат най-вече съвместими и с Microsoft Windows, с няколко малки разлики. Въпреки че тези разлики няма да бъдат разгледани в тази статия.

Модул ConfigParser

Анализатор на конфигурационен файл или ConfigParser е модул на Python, който ви позволява да четете и пишете конфигурационни файлове, използвани в приложенията на Python. Както е обяснено по-горе, този модул поддържа синтаксис на INI файл. Много опростен.ini ”/“.conf ”изглежда така.

[ПО ПОДРАЗБИРАНЕ]
звук = 1
музика = 1
обем = 0.8
резолюция = 1920x1080
[Потребител]
# звук може да има 0 (false) и 1 (true) като възможни стойности
звук = 1
; музиката може да има 0 (false) и 1 (true) като възможни стойности
музика = 0
Обем = 0.4
резолюция = 1280x720

Примерът „.файлът conf има два раздела, „ПО подразбиране“ и „потребител“. Обикновено програмите на Python се кодират по такъв начин, че стойностите на раздела по подразбиране никога не се променят. Разделът по подразбиране се използва за нулиране на общите или отделните стойности на стойностите по подразбиране. Потребителският раздел отразява промените, направени от краен потребител, който използва програмата Python. Имайте предвид, че имената на разделите могат да бъдат всякакви и изобщо не е необходимо да имате раздел ПО подразбиране. Когато обаче присъства раздел „ПО подразбиране“ (името трябва да е с главни букви), той ще се използва за безопасно предоставяне на стойности по подразбиране, ако ConfigParser не успее да анализира определени променливи. Логиката за обработка на тези раздели, променливи под тях и резервни стойности трябва да бъде дефинирана в самата програма на Python. Символи като „#“ и „;“ може да се използва за означаване на коментари в „.conf ”файлове. Всички двойки ключ-стойност в конфигурационния файл не са чувствителни към регистъра, обикновено се пишат с малки букви.

Обработка на типове данни от ConfigParser

Преди да продължите напред с някои примери за ConfigParser, е важно да разберете типовете данни, обработвани от този модул. За ConfigParser всяко парче написан или анализиран код е низ. Той не може да прави разлика между числа или друг формат. Програмистите трябва да напишат логика в своята програма, за да преобразуват низ „1234“ в число чрез използване на int („1234“), докато четат данни от „.conf ”файл.

Докато преобразуването в числа с помощта на метода int и float е доста лесна задача, преобразуването в boolean може да бъде сложно, тъй като Python третира bool („any_string“) като True. За да преодолеете този проблем, можете да използвате условни оператори, проверяващи за определен низ. Модулът ConfigParser предоставя и метод, наречен „getboolean ()“. Този метод може правилно да разграничи булевите стойности „да“ / „не“, „включено“ / „изключено“, „вярно“ / „невярно“ и „1“ / „0“, дори ако са низове. ConfigParser включва също getint () и getfloat () методи за ваше удобство.

Писане и запазване на нов Conf файл с помощта на ConfigParser

Нека приемем, че „.conf ”, споменат по-горе, не съществува и искате да го създадете автоматично при първото стартиране на програмата. Кодът по-долу ще създаде нови „настройки.conf ”в директорията, от която е стартирана програмата Python.

импортиране на configparser
config = configparser.ConfigParser ()
config ['DEFAULT'] = "звук": "1", "музика": "1",
"том": "0.8 "," резолюция ":" 1920x1080 "
config ['Потребител'] = "звук": "1", "музика": "1",
"том": "0.8 "," резолюция ":" 1920x1080 "
с отворени ('настройки.conf ',' w ') като configfile:
конфиг.запис (configfile)

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

Кодът по-горе работи, но има малък проблем с него. Той създава нов файл с настройки при всяко стартиране на програмата, което води до презаписване на всички направени от потребителя редакции на файла с настройки. За да разрешите този проблем, трябва да проверите две условия:

Модифицираният код по-долу ще провери двете условия и ще създаде нов файл с настройки само ако тези две условия са изпълнени.

импортиране на configparser
внос os
 
config = configparser.ConfigParser ()
config ['DEFAULT'] = "звук": "1", "музика": "1",
"том": "0.8 "," резолюция ":" 1920x1080 "
config ['Потребител'] = "звук": "1", "музика": "1",
"том": "0.8 "," резолюция ":" 1920x1080 "
файл_настройки = ос.път.dirname (os.път.реална пътека (__ файл__))
+ операционна система.сеп + "настройки.conf "
ако не ос.път.съществува (файл_настройки)
или ос.статистика (файл_настройки).st_size == 0:
с отворени ('настройки.conf ',' w ') като configfile:
конфиг.запис (configfile)

Второто изявление в горния код импортира модула “os”. Променливата „settings_file“ съхранява пълен път до „settings“.conf ”, който ще бъде създаден в директорията на скрипта на Python. Следващото изявление проверява две условия, споменати по-горе. Първата клауза в изявлението е обяснителна. Втората клауза проверява дали размерът на файла е „0 байта“. Файл с нулев байт би означавал празен файл, в който няма съхранени данни. Останалата част от кода е същата като първия пример, посочен по-горе.

Досега описаните по-горе примерни кодове запазват конфигурационния файл в директорията на самия скрипт на Python. Въпреки това е обичайна практика и стандарт на freedesktop да записвате конфигурационни файлове в „.config ”в началната папка. Примерът на кода по-долу ще създаде нови „настройки.conf ”файл в“ ~ /.config / testapp ”папка.

импортиране на configparser
внос os
 
app_name = "testapp"
config_folder = os.път.присъединяване (os.път.expanduser ("~"), '.config ', име_на приложение)
операционна система.makedirs (config_folder, Obsta_ok = Вярно)
settings_file = "настройки.conf "
full_config_file_path = os.път.присъединяване (config_folder, settings_file)
 
config = configparser.ConfigParser ()
config ['DEFAULT'] = "звук": "1", "музика": "1",
"том": "0.8 "," резолюция ":" 1920x1080 "
config ['Потребител'] = "звук": "1", "музика": "1",
"том": "0.8 "," резолюция ":" 1920x1080 "
 
ако не ос.път.съществува (full_config_file_path)
или ос.stat (пълен_конфигурационен_файл_път).st_size == 0:
с отворен (full_config_file_path, 'w') като configfile:
конфиг.запис (configfile)

Кодът по-горе е почти същият като по-ранния пример, с изключение на това, че променя местоположението на „настройки.conf “в„ ~ /.config / testapp / настройки.доверие ”. Променливата „config_folder“ съхранява пълния път до папката на приложението, която ще бъде създадена в „.config ”директория (“ ~ /.config / testapp / ”). „Ос.makedirs “ще създаде нова папка с приложения само ако тя все още не съществува. Променливата “full_config_file_path” съхранява пълния път на файла с настройки (“~ /.config / testapp / настройки.conf ”). Останалата част от кода се обяснява сама по себе си.

Четене на Conf файл с помощта на ConfigParser

Анализирането на конфигурационен файл е доста лесно. ConfigParser се опитва да прочете стойност с помощта на get (), getfloat (), getboolean () методи или синтаксис на речника. В случай на ключова грешка се използват стойности от раздела ПО подразбиране или резервни стойности. Добра практика е да дефинирате раздела по подразбиране или резервни стойности, за да предотвратите ключови грешки. Можете да използвате и инструкции try-Osim, за да потискате грешките.

config = configparser.ConfigParser ()
конфиг.четене (пълен_конфигурационен_файл_път)
 
is_sound_on = config ['Потребител'].getboolean ('звук')
volume_level = config ['Потребител'].getfloat ('обем')
резолюция = config ['Потребител'] ['резолюция']
 
# Запасна стойност "False" ще бъде игнорирана, тъй като вече има раздел по подразбиране.
# При липса на раздел ПО подразбиране, резервната стойност ще бъде надлежно използвана.
is_music_on = config ['Потребител'].getboolean ('музика', False)
 
печат (is_sound_on, is_music_on, level_level, резолюция)

В примера на кода по-горе, „config.четене ”се използва за четене на данни от конфигурационен файл. В следващите изявления се използват различни вградени методи за получаване и речникови означения за четене на данните. В декларацията за променлива “is_music_on” вторият аргумент е резервна стойност (False). Имайте предвид, че резервните стойности ще имат по-нисък приоритет от стойностите, дефинирани в раздела ПО подразбиране. По-просто казано, резервните стойности няма да имат ефект, когато двойка ключ-стойност вече присъства в раздела ПО подразбиране.

Пълен код

По-долу е целият код, съчетаващ както първоначално стартиране на конфигурационния файл, така и четене на конфигурационния файл.

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

Заключение

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

Топ 5 продукти за ергономична компютърна мишка за Linux
Продължителната употреба на компютър причинява ли болка в китката или пръстите? Страдате ли от схванати стави и постоянно ли ви се налага да си ръкува...
Как да променяте настройките на мишката и тъчпада с помощта на Xinput в Linux
Повечето дистрибуции на Linux се доставят с библиотека “libinput” по подразбиране за обработка на входни събития в системата. Той може да обработва вх...
Пренастройте бутоните на мишката си по различен начин за различен софтуер с X-Mouse Button Control
Може би се нуждаете от инструмент, който може да промени контрола на мишката с всяко приложение, което използвате. Ако случаят е такъв, можете да изпр...