U Linuxu je uobičajenije vidjeti “.conf "nego".ini ”datoteke. Datoteke Conf u Linuxu su poput svih ostalih tekstualnih datoteka i stoga ih se može strukturirati na bilo koji način. O parseru ovisi kako tumači ".datoteka conf. Pythonov modul ConfigParser može raščlaniti “.conf ”(ili bilo koje drugo slučajno proširenje), pod uvjetom da su te datoteke definirane u INI kompatibilnom konfiguracijskom jeziku. Ovaj će članak objasniti čitanje i pisanje “.conf ”u Linuxu koristeći najnoviju stabilnu verziju Pythona 3. Imajte na umu da ako zamijenite sve pojave “.conf ”proširenje u ovom članku s“.ini ”, rezultat bi bio isti. Dolje objašnjeni postupak i kod trebali bi biti uglavnom kompatibilni i s Microsoft Windowsom, s nekoliko manjih razlika. Iako ove razlike neće biti obrađene u ovom članku.
Modul ConfigParser
Analizator konfiguracijske datoteke ili ConfigParser je Python modul koji vam omogućuje čitanje i pisanje konfiguracijskih datoteka koje se koriste u Python aplikacijama. Kao što je gore objašnjeno, ovaj modul podržava sintaksu INI datoteke. Vrlo pojednostavljeno ".ini "/".conf ”datoteka izgleda ovako.
[ZADANO]zvuk = 1
glazba = 1
volumen = 0.8
razlučivost = 1920x1080
[Korisnik]
# zvuk može imati 0 (netačno) i 1 (tačno) kao moguće vrijednosti
zvuk = 1
; glazba može imati 0 (lažno) i 1 (tačno) kao moguće vrijednosti
glazba = 0
Volumen = 0.4
razlučivost = 1280x720
Primjer “.datoteka conf “ima dva odjeljka,“ DEFAULT ”i“ User ”. Obično su programi Python kodirani na takav način da se zadane vrijednosti odjeljaka nikad ne mijenjaju. Odjeljak DEFAULT koristi se za vraćanje ukupnih ili pojedinačnih vrijednosti na zadane vrijednosti. Korisnički odjeljak odražava promjene koje je napravio krajnji korisnik koji koristi program Python. Napominjemo da nazivi odjeljaka mogu biti bilo što i uopće nije potrebno imati DEFAULT odjeljak. Međutim, kad god je prisutan odjeljak “DEFAULT” (ime treba biti napisano velikim slovom), on će se koristiti za sigurno pružanje zadanih vrijednosti ako ConfigParser ne uspije raščlaniti određene varijable. Logika za rukovanje ovim odjeljcima, varijablama ispod njih i zamjenskim vrijednostima mora biti definirana u samom programu Python. Simboli poput "#" i ";" može se koristiti za označavanje komentara u “.conf ”datoteke. Svi parovi ključ / vrijednost u datoteci konfiguracije ne razlikuju velika i mala slova, obično se pišu malim slovima.
S tipovima podataka obrađuje ConfigParser
Prije nego što nastavite s nekim primjerima ConfigParser-a, važno je razumjeti tipove podataka kojima rukuje ovaj modul. Za ConfigParser svaki je dio napisanog ili raščlanjenog koda niz. Ne može razlikovati brojeve ili bilo koji drugi format. Programeri trebaju zapisati logiku u svoj program kako bi pretvorili niz "1234" u broj pomoću int ("1234") dok čitaju podatke s ".datoteka conf.
Iako je pretvaranje u brojeve pomoću metode int i float prilično jednostavan zadatak, pretvaranje u boolean može biti nezgodno jer Python tretira bool ("any_string") kao True. Da biste prevladali ovaj problem, možete upotrijebiti uvjetne izraze koji provjeravaju određeni niz. Modul ConfigParser također nudi metodu koja se naziva "getboolean ()". Ova metoda može ispravno razlikovati logičke vrijednosti 'yes' / 'no', 'on' / 'off', 'true' / 'false' i '1' / '0', čak i ako su nizovi. ConfigParser također uključuje metode getint () i getfloat () za vašu udobnost.
Pisanje i spremanje nove datoteke Conf pomoću programa ConfigParser
Pretpostavimo da.gore navedena datoteka ne postoji i želite je automatski stvoriti pri prvom pokretanju programa. Kôd u nastavku stvorit će nove „postavke.conf ”u direktoriju iz kojeg je pokrenut program Python.
import configparserconfig = configparser.ConfigParser ()
config ['DEFAULT'] = "zvuk": "1", "glazba": "1",
"volume": "0.8 "," razlučivost ":" 1920x1080 "
config ['User'] = "sound": "1", "music": "1",
"volume": "0.8 "," razlučivost ":" 1920x1080 "
s otvorenim ('postavkama.conf ',' w ') kao configfile:
konfiguracija.pisanje (configfile)
Prva izjava u gornjem kodu uvozi modul ConfigParser. Druga izjava stvara objekt nalik rječniku pod nazivom "config". Sada možete koristiti standardnu sintaksu rječnika Python za definiranje odjeljaka i varijabli uključenih ispod njih, što je vidljivo iz sljedeće dvije izjave. Na kraju, izjava “s otvorenim” stvara nove “postavke.conf ”i zapisuje konfiguracijske odjeljke u datoteku.
Gore navedeni kod djeluje, ali s njim postoji mali problem. Stvara novu datoteku s postavkama svaki put kada se program pokrene, što rezultira prepisivanjem bilo kojeg uređivanja datoteke postavki koje je izvršio korisnik. Da biste riješili ovaj problem, morate provjeriti dva uvjeta:
- Postoji li datoteka s postavkama? Ako nije, stvorite novu datoteku s postavkama samo ako datoteka ne postoji.
- Datoteka s postavkama postoji, ali sadrži li podatke? Je li prazan? Napišite nove podatke o konfiguraciji u datoteku s postavkama samo ako je prazna.
Izmijenjeni kôd u nastavku provjerit će dva uvjeta i stvorit će novu datoteku s postavkama samo ako su ta dva uvjeta zadovoljena.
import configparseruvoz os
config = configparser.ConfigParser ()
config ['DEFAULT'] = "zvuk": "1", "glazba": "1",
"volume": "0.8 "," razlučivost ":" 1920x1080 "
config ['User'] = "sound": "1", "music": "1",
"volume": "0.8 "," razlučivost ":" 1920x1080 "
datoteka_nastavka = os.staza.dirname (os.staza.stvarna staza (__ datoteka__))
+ os.sep + "postavke.konf "
ako ne os.staza.postoji (datoteka_postavke)
ili os.stat (datoteka_postavki).st_size == 0:
s otvorenim ('postavkama.conf ',' w ') kao configfile:
konfiguracija.pisati (configfile)
Druga izjava u gornjem kodu uvozi modul “os”. Varijabla “settings_file” pohranjuje puni put do “postavki.conf ”datoteku koja će se stvoriti u direktoriju Python skripte. Sljedeća izjava provjerava dva gore spomenuta uvjeta. Prva klauzula u izjavi sama po sebi objašnjava. Druga klauzula provjerava je li veličina datoteke "0 bajtova". Datoteka s nula bajtova značila bi praznu datoteku u kojoj nisu pohranjeni podaci. Ostatak koda je isti kao i prvi gore navedeni primjer.
Do sada objašnjeni uzorci koda spremaju konfiguracijsku datoteku u direktorij same Python skripte. Međutim, uobičajena je praksa i standard freedesktop-a da spremate konfiguracijske datoteke u ".config ”u početnoj mapi. Uzorak koda u nastavku stvorit će nove „postavke.conf ”u“ ~ /.config / testapp ”.
import configparseruvoz os
app_name = "testapp"
config_folder = os.staza.pridružiti se (os.staza.expanduser ("~"), '.config ', ime_aplike)
os.makedir (mapa_konfiguracije, postoji_ok = Istina)
settings_file = "postavke.konf "
full_config_file_path = os.staza.pridruži se (mapa_konfiguracije, datoteka_postavki)
config = configparser.ConfigParser ()
config ['DEFAULT'] = "zvuk": "1", "glazba": "1",
"volume": "0.8 "," razlučivost ":" 1920x1080 "
config ['User'] = "sound": "1", "music": "1",
"volume": "0.8 "," razlučivost ":" 1920x1080 "
ako ne os.staza.postoji (full_config_file_path)
ili os.stat (full_config_file_path).veličina_st == 0:
s otvorenim (full_config_file_path, 'w') kao configfile:
konfiguracija.pisanje (configfile)
Gornji kod je gotovo isti kao i raniji primjer, osim što mijenja mjesto "postavki.conf ”u“ ~ /.config / testapp / postavke.konf ". Varijabla "config_folder" pohranjuje puni put do mape aplikacije koja će se stvoriti u ".config ”direktorij (“ ~ /.config / testapp / ”). „Os.makedirs ”izradit će novu mapu aplikacije samo ako ona već ne postoji. Varijabla “full_config_file_path” pohranjuje puni put datoteke postavki (“~ /.config / testapp / postavke.conf "). Ostatak koda je samorazumljiv.
Čitanje datoteke Conf pomoću programa ConfigParser
Raščlanjivanje konfiguracijske datoteke prilično je jednostavno. ConfigParser pokušava pročitati vrijednost pomoću metoda get (), getfloat (), getboolean () ili sintakse rječnika. U slučaju pogreške ključa koriste se vrijednosti iz odjeljka DEFAULT ili zamjenske vrijednosti. Dobra je praksa definirati DEFAULT odjeljak ili zamjenske vrijednosti kako biste spriječili ključne pogreške. Za suzbijanje pogrešaka možete koristiti i izjave try-osim.
config = configparser.ConfigParser ()konfiguracija.pročitati (full_config_file_path)
is_sound_on = config ['Korisnik'].getboolean ('zvuk')
volume_level = config ['User'].getfloat ('volumen')
razlučivost = config ['Korisnik'] ['razlučivost']
# Rezervna vrijednost "False" zanemarit će se jer već postoji DEFAULT odjeljak.
# Ako nema odjeljka DEFAULT, rezervna vrijednost će se pravilno koristiti.
is_music_on = config ['Korisnik'].getboolean ('glazba', netačno)
ispis (is_sound_on, is_music_on, volume_level, razlučivost)
U gornjem uzorku koda, “config.read ”se koristi za čitanje podataka iz konfiguracijske datoteke. U sljedećim se izjavama za čitanje podataka koriste razne ugrađene metode dobivanja i zapisi u rječniku. U deklaraciji varijable “is_music_on”, drugi je argument zamjenska vrijednost (False). Imajte na umu da će zamjenske vrijednosti imati niži prioritet od vrijednosti definiranih u odjeljku DEFAULT. Jednostavno rečeno, zamjenske vrijednosti neće imati učinka kada je par ključ / vrijednost već prisutan u odjeljku DEFAULT.
Puni kod
Ispod je cijeli kôd koji kombinira i prvo pokretanje izrade konfiguracijske datoteke i čitanje konfiguracijske datoteke.
#! / usr / bin / python3import configparser
uvoz os
app_name = "testapp"
config_folder = os.staza.pridružiti se (os.staza.expanduser ("~"), '.config ', ime_aplike)
os.makedir (mapa_konfiguracije, postoji_ok = Istina)
settings_file = "postavke.konf "
full_config_file_path = os.staza.pridruži se (mapa_konfiguracije, datoteka_postavki)
config = configparser.ConfigParser ()
config ['DEFAULT'] = "zvuk": "1", "glazba": "1",
"volume": "0.8 "," razlučivost ":" 1920x1080 "
config ['User'] = "sound": "1", "music": "1",
"volume": "0.8 "," razlučivost ":" 1920x1080 "
ako ne os.staza.postoji (full_config_file_path)
ili os.stat (full_config_file_path).veličina_st == 0:
s otvorenim (full_config_file_path, 'w') kao configfile:
konfiguracija.pisanje (configfile)
konfiguracija.pročitati (full_config_file_path)
is_sound_on = config ['Korisnik'].getboolean ('zvuk')
volume_level = config ['Korisnik'].getfloat ('volumen')
razlučivost = config ['Korisnik'] ['razlučivost']
# Rezervna vrijednost "False" zanemarit će se jer već postoji DEFAULT odjeljak.
# Ako nema odjeljka DEFAULT, rezervna vrijednost će se pravilno koristiti.
is_music_on = config ['Korisnik'].getboolean ('glazba', netačno)
ispis (is_sound_on, is_music_on, volume_level, razlučivost)
Zaključak
ConfigParser u Pythonu pruža koristan način za rukovanje postavkama i naredbenog retka i GUI Python aplikacija. Te se konfiguracijske datoteke mogu koristiti i kao lagane baze podataka temeljene na tekstu, ali možda nisu prikladne za napredne tipove podataka, velike skupove podataka i velik broj upita.