Jak czytać i pisać pliki INI i CONF za pomocą Pythona

Jak czytać i pisać pliki INI i CONF za pomocą Pythona
Język programowania Python jest wyposażony w użyteczny wbudowany moduł o nazwie „ConfigParser”, którego można użyć do czystego zapisu parametrów konfiguracji dla aplikacji. ConfigParser używa dobrze zdefiniowanego i ustrukturyzowanego języka konfiguracyjnego w pełni kompatybilnego z plikami INI znalezionymi w Microsoft Windows. Te pliki INI mogą być używane z aplikacjami Python działającymi również w Linux i zapewniają uporczywy sposób przechowywania i pobierania wartości.

W Linux częściej widać „.Pliki conf ”niż„.Pliki INI ”. Pliki Conf w Linux są jak każde inne pliki tekstowe i dlatego można je w jakikolwiek sposób ustrukturyzować. Zależy od parsera, jak interpretuje to „.plik conf ”. Moduł konfiguracyjny Pythona może analizować „.Conf ”również (lub dowolne inne losowe rozszerzenie), pod warunkiem, że pliki te są zdefiniowane w języku konfiguracji kompatybilnej z INI. W tym artykule wyjaśniono czytanie i pisanie „.Conf ”Pliki w Linux za pomocą najnowszej stabilnej wersji Python 3. Zauważ, że jeśli zastąpisz wszystkie wystąpienia „.Rozszerzenie Conf ”w tym artykule z„.INI ”rozszerzenie, wynik byłby taki sam. Proces i kod wyjaśniony poniżej powinny być również w większości kompatybilne z Microsoft Windows, z kilkoma drobnymi różnicami. Chociaż różnice te nie zostaną omówione w tym artykule.

Moduł ConfigParser

Parser lub konfigurację plików konfiguracyjnych to moduł Python, który umożliwia odczyt i zapisanie plików konfiguracyjnych używanych w aplikacjach Python. Jak wyjaśniono powyżej, ten moduł obsługuje składnię pliku INI. Bardzo uproszczony ”.ini ” /„.plik conf ”wygląda tak.

[DOMYŚLNY]
dźwięk = 1
muzyka = 1
Objętość = 0.8
Rozdzielczość = 1920x1080
[Użytkownik]
# dźwięk może mieć 0 (false) i 1 (true) jako możliwe wartości
dźwięk = 1
; Muzyka może mieć 0 (false) i 1 (true) jako możliwe wartości
muzyka = 0
Objętość = 0.4
Rozdzielczość = 1280x720

Przykład ".Plik Conf ”powyżej ma dwie sekcje,„ domyślne ”i„ użytkownik ”. Zwykle programy Python są kodowane w taki sposób, że wartości domyślne sekcji nigdy nie są zmieniane. Domyślna sekcja służy do resetowania ogólnych lub indywidualnych wartości do wartości domyślnych. Sekcja użytkownika odzwierciedla zmiany wprowadzone przez użytkownika końcowego, który korzysta z programu Python. Zauważ, że nazwy sekcji mogą być wszystkim i nie jest konieczne posiadanie domyślnej sekcji. Jednak ilekroć jest obecna sekcja „domyślna” (nazwa powinna być w wielkim poziomie), zostanie użyta do bezpiecznego podania wartości domyślnych, jeśli ConfigParser nie analizuje niektórych zmiennych. Logika do obsługi tych sekcji, zmiennych pod nimi i wartości oddechu należy zdefiniować w samym programie Python. Symbole takie jak „#” i „;” można użyć do oznaczenia komentarzy w „.CONF ”Pliki. Wszystkie pary wartości kluczowej w pliku konfiguracyjnym są wrażliwe na literę, zwykle napisane małymi literami.

Obsługa danych według konfiguracji ConfigParser

Przed pójściem naprzód z kilkoma przykładami ConfigParser ważne jest, aby zrozumieć obsługę danych przez ten moduł. Dla ConfigParser każdy kawałek kodu pisanego lub przeanalizowanego jest ciągiem. Nie może rozróżnić liczb lub żadnego innego formatu. Programiści muszą napisać logikę w swoim programie, aby przekonwertować ciąg „1234” na numer za pomocą INT („1234”) podczas czytania danych z „.plik conf ”.

Podczas gdy przekształcenie liczb za pomocą metody INT i Float jest dość łatwym zadaniem, przekonanie się na boolean może być trudne, ponieważ Python traktuje Bool („Any_String”). Aby przezwyciężyć ten problem, możesz użyć instrukcji warunkowych sprawdzających określony ciąg. Moduł ConfigParser zapewnia również metodę o nazwie „getboolean ()”. Ta metoda może poprawnie odróżnić „tak”/„nie”, „on”/„off”, „true”/„false” i „1”/”0” wartości boolean, nawet jeśli są to stringi. ConfigParser zawiera również metody getInt () i getfloat () dla wygody.

