Hvordan lese og skrive INI og Conf -filer ved hjelp av Python

Hvordan lese og skrive INI og Conf -filer ved hjelp av Python
Python-programmeringsspråk kommer med en nyttig innebygd modul kalt “ConfigParser” som kan brukes til å skrive konfigurasjonsparametere rent for apper for apper for apper. ConfigParser bruker en veldefinert og strukturert konfigurasjonsspråk som er fullt kompatibel med INI -filer som finnes i Microsoft Windows. Disse INI -filene kan også brukes med Python -apper som kjører i Linux, og de gir en vedvarende måte å lagre og hente verdier.

I Linux er det mer vanlig å se “.Conf ”-filer enn“.ini ”-filer. Conf -filer i Linux er akkurat som alle andre tekstfiler, og derfor kan de struktureres på noen måte. Det er avhengig av analyser hvordan den tolker en “.Conf ”-fil. Pythons konfigurasjonsmodul kan analysere “.Conf ”-filer også (eller annen tilfeldig utvidelse), forutsatt at disse filene er definert i INI -kompatibelt konfigurasjonsspråk. Denne artikkelen vil forklare lesing og skrive “.Conf ”-filer i Linux ved å bruke den nyeste stabile versjonen av Python 3. Merk at hvis du erstatter alle forekomster av “.Conf ”utvidelse i denne artikkelen med“.ini ”utvidelse, resultatet ville være det samme. Prosessen og koden som er forklart nedenfor, bør også være kompatibel med Microsoft Windows, med noen få mindre forskjeller. Selv om disse forskjellene ikke vil bli dekket i denne artikkelen.

ConfigParser -modul

Konfigurasjonsfilparser eller ConfigParser er en Python -modul som lar deg lese og skrive konfigurasjonsfiler som brukes i Python -apper. Som forklart ovenfor, støtter denne modulen INI -filsyntaks. En veldig forenklet “.Inn jeg" / ".Conf ”-fil ser slik ut.

[MISLIGHOLDE]
lyd = 1
Musikk = 1
Volum = 0.8
Oppløsning = 1920x1080
[Bruker]
# lyd kan ha 0 (falsk) og 1 (sant) som mulige verdier
lyd = 1
; Musikk kan ha 0 (falsk) og 1 (sant) som mulige verdier
Musikk = 0
Volum = 0.4
Oppløsning = 1280x720

Eksempelet ".Conf ”-filen ovenfor har to seksjoner,“ Standard ”og“ Bruker ”. Vanligvis er Python -programmer kodet på en slik måte at standardverdier aldri endres. Standarddelen brukes til å tilbakestille totalt eller individuelle verdier til standardverdier. Brukerseksjonen gjenspeiler endringer gjort av en sluttbruker som bruker Python -programmet. Merk at seksjonsnavnene kan være hva som helst, og det er ikke nødvendig å ha en standard seksjon i det hele tatt. Men hver gang "standard" -delen er til stede (navnet skal være i store bokstaver), vil det bli brukt til å trygt oppgi standardverdier hvis ConfigParser ikke klarer å analysere visse variabler. Logikken for å håndtere disse seksjonene, variablene under dem og tilbakeslagsverdier må defineres i selve Python -programmet. Symboler som "#" og ";" kan brukes til å betegne kommentarer i ".Conf ”-filer. Alle nøkkelverdipar i konfigurasjonsfilen er case-ufølsom, vanligvis skrevet i små bokstaver.

Datatyperhåndtering av ConfigParser

Før du går videre med noen eksempler på ConfigParser, er det viktig å forstå datatyperhåndtering av denne modulen. For ConfigParser er hvert stykke skriftlig eller analysert kode en streng. Det kan ikke skille mellom tall eller noe annet format. Programmerere må skrive logikk i programmet sitt for å konvertere en streng “1234” til nummer ved å bruke int (“1234”) mens du leser data fra en “.Conf ”-fil.

Selv om det er en ganske enkel oppgave å konvertere til tall ved bruk av Int og Float -metoden, kan det være vanskelig å konvertere til boolsk når Python behandler bool ("any_string") for å være sant. For å overvinne dette problemet, kan du bruke betingede utsagn som sjekker for en spesifikk streng. ConfigParser -modulen gir også en metode som heter "getboolean ()". Denne metoden kan korrekt skille 'ja'/'nei', 'på'/'off', 'True'/'falsk' og '1'/'0' boolske verdier selv om de er strenger. ConfigParser inkluderer også GetInt () og GetFloat () Metoder for enkelhets skyld.

