I Linux är det vanligare att se “.conf ”filer än“.ini ”-filer. Conf-filer i Linux är precis som alla andra textfiler och därför kan de struktureras på något sätt. Det är beroende av tolkning hur det tolkar en ”.conf ”-fil. Pythons ConfigParser-modul kan analysera “.conf ”-filer (eller något annat slumpmässigt tillägg), förutsatt att dessa filer är definierade i INI-kompatibelt konfigurationsspråk. Denna artikel kommer att förklara läsning och skrivning “.conf ”-filer i Linux med den senaste stabila versionen av Python 3. Observera att om du ersätter alla förekomster av “.conf ”förlängning i den här artikeln med“.ini ”förlängning skulle resultatet vara detsamma. Processen och koden som förklaras nedan bör också vara mest kompatibel med Microsoft Windows, med några mindre skillnader. Även om dessa skillnader inte kommer att behandlas i den här artikeln.
ConfigParser-modul
Konfigurationsfil parser eller ConfigParser är en Python-modul som låter dig läsa och skriva konfigurationsfiler som används i Python-appar. Som förklarats ovan stöder den här modulen INI-filsyntax. En mycket förenklad “.ini ”/“.conf ”-filen ser ut så här.
[STANDARD]ljud = 1
musik = 1
volym = 0.8
upplösning = 1920x1080
[Användare]
# ljud kan ha 0 (falskt) och 1 (sant) som möjliga värden
ljud = 1
; musik kan ha 0 (falskt) och 1 (sant) som möjliga värden
musik = 0
Volym = 0.4
upplösning = 1280x720
Exemplet ".conf ”-filen ovan har två sektioner,“ DEFAULT ”och“ User ”. Vanligtvis kodas Python-program på ett sådant sätt att DEFAULT-sektionsvärdena aldrig ändras. Avsnittet STANDARD används för att återställa övergripande eller enskilda värden till standardvärden. Användarsektionen återspeglar ändringar som gjorts av en slutanvändare som använder Python-programmet. Observera att sektionsnamnen kan vara vad som helst och det är inte nödvändigt att ha en STANDARD-sektion alls. Närhelst avsnittet "STANDARD" är närvarande (namnet ska vara i versaler) kommer det att användas för att säkert tillhandahålla standardvärden om ConfigParser misslyckas med att analysera vissa variabler. Logiken för att hantera dessa avsnitt, variabler under dem och reservvärden måste definieras i själva Python-programmet. Symboler som "#" och ";" kan användas för att beteckna kommentarer i “.conf ”-filer. Alla nyckel-värdepar i konfigurationsfilen är skiftlägeskänsliga, vanligtvis skrivna med gemener.
Datatyper som hanteras av ConfigParser
Innan du går vidare med några exempel på ConfigParser är det viktigt att förstå datatypshantering av denna modul. För ConfigParser är varje skriven eller analyserad kod en sträng. Det kan inte skilja mellan siffror eller något annat format. Programmerare måste skriva logik i sitt program för att konvertera en sträng “1234” till nummer genom att använda int (“1234”) medan de läser data från en “.conf ”-fil.
Det är ganska enkelt att konvertera till siffror med int och float-metoden, men att konvertera till boolean kan vara svårt eftersom Python behandlar bool ("any_string") för att vara sant. För att lösa problemet kan du använda villkorliga uttalanden för att kontrollera en specifik sträng. Modulen ConfigParser tillhandahåller också en metod som kallas "getboolean ()". Den här metoden kan korrekt skilja på 'ja' / 'nej', 'på' / 'av', 'sant' / 'falskt' och '1' / '0' booleskt värde även om de är strängar. ConfigParser innehåller också getint () och getfloat () metoder för din bekvämlighet.
Skriva och spara en ny Conf-fil med ConfigParser
Låt oss anta att “.conf ”-filen som nämns ovan finns inte och du vill skapa den automatiskt vid den första starten av programmet. Koden nedan skapar en ny “inställning.conf ”-fil i katalogen från vilken Python-programmet har körts.
importera 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 öppna ('inställningar.conf ',' w ') som konfigurationsfil:
konfigurera.skriv (configfile)
Det första uttalandet i koden ovan importerar ConfigParser-modulen. Det andra uttalandet skapar ett ordboksliknande objekt som heter "config". Du kan nu använda Python-ordlistasyntax för att definiera avsnitt och variabler som ingår i dem, vilket framgår av de två följande påståendena. Slutligen skapar "med öppen" uttalande en ny "inställning.conf ”-fil och skriver konfigurationsavsnitt till filen.
Koden ovan fungerar, men det är ett litet problem med det. Det skapar en ny inställningsfil varje gång programmet körs, vilket resulterar i överskrivning av eventuella ändringar som görs av inställningsfilen. För att åtgärda problemet måste du kontrollera två villkor:
- Finns inställningsfilen? Om inte, skapa en ny inställningsfil endast om filen inte finns.
- Inställningsfilen finns, men innehåller den data? Är den tom? Skriv bara nya konfigurationsdata till inställningsfilen om den är tom.
Den modifierade koden nedan kontrollerar de två villkoren och skapar bara en ny inställningsfil om dessa två villkor är uppfyllda.
importera configparserimportera 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 "
inställningsfil = os.väg.dirname (os.väg.realpath (__ fil__))
+ os.inställningar för sep + ".conf "
om inte os.väg.existerar (inställningsfil)
eller os.stat (inställningsfil).st_size == 0:
med öppen ('inställningar.conf ',' w ') som konfigurationsfil:
konfigurera.skriv (configfile)
Det andra uttalandet i koden ovan importerar “os” -modulen. Variabeln "settings_file" lagrar hela sökvägen till "inställningarna.conf ”-fil som ska skapas i katalogen för Python-skriptet. Nästa uttalande kontrollerar två ovannämnda villkor. Den första klausulen i uttalandet är självförklarande. Den andra klausulen kontrollerar om filstorleken är “0 byte”. En fil med nollbyte skulle innebära en tom fil utan data lagrad i den. Resten av koden är densamma som det första exemplet som anges ovan.
Hittills sparar kodproverna som beskrivs ovan konfigurationsfilen i katalogen för själva Python-skriptet. Det är dock en vanlig praxis och fri skrivbordsstandard att spara konfigurationsfiler i.config ”-katalog i hemmappen. Kodprovet nedan skapar en ny “inställning.conf ”-fil i“ ~ /.config / testapp ”-mapp.
importera configparserimportera os
app_name = "testapp"
config_folder = os.väg.gå med (os.väg.expanduser ("~"), '.config ', app_name)
os.makedirs (config_folder, exist_ok = True)
settings_file = "inställningar.conf "
full_config_file_path = os.väg.gå 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 "
om inte os.väg.finns (full_config_file_path)
eller os.stat (full_config_file_path).st_size == 0:
med öppen (full_config_file_path, 'w') som konfigurationsfil:
konfigurera.skriv (configfile)
Koden ovan är nästan densamma som i det tidigare exemplet, förutom att den ändrar platsen för “inställningar.conf ”-fil till“ ~ /.config / testapp / inställningar.conf ”. Variabeln "config_folder" lagrar hela sökvägen till applikationsmappen som ska skapas i ".config ”-katalog (“ ~ /.config / testapp / ”). Den "os.makedirs ”uttalande skapar bara en ny appmapp om den inte redan finns. Variabeln "full_config_file_path" lagrar hela sökvägen för inställningsfilen ("~ /.config / testapp / inställningar.conf ”). Resten av koden är självförklarande.
Läsa en Conf-fil med ConfigParser
Att analysera en konfigurationsfil är ganska enkelt. ConfigParser försöker läsa ett värde med get (), getfloat (), getboolean () -metoder eller ordbokssyntax. Vid ett nyckelfel används värden från avsnittet STANDARD eller reservvärden. Det är en god praxis att definiera DEFAULT-avsnitt eller reservvärden för att förhindra nyckelfel. Du kan också använda försök utom för att undertrycka fel.
config = configparser.ConfigParser ()konfigurera.läs (full_konfig_fil_sökväg)
is_sound_on = config ['User'].getboolean ('ljud')
volume_level = config ['User'].getfloat ('volym')
resolution = config ['User'] ['resolution']
# Fallvärde "Falsk" ignoreras eftersom det redan finns en STANDARD-sektion.
# I avsaknad av DEFAULT-sektionen kommer reservvärdet att användas på rätt sätt.
is_music_on = config ['User'].getboolean ('musik', falskt)
skriv ut (is_sound_on, is_music_on, volume_level, resolution)
I kodprovet ovan, “config.Läs ”uttalande används för att läsa data från en konfigurationsfil. I följande uttalanden används olika inbyggda get-metoder och ordboksnoteringar för att läsa informationen. I variabeldeklarationen “is_music_on” är det andra argumentet reservvärde (False). Observera att reservvärden har lägre företräde än värden som definieras i avsnittet STANDARD. Enkelt uttryckt har reservvärden ingen effekt när ett nyckel-värdepar redan finns i avsnittet STANDARD.
Fullständig kod
Nedan visas hela koden som kombinerar både skapandet av konfigurationsfilen och läsning av konfigurationsfilen.
#! / usr / bin / python3importera configparser
importera os
app_name = "testapp"
config_folder = os.väg.gå med (os.väg.expanduser ("~"), '.config ', app_name)
os.makedirs (config_folder, exist_ok = True)
settings_file = "inställningar.conf "
full_config_file_path = os.väg.gå 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 "
om inte os.väg.finns (full_config_file_path)
eller os.stat (full_config_file_path).st_size == 0:
med öppen (full_config_file_path, 'w') som konfigurationsfil:
konfigurera.skriv (configfile)
konfigurera.läs (full_konfig_fil_sökväg)
is_sound_on = config ['User'].getboolean ('ljud')
volume_level = config ['User'].getfloat ('volym')
resolution = config ['User'] ['resolution']
# Fallvärde "Falskt" ignoreras eftersom det redan finns en STANDARD-sektion.
# I avsaknad av DEFAULT-sektionen kommer reservvärdet att användas på rätt sätt.
is_music_on = config ['User'].getboolean ('musik', falskt)
skriv ut (is_sound_on, is_music_on, volume_level, resolution)
Slutsats
ConfigParser i Python är ett användbart sätt att hantera inställningar för både kommandorads- och GUI Python-appar. Dessa konfigurationsfiler kan också användas som lätta textbaserade databaser men kanske inte lämpar sig för avancerade datatyper, stora datamängder och stort antal frågor.