Python

INI- en Conf-bestanden lezen en schrijven met Python

INI- en Conf-bestanden lezen en schrijven met Python
De programmeertaal Python wordt geleverd met een handige ingebouwde module genaamd "ConfigParser", die kan worden gebruikt om configuratieparameters voor apps netjes te schrijven. ConfigParser gebruikt een goed gedefinieerde en gestructureerde configuratietaal die volledig compatibel is met INI-bestanden in Microsoft Windows. Deze INI-bestanden kunnen ook worden gebruikt met Python-apps die in Linux worden uitgevoerd en ze bieden een permanente manier om waarden op te slaan en op te halen.

In Linux is het gebruikelijker om te zien ".conf" bestanden dan ".ini" bestanden. Conf-bestanden in Linux zijn net als alle andere tekstbestanden en daarom kunnen ze op elke manier worden gestructureerd. Het is afhankelijk van de parser hoe het een ".conf" bestand. Python's ConfigParser-module kan "parseren".conf"-bestanden (of een andere willekeurige extensie), op voorwaarde dat deze bestanden zijn gedefinieerd in INI-compatibele configuratietaal. In dit artikel wordt uitleg gegeven over lezen en schrijven “.conf"-bestanden in Linux met behulp van de nieuwste stabiele versie van Python 3. Merk op dat als u alle exemplaren van “.conf” extensie in dit artikel met “.ini” extensie, zou het resultaat hetzelfde zijn. Het proces en de code die hieronder worden uitgelegd, zouden ook grotendeels compatibel moeten zijn met Microsoft Windows, met een paar kleine verschillen. Hoewel deze verschillen niet in dit artikel worden behandeld.

ConfigParser-module

Configuratiebestand-parser of ConfigParser is een Python-module waarmee u configuratiebestanden kunt lezen en schrijven die in Python-apps worden gebruikt. Zoals hierboven uitgelegd, ondersteunt deze module de syntaxis van INI-bestanden. Een heel simplistische “.ini" / ".conf” bestand ziet er als volgt uit.

[STANDAARD]
geluid = 1
muziek = 1
volume = 0.8
resolutie = 1920x1080
[Gebruiker]
# geluid kan 0 (false) en 1 (true) als mogelijke waarden hebben
geluid = 1
; muziek kan 0 (false) en 1 (true) als mogelijke waarden hebben
muziek = 0
Volume = 0.4
resolutie = 1280x720

Het voorbeeld ".conf" bestand hierboven heeft twee secties, "DEFAULT" en "Gebruiker". Gewoonlijk zijn Python-programma's zo gecodeerd dat DEFAULT-sectiewaarden nooit worden gewijzigd. De DEFAULT-sectie wordt gebruikt om algemene of individuele waarden terug te zetten naar de standaardwaarden. Het gebruikersgedeelte geeft de wijzigingen weer die zijn aangebracht door een eindgebruiker die het Python-programma gebruikt. Merk op dat de sectienamen van alles kunnen zijn en dat het helemaal niet nodig is om een ​​STANDAARD sectie te hebben. Wanneer echter de sectie "DEFAULT" aanwezig is (naam moet in hoofdletters zijn), wordt deze gebruikt om veilig standaardwaarden op te geven als ConfigParser bepaalde variabelen niet kan parseren. De logica om deze secties, variabelen eronder en fallback-waarden te verwerken, moet in het Python-programma zelf worden gedefinieerd. Symbolen zoals "#" en ";" kan worden gebruikt om opmerkingen aan te duiden in ".conf" bestanden. Alle sleutel-waardeparen in het configuratiebestand zijn niet hoofdlettergevoelig, meestal in kleine letters geschreven.

Gegevenstypen verwerken door ConfigParser

Voordat we verder gaan met enkele voorbeelden van ConfigParser, is het belangrijk om de gegevenstypen te begrijpen die door deze module worden verwerkt. Voor ConfigParser is elk stukje geschreven of geparseerde code een string. Het kan geen onderscheid maken tussen getallen of een ander formaat. Programmeurs moeten logica in hun programma schrijven om een ​​tekenreeks "1234" naar een getal te converteren door int ("1234") te gebruiken tijdens het lezen van gegevens van een ".conf" bestand.

Hoewel het converteren naar getallen met behulp van de int- en float-methode een vrij gemakkelijke taak is, kan het converteren naar boolean lastig zijn omdat Python bool ("any_string") als True beschouwt. Om dit probleem op te lossen, kunt u voorwaardelijke instructies gebruiken om te controleren op een specifieke tekenreeks. De ConfigParser-module biedt ook een methode genaamd "getboolean()". Deze methode kan 'yes'/'no', 'on'/'off', 'true'/'false' en '1'/'0' booleaanse waarden correct onderscheiden, zelfs als het strings zijn. ConfigParser bevat voor uw gemak ook getint() en getfloat() methoden.