Skrive og lagre en ny Conf -fil ved hjelp av ConfigParser

La oss anta ".Conf ”-fil nevnt ovenfor eksisterer ikke, og du vil opprette den automatisk ved den første lanseringen av programmet. Koden nedenfor vil opprette en ny “Innstillinger.Conf ”-fil i katalogen som Python -programmet er kjørt.

Importer ConfigParser
config = configParser.ConfigParser ()
config ['standard'] = "lyd": "1", "musikk": "1",
"Volum": "0.8 "," Resolution ":" 1920x1080 "
config ['bruker'] = "lyd": "1", "musikk": "1",
"Volum": "0.8 "," Resolution ":" 1920x1080 "
med åpne ('Innstillinger.Conf ',' W ') som ConfigFile:
konfigurasjon.Skriv (ConfigFile)

Den første uttalelsen i koden over importerer ConfigParser -modulen. Den andre uttalelsen oppretter et ordboklignende objekt kalt “Config”. Du kan nå bruke Standard Python Dictionary Syntax for å definere seksjoner og variabler inkludert under dem, noe som fremgår av de neste to uttalelsene. Til slutt oppretter "med åpen" uttalelse en ny "Innstillinger.Conf ”-filen og skriver konfigurasjonsdeler til filen.

Koden over fungerer, men det er et lite problem med den. Den oppretter en ny innstillingsfil hver gang programmet kjøres, noe. For å løse dette problemet, må du sjekke to forhold:

  • Eksisterer innstillingsfilen? Hvis ikke, oppretter du en ny innstillingsfil bare hvis filen ikke eksisterer.
  • Innstillingsfilen eksisterer, men inneholder noen data? Er det tomt? Skriv nye konfigurasjonsdata til innstillingsfilen bare hvis den er tom.

Den endrede koden nedenfor vil sjekke de to forholdene og vil bare opprette en ny innstillingsfil hvis disse to betingelsene er oppfylt.

Importer ConfigParser
Importer OS
config = configParser.ConfigParser ()
config ['standard'] = "lyd": "1", "musikk": "1",
"Volum": "0.8 "," Resolution ":" 1920x1080 "
config ['bruker'] = "lyd": "1", "musikk": "1",
"Volum": "0.8 "," Resolution ":" 1920x1080 "
innstillinger_file = OS.sti.Dirname (OS.sti.realpath (__ file__)))
+ OS.SEP + "Innstillinger.Conf "
Hvis ikke OS.sti.eksisterer (innstillinger_file)
eller OS.stat (innstillinger_file).st_size == 0:
med åpne ('Innstillinger.Conf ',' W ') som ConfigFile:
konfigurasjon.Skriv (ConfigFile)

Den andre uttalelsen i koden over importerer “OS” -modulen. Variabelen "Innstillinger_file" lagrer full vei til "Innstillingene.Conf ”-fil som skal opprettes i katalogen til Python -skriptet. Neste uttalelse sjekker to forhold nevnt ovenfor. Den første klausulen i uttalelsen er selvforklarende. Den andre leddet sjekker om filstørrelsen er “0 byte”. En null byte -fil vil bety en tom fil uten data som er lagret i den. Resten av koden er den samme som det første eksemplet som er nevnt ovenfor.

Så langt lagre kodeprøvene som er forklart ovenfor, lagre konfigurasjonsfilen i katalogen til selve Python -skriptet. Imidlertid er det en vanlig praksis og freedesktop -standard for å lagre konfigurasjonsfiler i ".konfigurasjonskatalog i hjemmemappen. Kodeprøven nedenfor vil opprette en ny “Innstillinger.Conf ”-fil i“ ~/.config/testapp ”-mappe.

Importer ConfigParser
Importer OS
app_name = "testapp"
config_folder = os.sti.Bli med (OS.sti.expandUser ("~"), '.konfigurasjon ', appnavn)
OS.makedirs (config_folder, exist_ok = true)
innstillinger_file = "Innstillinger.Conf "
full_config_file_path = OS.sti.Bli med (config_folder, innstillinger_file)
config = configParser.ConfigParser ()
config ['standard'] = "lyd": "1", "musikk": "1",
"Volum": "0.8 "," Resolution ":" 1920x1080 "
config ['bruker'] = "lyd": "1", "musikk": "1",
"Volum": "0.8 "," Resolution ":" 1920x1080 "
Hvis ikke OS.sti.eksisterer (full_config_file_path)
eller OS.stat (full_config_file_path).st_size == 0:
med Open (full_config_file_path, 'w') som configfile:
konfigurasjon.Skriv (ConfigFile)

