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 parser hvordan det tolker en “.conf ”-fil. Pythons ConfigParser-modul 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 skriving “.conf ”-filer i Linux ved hjelp av den siste stabile versjonen av Python 3. Merk at hvis du erstatter alle forekomster av “.conf ”utvidelse i denne artikkelen med“.ini ”utvidelse, ville resultatet være det samme. Prosessen og koden som er forklart nedenfor, bør også være forenlig med Microsoft Windows, med noen mindre forskjeller. Selv om disse forskjellene ikke vil bli dekket i denne artikkelen.
ConfigParser-modul
Konfigurasjonsfilsparser 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 ”-filen ser slik ut.
[MISLIGHOLDE]lyd = 1
musikk = 1
volum = 0.8
oppløsning = 1920x1080
[Bruker]
# lyd kan ha 0 (usann) og 1 (sant) som mulige verdier
lyd = 1
; musikk kan ha 0 (falske) og 1 (sanne) som mulige verdier
musikk = 0
Volum = 0.4
oppløsning = 1280x720
Eksempelet ".conf ”-filen ovenfor har to seksjoner,“ DEFAULT ”og“ User ”. Vanligvis er Python-programmer kodet på en slik måte at DEFAULT-seksjonsverdiene aldri endres. DEFAULT-delen brukes til å tilbakestille generelle eller individuelle verdier til standardverdier. Brukeravsnittet 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. Imidlertid når "DEFAULT" -delen er tilstede (navnet skal være med store bokstaver), vil det brukes til å trygt gi standardverdier hvis ConfigParser ikke analyserer visse variabler. Logikken for å håndtere disse seksjonene, variablene under dem og reserveverdiene må defineres i selve Python-programmet. Symboler som “#” og “;” kan brukes til å betegne kommentarer i “.conf ”filer. Alle nøkkelverdipar i konfigurasjonsfilen er ikke store og små bokstaver, vanligvis skrevet med små bokstaver.
Datatyper som håndteres av ConfigParser
Før du går videre med noen eksempler på ConfigParser, er det viktig å forstå datatypebehandlingen av denne modulen. For ConfigParser er hvert stykke skrevet eller analysert kode en streng. Det kan ikke skille mellom tall eller noe annet format. Programmører må skrive logikk i programmet sitt for å konvertere en streng "1234" til nummer ved å bruke int ("1234") mens de leser data fra en ".conf ”-fil.
Mens konvertering til tall ved hjelp av int og float-metoden er en ganske enkel oppgave, kan konvertering til boolsk være vanskelig da Python behandler bool ("any_string") for å være sant. For å løse dette problemet kan du bruke betingede utsagn som sjekker for en bestemt streng. ConfigParser-modulen gir også en metode som heter “getboolean ()”. Denne metoden kan skille mellom 'ja' / 'nei', 'på' / 'av', 'sann' / 'usann' og '1' / '0' boolske verdier riktig, selv om de er strenger. ConfigParser inkluderer også getint () og getfloat () metoder for din bekvemmelighet.
Skrive og lagre en ny Conf-fil ved hjelp av ConfigParser
La oss anta at “.conf ”-filen som er nevnt ovenfor, eksisterer ikke, og du vil opprette den automatisk ved første lansering av programmet. Koden nedenfor vil opprette nye “innstillinger.conf ”-fil i katalogen som Python-programmet har blitt kjørt fra.
importer configparserconfig = configparser.ConfigParser ()
config ['DEFAULT'] = "sound": "1", "music": "1",
"volume": "0.8 "," resolution ":" 1920x1080 "
config ['User'] = "sound": "1", "music": "1",
"volume": "0.8 "," resolution ":" 1920x1080 "
med åpen ('innstillinger.conf ',' w ') som konfigurasjonsfil:
config.skriv (konfigurasjonsfil)
Den første setningen i koden ovenfor importerer ConfigParser-modulen. Den andre setningen oppretter et ordbokslignende objekt kalt “config”. Du kan nå bruke standard Python-ordbokssyntaks for å definere seksjoner og variabler som er inkludert under dem, som det fremgår av de neste to setningene. Til slutt oppretter "med åpen" uttalelse nye "innstillinger.conf ”-fil og skriver konfigurasjonsdeler til filen.
Koden ovenfor fungerer, men det er et lite problem med den. Den oppretter en ny innstillingsfil hver gang programmet kjøres, noe som resulterer i overskriving av brukerendringer i innstillingsfilen. For å løse dette problemet, må du sjekke to forhold:
- Finnes innstillingsfilen? Hvis ikke, må du bare opprette en ny innstillingsfil hvis filen ikke eksisterer.
- Innstillingsfilen finnes, men inneholder den data? Er den tom? Skriv bare nye konfigurasjonsdata til innstillingsfilen hvis den er tom.
Den modifiserte koden nedenfor vil kontrollere de to betingelsene og vil bare opprette en ny innstillingsfil hvis disse to betingelsene er oppfylt.
importer configparserimporter os
config = configparser.ConfigParser ()
config ['DEFAULT'] = "sound": "1", "music": "1",
"volume": "0.8 "," resolution ":" 1920x1080 "
config ['User'] = "sound": "1", "music": "1",
"volume": "0.8 "," resolution ":" 1920x1080 "
settings_file = os.sti.dirname (os.sti.realpath (__ fil__))
+ os.sep + "innstillinger.conf "
hvis ikke os.sti.eksisterer (innstillingsfil)
eller os.stat (innstillingsfil).st_size == 0:
med åpen ('innstillinger.conf ',' w ') som konfigurasjonsfil:
config.skriv (konfigurasjonsfil)
Den andre setningen i koden ovenfor importerer “os” -modulen. Variabelen “settings_file” lagrer full sti til “settings.conf ”-fil som skal opprettes i katalogen til Python-skriptet. Neste uttalelse sjekker to forhold nevnt ovenfor. Den første paragrafen i uttalelsen er selvforklarende. Den andre paragrafen sjekker om filstørrelsen er "0 byte". En fil med null byte vil bety en tom fil uten data lagret i den. Resten av koden er den samme som det første eksemplet ovenfor.
Så langt lagrer kodeeksemplene som er beskrevet ovenfor konfigurasjonsfilen i katalogen til selve Python-skriptet. Imidlertid er det en vanlig praksis og freedesktop-standard å lagre konfigurasjonsfiler i ".config ”-katalog i hjemmemappen. Kodeprøven nedenfor vil opprette nye “innstillinger.conf ”-fil i“ ~ /.config / testapp ”-mappe.
importer configparserimporter os
app_name = "testapp"
config_folder = os.sti.bli med (os.sti.utvidelsesbruker ("~"), '.config ', app_name)
os.makedirs (config_folder, exist_ok = True)
settings_file = "innstillinger.conf "
full_config_file_path = os.sti.bli med (config_folder, settings_file)
config = configparser.ConfigParser ()
config ['DEFAULT'] = "sound": "1", "music": "1",
"volume": "0.8 "," resolution ":" 1920x1080 "
config ['User'] = "sound": "1", "music": "1",
"volume": "0.8 "," resolution ":" 1920x1080 "
hvis ikke os.sti.eksisterer (full_konfig_fil_sti)
eller os.stat (full_konfig_fil_sti).st_size == 0:
med åpen (full_konfig_fil_sti, 'w') som konfigurasjonsfil:
config.skriv (konfigurasjonsfil)
Koden ovenfor er nesten den samme som det tidligere eksemplet, bortsett fra at det endrer plasseringen av “innstillinger.conf ”fil til“ ~ /.config / testapp / innstillinger.conf ”. Variabelen “config_folder” lagrer hele banen til applikasjonsmappen som skal opprettes i “.config ”-katalog (“ ~ /.config / testapp / ”). “Os.makedirs ”-erklæringen vil bare opprette en ny appmappe hvis den ikke allerede eksisterer. “Full_config_file_path” -variabelen lagrer hele banen til innstillingsfilen (“~ /.config / testapp / innstillinger.conf ”). Resten av koden er selvforklarende.
Lese 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 en nøkkelfeil brukes verdier fra DEFAULT-delen eller reserveverdier. Det er god praksis å definere DEFAULT seksjons- eller reserveverdier for å forhindre nøkkelfeil. Du kan også bruke unntak av utsagn for å undertrykke feil.
config = configparser.ConfigParser ()config.les (full_konfig_fil_sti)
is_sound_on = config ['User'].getboolean ('lyd')
volume_level = config ['User'].getfloat ('volum')
resolution = config ['User'] ['resolution']
# Tilbakestillingsverdi "False" vil bli ignorert siden det allerede er en STANDARD-seksjon.
# I mangel av DEFAULT-seksjonen, vil tilbakebetalingsverdien brukes behørig.
is_music_on = config ['Bruker'].getboolean ('musikk', falsk)
print (is_sound_on, is_music_on, volume_level, resolution)
I kodeeksemplet ovenfor, “config.read-setning brukes til å lese data fra en konfigurasjonsfil. I de følgende utsagnene brukes forskjellige innebygde get-metoder og ordboknotasjoner for å lese dataene. I "is_music_on" -variabeldeklarasjonen er det andre argumentet tilbakevendingsverdi (False). Vær oppmerksom på at reserveverdier har lavere forrang enn verdier som er definert i delen STANDARD. Enkelt sagt vil tilbakeslagsverdier ikke ha noen effekt når et nøkkelverdipar allerede er tilstede i DEFAULT-delen.
Full kode
Nedenfor er hele koden som kombinerer både første opprettelse av konfigurasjonsfilen og lesing av konfigurasjonsfilen.
#! / usr / bin / python3importer configparser
importer os
app_name = "testapp"
config_folder = os.sti.bli med (os.sti.utvidelsesbruker ("~"), '.config ', app_name)
os.makedirs (config_folder, exist_ok = True)
settings_file = "innstillinger.conf "
full_config_file_path = os.sti.bli med (config_folder, settings_file)
config = configparser.ConfigParser ()
config ['DEFAULT'] = "sound": "1", "music": "1",
"volume": "0.8 "," resolution ":" 1920x1080 "
config ['User'] = "sound": "1", "music": "1",
"volume": "0.8 "," resolution ":" 1920x1080 "
hvis ikke os.sti.eksisterer (full_konfig_fil_sti)
eller os.stat (full_konfig_fil_sti).st_size == 0:
med åpen (full_konfig_fil_sti, 'w') som konfigurasjonsfil:
config.skriv (konfigurasjonsfil)
config.les (full_konfig_fil_sti)
is_sound_on = config ['User'].getboolean ('lyd')
volume_level = config ['User'].getfloat ('volum')
resolution = config ['User'] ['resolution']
# Tilbakestillingsverdi "False" vil bli ignorert siden det allerede er en STANDARD-seksjon.
# I mangel av DEFAULT-seksjonen, vil tilbakebetalingsverdien brukes behørig.
is_music_on = config ['Bruker'].getboolean ('musikk', falsk)
skriv ut (is_sound_on, is_music_on, volume_level, resolution)
Konklusjon
ConfigParser i Python gir en nyttig måte å håndtere innstillinger for både kommandolinje og GUI Python-apper. Disse konfigurasjonsfilene kan også brukes som lette tekstbaserte databaser, men er kanskje ikke egnet for avanserte datatyper, store datasett og et stort antall spørsmål.