Python

Sådan læses og skrives INI- og Conf-filer ved hjælp af Python

Sådan læses og skrives INI- og Conf-filer ved hjælp af Python
Python programmeringssprog leveres med et nyttigt indbygget modul kaldet "ConfigParser", som kan bruges til rent at skrive konfigurationsparametre til apps. ConfigParser bruger et veldefineret og struktureret konfigurationssprog, der er fuldt kompatibelt med INI-filer, der findes i Microsoft Windows. Disse INI-filer kan også bruges med Python-apps, der kører i Linux, og de giver en vedvarende måde at gemme og hente værdier på.

I Linux er det mere almindeligt at se “.conf ”filer end“.ini ”-filer. Conf-filer i Linux er ligesom alle andre tekstfiler, og derfor kan de struktureres på enhver måde. Det afhænger af parser, hvordan det fortolker en ”.conf ”fil. Pythons ConfigParser-modul kan analysere “.conf ”-filer (eller enhver anden tilfældig udvidelse), forudsat at disse filer er defineret i INI-kompatibelt konfigurationssprog. Denne artikel forklarer læsning og skrivning “.conf ”filer i Linux ved hjælp af den seneste stabile version af Python 3. Bemærk, at hvis du erstatter alle forekomster af “.conf ”udvidelse i denne artikel med“.ini ”udvidelse, ville resultatet være det samme. Processen og koden, der er forklaret nedenfor, skal også for det meste være kompatibel med Microsoft Windows med nogle få mindre forskelle. Selvom disse forskelle ikke vil blive dækket af denne artikel.

ConfigParser-modul

Konfigurationsfil parser eller ConfigParser er et Python-modul, der giver dig mulighed for at læse og skrive konfigurationsfiler, der bruges i Python-apps. Som forklaret ovenfor understøtter dette modul INI-filsyntaks. En meget forenklet “.ini ”/“.conf ”-fil ser sådan ud.

[STANDARD]
lyd = 1
musik = 1
volumen = 0.8
opløsning = 1920x1080
[Bruger]
# lyd kan have 0 (falsk) og 1 (sand) som mulige værdier
lyd = 1
; musik kan have 0 (falsk) og 1 (sand) som mulige værdier
musik = 0
Volumen = 0.4
opløsning = 1280x720

Eksemplet “.conf ”-fil ovenfor har to sektioner,“ DEFAULT ”og“ User ”. Normalt er Python-programmer kodet på en sådan måde, at DEFAULT-sektionsværdier aldrig ændres. DEFAULT-sektionen bruges til at nulstille generelle eller individuelle værdier til standardværdier. Brugersektionen afspejler ændringer foretaget af en slutbruger, der bruger Python-programmet. Bemærk, at sektionsnavne kan være hvad som helst, og det er slet ikke nødvendigt at have en DEFAULT-sektion. Når "DEFAULT" -afsnittet er til stede (navnet skal være med store bogstaver), vil det dog bruges til sikkert at give standardværdier, hvis ConfigParser ikke analyserer bestemte variabler. Logikken til at håndtere disse sektioner, variabler under dem og reserveværdier skal defineres i selve Python-programmet. Symboler som "#" og ";" kan bruges til at betegne kommentarer i “.conf ”filer. Alle nøgleværdipar i konfigurationsfilen er store og små bogstaver, normalt skrevet med små bogstaver.

Datatyper, der håndteres af ConfigParser

Før du går videre med nogle eksempler på ConfigParser, er det vigtigt at forstå datatyperhåndtering af dette modul. For ConfigParser er hvert stykke skrevet eller analyseret kode en streng. Det kan ikke skelne mellem tal eller noget andet format. Programmører skal skrive logik i deres program for at konvertere en streng “1234” til nummer ved hjælp af int (“1234”), mens de læser data fra en “.conf ”fil.

Mens konvertering til tal ved hjælp af metoden int og float er en ret nem opgave, kan konvertering til boolsk være vanskelig, da Python behandler bool ("enhver_streng") for at være sand. For at løse dette problem kan du bruge betingede udsagn til at kontrollere en bestemt streng. ConfigParser-modulet indeholder også en metode kaldet "getboolean ()". Denne metode kan korrekt skelne mellem 'ja' / 'nej', 'til' / 'fra', 'sand' / 'falsk' og '1' / '0' boolske værdier, selvom de er strenge. ConfigParser inkluderer også getint () og getfloat () metoder for din bekvemmelighed.

Skrivning og lagring af en ny Conf-fil ved hjælp af ConfigParser