Een nieuw configuratiebestand schrijven en opslaan met ConfigParser

Laten we aannemen dat de “.conf”-bestand dat hierboven wordt vermeld niet bestaat en u het automatisch wilt maken bij de eerste start van het programma. De onderstaande code maakt een nieuwe "instellingen" aan.conf” bestand in de map van waaruit het Python-programma is uitgevoerd.

configparser importeren
config = configparser.ConfigParser()
config['DEFAULT'] = "geluid" : "1", "muziek" : "1",
"volume" : "0.8", "resolutie" : "1920x1080"
config['Gebruiker'] = "geluid" : "1", "muziek" : "1",
"volume" : "0.8", "resolutie" : "1920x1080"
met open('instellingen.conf', 'w') als configuratiebestand:
configuratie.schrijven (configuratiebestand)

De eerste instructie in de bovenstaande code importeert de ConfigParser-module. De tweede instructie maakt een woordenboekachtig object met de naam "config". U kunt nu de standaard syntaxis van het Python-woordenboek gebruiken om secties en variabelen die eronder zijn opgenomen te definiëren, zoals blijkt uit de volgende twee instructies. Ten slotte maakt de instructie "met open" een nieuwe "instellingen" aan.conf" bestand en schrijft configuratiesecties naar het bestand.

De bovenstaande code werkt, maar er is een klein probleem mee. Het maakt elke keer dat het programma wordt uitgevoerd een nieuw instellingenbestand aan, wat resulteert in het overschrijven van door de gebruiker aangebrachte wijzigingen in het instellingenbestand. Om dit probleem op te lossen, moet u twee voorwaarden controleren:

De gewijzigde code hieronder controleert de twee voorwaarden en maakt alleen een nieuw instellingenbestand aan als aan deze twee voorwaarden wordt voldaan.

import configparser
importeer os
 
config = configparser.ConfigParser()
config['DEFAULT'] = "geluid" : "1", "muziek" : "1",
"volume" : "0.8", "resolutie" : "1920x1080"
config['Gebruiker'] = "geluid" : "1", "muziek" : "1",
"volume" : "0.8", "resolutie" : "1920x1080"
settings_file = os.pad.dirname(os.pad.echt pad(__bestand__))
+ os.sep + "instellingen.conf"
zo niet os.pad.bestaat (settings_file)
of os.stat (instellingen_bestand).st_grootte == 0:
met open('instellingen.conf', 'w') als configuratiebestand:
configuratie.schrijven (configuratiebestand)

De tweede instructie in de bovenstaande code importeert de "os" -module. De variabele "settings_file" slaat het volledige pad op naar de "settings.conf”-bestand dat moet worden gemaakt in de map van het Python-script. De volgende verklaring controleert twee hierboven genoemde voorwaarden. De eerste clausule in de verklaring spreekt voor zich. De tweede clausule controleert of de bestandsgrootte "0 bytes" is. Een bestand van nul byte zou een leeg bestand betekenen zonder dat er gegevens in zijn opgeslagen. De rest van de code is hetzelfde als het eerste voorbeeld hierboven vermeld.

Tot nu toe slaan de codevoorbeelden die hierboven zijn uitgelegd het configuratiebestand op in de map van het Python-script zelf. Het is echter een gangbare praktijk en freedesktop-standaard om configuratiebestanden op te slaan in de ".config” map in de thuismap. Het onderstaande codevoorbeeld zal een nieuwe "instellingen" maken.conf" bestand in "~/.config/testapp” map.

import configparser
importeer os
 
app_name = "testapp"
config_folder = os.pad.join(os.pad.expanduser("~"), '.config', app_naam)
os.makedirs(config_folder, exist_ok=True)
settings_file = "instellingen.conf"
full_config_file_path = os.pad.join(config_folder, settings_file)
 
config = configparser.ConfigParser()
config['DEFAULT'] = "geluid" : "1", "muziek" : "1",
"volume" : "0.8", "resolutie" : "1920x1080"
config['Gebruiker'] = "geluid" : "1", "muziek" : "1",
"volume" : "0.8", "resolutie" : "1920x1080"
 
zo niet os.pad.bestaat (full_config_file_path)
of os.stat(full_config_file_path).st_grootte == 0:
met open(full_config_file_path, 'w') als configuratiebestand:
configuratie.schrijven (configuratiebestand)

De bovenstaande code is bijna hetzelfde als het eerdere voorbeeld, behalve dat het de locatie van "instellingen" verandert.conf" bestand naar "~/.config/testapp/instellingen.conf”. De variabele "config_folder" slaat het volledige pad op naar de toepassingsmap die moet worden gemaakt in ".config” map (“~/.config/testapp/"). de "os".makedirs” statement zal alleen een nieuwe app-map maken als deze nog niet bestaat. De variabele "full_config_file_path" slaat het volledige pad op van het instellingenbestand ("~/.config/testapp/instellingen.conf"). Rest van de code spreekt voor zich.