Koden over er nesten den samme som det tidligere eksemplet, bortsett fra at den endrer plasseringen av “Innstillinger.Conf ”-fil til“ ~/.config/testapp/innstillinger.Conf ”. Variabelen “Config_folder” lagrer hele banen til applikasjonsmappen som skal opprettes i “.konfigurasjons -katalogen (“~/.config/testapp/”). “OS.Makedirs ”-uttalelse vil bare opprette en ny app -mappe hvis den ikke allerede eksisterer. Variabelen "Full_Config_File_Path" lagrer hele banen til innstillingsfilen ("~/.config/testapp/innstillinger.Conf ”). Resten av koden er selvforklarende.

Leser en Conf -fil ved hjelp av ConfigParser

Å analysere en konfigurasjonsfil er ganske grei. ConfigParser prøver å lese en verdi ved hjelp av get (), getfloat (), getboolean () metoder eller ordbokssyntaks. I tilfelle av en nøkkelfeil brukes verdier fra standardavsnittet eller tilbakeslagsverdiene. Det er en god praksis å definere standardavsnitt eller tilbakeslagsverdier for å forhindre nøkkelfeil. Du kan også bruke Try-Ascept-uttalelser for å undertrykke feil.

config = configParser.ConfigParser ()
konfigurasjon.Les (full_config_file_path)
is_sound_on = config ['bruker'].getboolean ('lyd')
volum_level = config ['bruker'].getfloat ('volum')
oppløsning = config ['bruker'] ['oppløsning']
# Fallback -verdien "False" vil bli ignorert da det allerede er en standardseksjon.
# I mangel av standardseksjon vil tilbakeslagsverdien bli brukt behørig.
is_music_on = config ['bruker'].getboolean ('musikk', falsk)
print (is_sound_on, is_music_on, volum_level, oppløsning)

I kodeprøven ovenfor, “Config.Les "-uttalelsen brukes til å lese data fra en konfigurasjonsfil. I de følgende utsagnene brukes forskjellige innebygde GET-metoder og ordboksnotasjoner til å lese dataene. I "IS_MUSIC_ON" -variabelen erklæringen er det andre argumentet Fallback Value (FALSE). Merk at tilbakeslagsverdier vil ha lavere forrang enn verdier definert i standarddelen. Enkelt sagt har tilbakeslagsverdier ingen effekt når et nøkkelverdipar allerede er til stede i standarddelen.

Full kode

Nedenfor er hele koden som kombinerer både førstekjøring av konfigurasjonsfilen og lesing av konfigurasjonsfilen.

#! /usr/bin/python3
Importer ConfigParser
Importer OS
app_name = "testapp"
config_folder = os.sti.Bli med (OS.sti.expandUser ("~"), '.konfigurasjon ', appnavn)
OS.makedirs (config_folder, exist_ok = true)
innstillinger_file = "Innstillinger.Conf "
full_config_file_path = OS.sti.Bli med (config_folder, innstillinger_file)
config = configParser.ConfigParser ()
config ['standard'] = "lyd": "1", "musikk": "1",
"Volum": "0.8 "," Resolution ":" 1920x1080 "
config ['bruker'] = "lyd": "1", "musikk": "1",
"Volum": "0.8 "," Resolution ":" 1920x1080 "
Hvis ikke OS.sti.eksisterer (full_config_file_path)
eller OS.stat (full_config_file_path).st_size == 0:
med Open (full_config_file_path, 'w') som configfile:
konfigurasjon.Skriv (ConfigFile)
konfigurasjon.Les (full_config_file_path)
is_sound_on = config ['bruker'].getboolean ('lyd')
volum_level = config ['bruker'].getfloat ('volum')
oppløsning = config ['bruker'] ['oppløsning']
# Fallback -verdien "False" vil bli ignorert da det allerede er en standardseksjon.
# I mangel av standardseksjon vil tilbakeslagsverdien bli brukt behørig.
is_music_on = config ['bruker'].getboolean ('musikk', falsk)
print (is_sound_on, is_music_on, volum_level, oppløsning)

Konklusjon

ConfigParser i Python gir en nyttig måte å håndtere innstillinger på både kommandolinje og GUI Python -apper. Disse konfigurasjonsfilene kan også brukes som lette tekstbaserte databaser, men kan ikke være egnet for avanserte datatyper, store datasett og stort antall spørsmål.