Lad os antage, at “.conf ”-filen, der er nævnt ovenfor, findes ikke, og du vil oprette den automatisk ved første start af programmet. Koden nedenfor opretter nye “indstillinger.conf ”-fil i den mappe, hvor Python-programmet er kørt.

importer configparser
config = configparser.ConfigParser ()
config ['DEFAULT'] = "lyd": "1", "musik": "1",
"volume": "0.8 "," opløsning ":" 1920x1080 "
config ['User'] = "sound": "1", "music": "1",
"volume": "0.8 "," opløsning ":" 1920x1080 "
med åben ('indstillinger.conf ',' w ') som konfigurationsfil:
config.skriv (konfigurationsfil)

Den første sætning i koden ovenfor importerer ConfigParser-modulet. Den anden sætning opretter et ordboglignende objekt kaldet "config". Du kan nu bruge standard Python-ordboksyntaks til at definere sektioner og variabler, der er inkluderet under dem, som det fremgår af de næste to udsagn. Endelig opretter “med åben” udsagn nye ”indstillinger.conf ”-fil og skriver konfigurationssektioner til filen.

Koden ovenfor fungerer, men der er et lille problem med det. Det opretter en ny indstillingsfil hver gang programmet køres, hvilket resulterer i overskrivning af eventuelle brugerændrede redigeringer af indstillingsfilen. For at løse dette problem skal du kontrollere to betingelser:

Den modificerede kode nedenfor kontrollerer de to betingelser og opretter kun en ny indstillingsfil, hvis disse to betingelser er opfyldt.

importer configparser
importer os
 
config = configparser.ConfigParser ()
config ['DEFAULT'] = "lyd": "1", "musik": "1",
"volume": "0.8 "," opløsning ":" 1920x1080 "
config ['User'] = "sound": "1", "music": "1",
"volume": "0.8 "," opløsning ":" 1920x1080 "
settings_file = os.sti.dirname (os.sti.realpath (__ fil__))
+ os.sep + "indstillinger.conf "
hvis ikke os.sti.findes (indstillingsfil)
eller os.stat (indstillingsfil).st_size == 0:
med åben ('indstillinger.conf ',' w ') som konfigurationsfil:
config.skriv (konfigurationsfil)

Den anden erklæring i ovenstående kode importerer “os” -modulet. Variablen "settings_file" gemmer den fulde sti til "indstillingerne.conf ”-fil, der skal oprettes i Python-scriptets mappe. Den næste erklæring kontrollerer to ovennævnte betingelser. Den første klausul i erklæringen er selvforklarende. Den anden klausul kontrollerer, om filstørrelsen er “0 byte”. En fil med nulbyte ville betyde en tom fil uden data gemt i den. Resten af ​​koden er den samme som det første eksempel, der er angivet ovenfor.

Indtil videre gemmer kodeeksemplerne, der er forklaret ovenfor, konfigurationsfilen i biblioteket i selve Python-scriptet. Det er dog en almindelig praksis og freedesktop-standard at gemme konfigurationsfiler i “.config ”-mappe i hjemmemappen. Kodeprøven nedenfor opretter nye “indstillinger.conf ”fil i“ ~ /.config / testapp ”-mappe.

importer configparser
importer os
 
app_name = "testapp"
config_folder = os.sti.slutte sig til (os.sti.udvidelsesbruger ("~"), '.config ', app_name)
os.makedirs (config_folder, exist_ok = True)
settings_file = "indstillinger.conf "
full_config_file_path = os.sti.join (config_folder, settings_file)
 
config = configparser.ConfigParser ()
config ['DEFAULT'] = "lyd": "1", "musik": "1",
"volume": "0.8 "," opløsning ":" 1920x1080 "
config ['User'] = "sound": "1", "music": "1",
"volume": "0.8 "," opløsning ":" 1920x1080 "
 
hvis ikke os.sti.findes (fuld_konfig_fil_sti)
eller os.stat (fuld_konfig_fil_sti).st_size == 0:
med åben (fuld_konfig_fil_sti, 'w') som konfigurationsfil:
config.skriv (konfigurationsfil)

Koden ovenfor er næsten den samme som det tidligere eksempel, bortset fra at den ændrer placeringen af ​​“indstillinger.conf ”fil til“ ~ /.config / testapp / indstillinger.conf ”. Variablen "config_folder" gemmer den fulde sti til den applikationsmappe, der skal oprettes i ".config ”-mappe (“ ~ /.config / testapp / ”). Den "os.makedirs ”udsagn opretter kun en ny app-mappe, hvis den ikke allerede findes. Variablen “full_config_file_path” gemmer den fulde sti til indstillingsfilen (“~ /.config / testapp / indstillinger.conf ”). Resten af ​​koden er selvforklarende.