Pisanie i zapisywanie nowego pliku CONF za pomocą ConfigParser

Załóżmy, że „.Wspomniany powyżej plik Conf ”nie istnieje i chcesz go automatycznie utworzyć podczas pierwszego uruchomienia programu. Poniższy kod utworzy nowe „Ustawienia.plik conf ”w katalogu, z którego uruchomi się program Python.

Importuj ConfigParser
config = configparser.ConfigParser ()
config ['default'] = „dźwięk”: „1”, „muzyka”: „1”,
„Tom”: „0.8 ",„ Resolution ”:„ 1920x1080 ”
config ['użytkownik'] = „dźwięk”: „1”, „muzyka”: „1”,
„Tom”: „0.8 ",„ Resolution ”:„ 1920x1080 ”
z otwartym („Ustawienia.conf ', „w”) jako ConfigFile:
konfigurator.Write (ConfigFile)

Pierwsza instrukcja w powyższym kodzie importuje moduł ConfigParser. Druga instrukcja tworzy obiekt podobny do słownika o nazwie „Config”. Możesz teraz użyć standardowej składni słownika Pythona do zdefiniowania sekcji i zmiennych zawartych pod nimi, jak widać z następnych dwóch stwierdzeń. Na koniec instrukcja „z otwartym” tworzy nowe „Ustawienia.plik conf ”i zapisz sekcje konfiguracyjne do pliku.

Kod powyżej działa, ale jest z nim niewielki problem. Tworzy nowy plik ustawień za każdym razem, gdy program jest uruchamiany, co powoduje zastąpienie edycji dowolnej edycji użytkownika do pliku ustawień. Aby rozwiązać ten problem, musisz sprawdzić dwa warunki:

  • Czy plik ustawień istnieje? Jeśli nie, utwórz nowy plik ustawień tylko wtedy, gdy plik nie istnieje.
  • Plik ustawień istnieje, ale zawiera dowolne dane? Czy to jest puste? Zapisz nowe dane konfiguracyjne do pliku Ustawienia tylko wtedy, gdy są puste.

Zmodyfikowany kod poniżej sprawdzi dwa warunki i utworzy nowy plik ustawień tylko wtedy, gdy te dwa warunki zostaną spełnione.

Importuj ConfigParser
Import OS
config = configparser.ConfigParser ()
config ['default'] = „dźwięk”: „1”, „muzyka”: „1”,
„Tom”: „0.8 ",„ Resolution ”:„ 1920x1080 ”
config ['użytkownik'] = „dźwięk”: „1”, „muzyka”: „1”,
„Tom”: „0.8 ",„ Resolution ”:„ 1920x1080 ”
SETTING_FILE = OS.ścieżka.Dirname (OS.ścieżka.realPath (__ plik__))
+ OS.Ustawienia SEP + „.konf ”
Jeśli nie OS.ścieżka.istnieje (settings_file)
lub OS.Stat (Settings_file).ST_SIZE == 0:
z otwartym („Ustawienia.conf ', „w”) jako ConfigFile:
konfigurator.Write (ConfigFile)

Druga instrukcja w powyższym kodzie importuje moduł „OS”. Zmienna „Settings_file” przechowuje pełną ścieżkę do „Ustawienia.plik conf ”, który ma zostać utworzony w katalogu skryptu Python. Następne oświadczenie sprawdza dwa warunki wspomniane powyżej. Pierwsza klauzula w stwierdzeniu jest samowystarczalna. Druga klauzula sprawdza, czy rozmiar pliku to „0 bajtów”. Plik zero bajtów oznaczałby pusty plik bez przechowywanych danych. Reszta kodu jest taka sama jak pierwszy przykład podany powyżej.

Jak dotąd próbki kodów wyjaśnione powyżej zapisz plik konfiguracyjny w katalogu samego skryptu Python. Jest to jednak powszechna praktyka i standard Freedesktop, aby zapisać pliki konfiguracyjne w „.Katalog konfiguracyjny w folderze domowym. Poniższa próbka kodu utworzy nowe „Ustawienia.plik conf ”w„ ~/.folder Config/TestApp ”.

Importuj ConfigParser
Import OS
app_name = "testapp"
config_folder = OS.ścieżka.Dołącz (OS.ścieżka.Expanduser („~”), '.config ', app_name)
OS.Makedirs (config_folder, ext_ok = true)
Ustawienia_file = "Ustawienia.konf ”
Full_config_file_path = OS.ścieżka.dołącz (config_folder, settings_file)
config = configparser.ConfigParser ()
config ['default'] = „dźwięk”: „1”, „muzyka”: „1”,
„Tom”: „0.8 ",„ Resolution ”:„ 1920x1080 ”
config ['użytkownik'] = „dźwięk”: „1”, „muzyka”: „1”,
„Tom”: „0.8 ",„ Resolution ”:„ 1920x1080 ”
Jeśli nie OS.ścieżka.istnieje (full_config_file_path)
lub OS.Stat (Full_Config_file_Path).ST_SIZE == 0:
z Open (Full_Config_file_Path, „W”) jako ConfigFile:
konfigurator.Write (ConfigFile)

Kod powyżej jest prawie taki sam jak w poprzednim przykładzie, z wyjątkiem tego, że zmienia lokalizację „Ustawienia.plik conf ”do„ ~/.Config/TestApp/Ustawienia.konf ”. Zmienna „config_folder” przechowuje pełną ścieżkę do folderu aplikacji, która ma być utworzona w „.katalog config ”(„ ~/.config/testApp/”). „OS.Instrukcja Makedirs ”utworzy nowy folder aplikacji tylko wtedy, gdy nie istnieje. Zmienna „Full_config_file_path” przechowuje pełną ścieżkę pliku ustawień („~/.Config/TestApp/Ustawienia.konf ”). Reszta kodu jest samowystarczalna.

Czytanie pliku Conf za pomocą ConfigParser

Parsowanie pliku konfiguracyjnego jest dość proste. ConfigParser próbuje odczytać wartość za pomocą metod get (), getfloat (), getboolean () lub składni słownika. W przypadku błędu kluczowego używane są wartości z domyślnej sekcji lub wartości oddechu. Dobrą praktyką jest zdefiniowanie wartości domyślnej lub wartości oddechu, aby zapobiec kluczowym błędom. Możesz również użyć instrukcji próbnych do popełnienia błędów.

config = configparser.ConfigParser ()
konfigurator.odczyt (full_config_file_path)
is_sound_on = config ['użytkownik'].getboolean („dźwięk”)
volum_level = config ['użytkownik'].getfloat („tom”)
RESolution = Config ['User'] ['RESolution']
# Wartość awarii „Fałsz” zostanie zignorowana, ponieważ istnieje już sekcja domyślna.
# W przypadku braku domyślnego sekcji wartość awarii zostanie należycie użyta.
is_music_on = config ['użytkownik'].getboolean („muzyka”, false)
print (is_sound_on, is_music_on, tom_level, rozdzielczość)

W powyższym kodzie „Konfiguracja.odczyt „instrukcja jest używana do odczytu danych z pliku konfiguracyjnego. W poniższych stwierdzeniach do odczytu danych używane są różne wbudowane metody GET i notacje słownika. W deklaracji zmiennej „is_music_on” drugim argumentem jest wartość oddechu (false). Należy zauważyć, że wartości oddechu będą miały niższe pierwszeństwo niż wartości zdefiniowane w sekcji domyślnej. Mówiąc prosto, wartości Fallback nie będą miały wpływu, gdy para kluczowej jest już obecna w sekcji domyślnej.

Pełny kod

Poniżej znajduje się cały kod łączący zarówno tworzenie pierwszego uruchomienia pliku konfiguracyjnego, jak i odczyt pliku konfiguracyjnego.

#! /usr/bin/python3
Importuj ConfigParser
Import OS
app_name = "testapp"
config_folder = OS.ścieżka.Dołącz (OS.ścieżka.Expanduser („~”), '.config ', app_name)
OS.Makedirs (config_folder, ext_ok = true)
Ustawienia_file = "Ustawienia.konf ”
Full_config_file_path = OS.ścieżka.dołącz (config_folder, settings_file)
config = configparser.ConfigParser ()
config ['default'] = „dźwięk”: „1”, „muzyka”: „1”,
„Tom”: „0.8 ",„ Resolution ”:„ 1920x1080 ”
config ['użytkownik'] = „dźwięk”: „1”, „muzyka”: „1”,
„Tom”: „0.8 ",„ Resolution ”:„ 1920x1080 ”
Jeśli nie OS.ścieżka.istnieje (full_config_file_path)
lub OS.Stat (Full_Config_file_Path).ST_SIZE == 0:
z Open (Full_Config_file_Path, „W”) jako ConfigFile:
konfigurator.Write (ConfigFile)
konfigurator.odczyt (full_config_file_path)
is_sound_on = config ['użytkownik'].getboolean („dźwięk”)
volum_level = config ['użytkownik'].getfloat („tom”)
RESolution = Config ['User'] ['RESolution']
# Wartość awarii „Fałsz” zostanie zignorowana, ponieważ istnieje już sekcja domyślna.
# W przypadku braku domyślnego sekcji wartość awarii zostanie należycie użyta.
is_music_on = config ['użytkownik'].getboolean („muzyka”, false)
print (is_sound_on, is_music_on, tom_level, rozdzielczość)

Wniosek

ConfigParser w Python zapewnia użyteczny sposób obsługi ustawień zarówno wiersza poleceń, jak i aplikacji Python GUI. Te pliki konfiguracyjne mogą być również używane jako lekkie bazy danych tekstowych, ale mogą nie być odpowiednie dla zaawansowanych danych, dużych zestawów danych i dużej liczby zapytań.