Een Conf-bestand lezen met ConfigParser

Het ontleden van een configuratiebestand is vrij eenvoudig. De ConfigParser probeert een waarde te lezen met behulp van get(), getfloat(), getboolean() methoden of woordenboeksyntaxis. In het geval van een sleutelfout worden waarden uit de DEFAULT-sectie of terugvalwaarden gebruikt. Het is een goede gewoonte om DEFAULT-sectie of fallback-waarden te definiëren om sleutelfouten te voorkomen prevent. U kunt ook try-except-statements gebruiken om fouten te onderdrukken.

config = configparser.ConfigParser()
configuratie.lezen (volledig_config_bestandspad)
 
is_sound_on = config['Gebruiker'].getboolean('geluid')
volume_level = config['Gebruiker'].getfloat('volume')
resolutie = config ['Gebruiker']['resolutie']
 
# Fallback-waarde "False" wordt genegeerd omdat er al een DEFAULT-sectie is.
# Als er geen DEFAULT-sectie is, wordt de terugvalwaarde correct gebruikt.
is_music_on = config['Gebruiker'].getboolean('muziek', False)
 
print (is_sound_on, is_music_on, volume_level, resolutie)

In het codevoorbeeld hierboven, “config.read” statement wordt gebruikt om gegevens uit een configuratiebestand te lezen. In de volgende instructies worden verschillende ingebouwde get-methoden en woordenboeknotaties gebruikt om de gegevens te lezen:. In de variabeledeclaratie "is_music_on" is het tweede argument de terugvalwaarde (False). Houd er rekening mee dat terugvalwaarden een lagere prioriteit hebben dan waarden die zijn gedefinieerd in de sectie DEFAULT. In eenvoudige bewoordingen hebben terugvalwaarden geen effect wanneer er al een sleutel-waardepaar aanwezig is in de DEFAULT-sectie.

Volledige code

Hieronder staat de volledige code die zowel het maken van het configuratiebestand voor de eerste keer als het lezen van het configuratiebestand combineert combining.

#! /usr/bin/python3
configparser importeren
importeer os
 
app_name = "testapp"
config_folder = os.pad.join(os.pad.expanduser("~"), '.config', app_naam)
os.makedirs(config_folder, exist_ok=True)
settings_file = "instellingen.conf"
full_config_file_path = os.pad.join(config_folder, settings_file)
 
config = configparser.ConfigParser()
 
config['DEFAULT'] = "geluid" : "1", "muziek" : "1",
"volume" : "0.8", "resolutie" : "1920x1080"
config['Gebruiker'] = "geluid" : "1", "muziek" : "1",
"volume" : "0.8", "resolutie" : "1920x1080"
 
zo niet os.pad.bestaat (full_config_file_path)
of os.stat(full_config_file_path).st_grootte == 0:
met open(full_config_file_path, 'w') als configuratiebestand:
configuratie.schrijven (configuratiebestand)
 
configuratie.lezen(volledig_config_bestandspad)
is_sound_on = config['Gebruiker'].getboolean('geluid')
volume_level = config['Gebruiker'].getfloat('volume')
resolutie = config['Gebruiker']['resolutie']
 
# Fallback-waarde "False" wordt genegeerd omdat er al een DEFAULT-sectie is.
# Als er geen DEFAULT-sectie is, wordt de terugvalwaarde correct gebruikt.
is_music_on = config['Gebruiker'].getboolean('muziek', False)
 
print (is_sound_on, is_music_on, volume_level, resolutie)

Conclusie

ConfigParser in Python biedt een handige manier om instellingen van zowel de opdrachtregel als de GUI Python-apps af te handelen. Deze configuratiebestanden kunnen ook worden gebruikt als lichtgewicht tekstgebaseerde databases, maar zijn mogelijk niet geschikt voor geavanceerde datatypes, grote datasets en een groot aantal query's.

Linkermuisknop werkt niet op Windows 10
Als u een speciale muis gebruikt met uw laptop of desktopcomputer, maar de linkermuisknop werkt niet not op Windows 10/8/7 om wat voor reden dan ook, ...
Cursor springt of beweegt willekeurig tijdens het typen in Windows 10
Als u merkt dat uw muiscursor vanzelf springt of beweegt, automatisch, willekeurig tijdens het typen op een Windows-laptop of -computer, dan kunnen en...
De scrollrichting van de muis en touchpads omkeren in Windows 10
Muis en Touchpads maken computergebruik niet alleen eenvoudig, maar ook efficiënter en minder tijdrovend. We kunnen ons een leven zonder deze apparate...