Læsning af en Conf-fil ved hjælp af ConfigParser

At analysere en konfigurationsfil er ret ligetil. ConfigParser forsøger at læse en værdi ved hjælp af get (), getfloat (), getboolean () metoder eller ordboksyntaks. I tilfælde af en nøglefejl anvendes værdier fra sektionen STANDARD eller reserveværdier. Det er en god praksis at definere DEFAULT-sektions- eller reserveværdier for at forhindre nøglefejl. Du kan også bruge undtagen udsagn til at undertrykke fejl.

config = configparser.ConfigParser ()
config.læse (fuld_konfig_fil_sti)
 
is_sound_on = config ['Bruger'].getboolean ('lyd')
volume_level = config ['Bruger'].getfloat ('volumen')
resolution = config ['Bruger'] ['opløsning']
 
# Tilbageværelsesværdi "Falsk" ignoreres, da der allerede er en STANDARD-sektion.
# I mangel af DEFAULT-sektionen vil tilbagebetalingsværdien blive brugt korrekt.
is_music_on = config ['Bruger'].getboolean ('musik', falsk)
 
print (is_sound_on, is_music_on, volume_level, resolution)

I kodeeksemplet ovenfor, “config.læse-erklæring bruges til at læse data fra en konfigurationsfil. I de følgende udsagn bruges forskellige indbyggede get-metoder og ordbogsnotationer til at læse dataene. I variabeldeklarationen “is_music_on” er det andet argument reserveværdi (False). Bemærk, at reserveværdier har lavere forrang end værdier, der er defineret i afsnittet STANDARD. Enkelt sagt har reserveværdier ingen virkning, når der allerede er et nøgleværdipar i afsnittet STANDARD.

Fuld kode

Nedenfor er hele koden, der kombinerer både oprettelse af første konfiguration af konfigurationsfilen og læsning af konfigurationsfilen.

#! / usr / bin / python3
importer configparser
importer os
 
app_name = "testapp"
config_folder = os.sti.slutte sig til (os.sti.udvidelsesbruger ("~"), '.config ', app_name)
os.makedirs (config_folder, exist_ok = True)
settings_file = "indstillinger.conf "
full_config_file_path = os.sti.join (config_folder, settings_file)
 
config = configparser.ConfigParser ()
 
config ['DEFAULT'] = "lyd": "1", "musik": "1",
"volume": "0.8 "," opløsning ":" 1920x1080 "
config ['User'] = "sound": "1", "music": "1",
"volume": "0.8 "," opløsning ":" 1920x1080 "
 
hvis ikke os.sti.eksisterer (fuld_konfig_fil_sti)
eller os.stat (fuld_konfig_fil_sti).st_size == 0:
med åben (fuld_konfig_fil_sti, 'w') som konfigurationsfil:
config.skriv (konfigurationsfil)
 
config.læse (fuld_konfig_fil_sti)
is_sound_on = config ['Bruger'].getboolean ('lyd')
volume_level = config ['Bruger'].getfloat ('volumen')
resolution = config ['User'] ['resolution']
 
# Tilbageværelsesværdi "Falsk" ignoreres, da der allerede er en STANDARD-sektion.
# I mangel af DEFAULT-sektionen vil tilbagebetalingsværdien blive brugt korrekt.
is_music_on = config ['Bruger'].getboolean ('musik', falsk)
 
print (is_sound_on, is_music_on, volume_level, resolution)

Konklusion

ConfigParser i Python giver en nyttig måde at håndtere indstillinger på både kommandolinje og GUI Python-apps. Disse konfigurationsfiler kan også bruges som lette tekstbaserede databaser, men er muligvis ikke egnede til avancerede datatyper, store datasæt og et stort antal forespørgsler.

Sådan installeres League Of Legends på Ubuntu 14.04
Hvis du er fan af League of Legends, er dette en mulighed for dig at prøvekøre League of Legends. Bemærk, at LOL understøttes på PlayOnLinux, hvis du ...
Installer det nyeste OpenRA-strategispil på Ubuntu Linux
OpenRA er en Libre / Free Real Time Strategy-spilmotor, der genskaber de tidlige Westwood-spil som det klassiske Command & Conquer: Red Alert. Distrib...
Installer nyeste Dolphin Emulator til Gamecube & Wii på Linux
Dolphin Emulator giver dig mulighed for at spille dine valgte Gamecube & Wii-spil på Linux Personal Computers (PC). Som en frit tilgængelig og open s...