So lesen und schreiben Sie INI- und Conf -Dateien mit Python

So lesen und schreiben Sie INI- und Conf -Dateien mit Python
Die Python-Programmiersprache verfügt über ein nützliches integriertes Modul namens „configParser“, mit dem Konfigurationsparameter für Apps sauber geschrieben werden können. ConfigParser verwendet eine gut definierte und strukturierte Konfigurationssprache, die mit INI -Dateien, die in Microsoft Windows gefunden wurden, vollständig kompatibel. Diese INI -Dateien können auch mit Python -Apps verwendet werden.

In Linux ist es häufiger zu sehen “.conf ”Dateien als“.INI ”Dateien. Conf -Dateien unter Linux sind wie alle anderen Textdateien und können daher in irgendeiner Weise strukturiert werden. Es ist abhängig von Parser, wie es a "interpretiert".conf ”Datei. Das Konfigurationsmodul von Python kann analysieren “.Conf ”-Dateien (oder eine andere zufällige Erweiterung), vorausgesetzt, diese Dateien sind in der INI -kompatiblen Konfigurationssprache definiert. In diesem Artikel wird das Lesen und Schreiben erklärt “.Conf ”-Dateien unter Linux unter Verwendung der neuesten stabilen Version von Python 3. Beachten Sie, dass wenn Sie alle Vorkommen von “ersetzen“.Conf ”Erweiterung in diesem Artikel mit“.INI ”-Einweiterung, das Ergebnis wäre das gleiche. Der unten erläuterte Prozess und der Code sollten hauptsächlich mit Microsoft Windows mit einigen geringfügigen Unterschieden kompatibel sein. Obwohl diese Unterschiede in diesem Artikel nicht behandelt werden.

ConfigParser -Modul

Konfigurationsdatei -Parser oder Konfigurationsparser ist ein Python -Modul, mit dem Sie Konfigurationsdateien lesen und schreiben können, die in Python -Apps verwendet werden. Wie oben erläutert, unterstützt dieses Modul die INI -Dateisyntax. Eine sehr simpel “.Ini ” /“.Conf ”-Datei sieht so aus.

[STANDARD]
Sound = 1
Musik = 1
Volumen = 0.8
Auflösung = 1920x1080
[Benutzer]
# Sound kann 0 (falsch) und 1 (wahr) als mögliche Werte haben
Sound = 1
; Musik kann 0 (falsch) und 1 (wahr) als mögliche Werte haben
Musik = 0
Volumen = 0.4
Auflösung = 1280x720

Das Beispiel ".Die obige Conf “-Datei hat zwei Abschnitte,„ Standard “und„ Benutzer “. Normalerweise werden Python -Programme so codiert, dass die Standardabschnittswerte niemals geändert werden. Der Standardabschnitt wird verwendet, um die Gesamt- oder einzelne Werte auf Standardwerte zurückzusetzen. Der Benutzerabschnitt enthält Änderungen eines Endbenutzers, der das Python -Programm verwendet. Beachten Sie, dass die Abschnittsnamen irgendetwas sein können und es nicht erforderlich ist, einen Standardabschnitt zu haben. Wenn jedoch der Abschnitt „Standard“ vorhanden ist (Name sollte in Großbuchstaben sein), wird er verwendet, um die Standardwerte sicher anzugeben, wenn ConfigParser bestimmte Variablen nicht analysiert. Die Logik, um diese Abschnitte, Variablen und Fallback -Werte zu verarbeiten, muss im Python -Programm selbst definiert werden. Symbole wie "#" und ";" kann verwendet werden, um Kommentare in “zu bezeichnen“.conf ”Dateien. Alle Schlüsselwertpaare in der Konfigurationsdatei sind von Fall unempfindlich, normalerweise in Kleinbuchstaben geschrieben.

DataTypes -Handhabung von configParserser

Bevor Sie einige Beispiele für configParser vorziehen. Für ConfigParser ist jedes Stück geschriebener oder analysierter Code eine Zeichenfolge. Es kann nicht zwischen Zahlen oder einem anderen Format unterscheiden. Programmierer müssen in ihrem Programm Logik schreiben, um eine Zeichenfolge „1234“ in die Nummer zu konvertieren, indem sie int („1234“) verwendet werden, während Daten aus einem „Daten lesen“.conf ”Datei.

Während es eine ziemlich leichte Aufgabe ist, auf Zahlen zu konvertieren, kann es schwierig sein, mit der INT- und Float -Methode eine ziemlich leichte Aufgabe zu erreichen, da Python Bool („Any_String“) so behandelt. Um dieses Problem zu überwinden, können Sie bedingte Anweisungen für eine bestimmte Zeichenfolge überprüfen. Das Konfigurationsmodul bietet auch eine Methode namens "getBoolean ()" ". Diese Methode kann 'Ja'/'Nein', '/' off ',' true '/' false 'und' 1 '/' 0 'boolesche Werte korrekt unterscheiden, selbst wenn sie Strings sind. ConfigParser enthält auch Methoden getInt () und getfloat () für Ihre Bequemlichkeit.

Schreiben und Speichern einer neuen Conf -Datei mit CONFICKPARSER

Nehmen wir das an “.Die oben erwähnte Conf “-Datei gibt es nicht und Sie möchten sie beim ersten Start des Programms automatisch erstellen. Der folgende Code erstellt eine neue „Einstellungen.Conf ”-Tatei im Verzeichnis, aus dem das Python -Programm ausgeführt wurde.

configParser importieren
config = configParser.ConfigParser ()
config ['Standard'] = "Sound": "1", "Musik": "1",
"Volumen": "0.8 "," Auflösung ":" 1920x1080 "
config ['Benutzer'] = "Sound": "1", "Musik": "1",
"Volumen": "0.8 "," Auflösung ":" 1920x1080 "
mit offenem ('Einstellungen.conf ',' w ') als configfile:
Konfiguration.Schreiben (configfile)

Die erste Anweisung im obigen Code importiert das configParser -Modul. Die zweite Anweisung erstellt ein wörterbuchartiges Objekt namens "Konfiguration". Sie können jetzt die Standard -Python -Wörterbuchsyntax verwenden, um Abschnitte und Variablen zu definieren, die unter den nächsten beiden Aussagen ersichtlich sind. Zuletzt erstellt die Anweisung "With Open" eine neue "Einstellungen".conf ”Datei und schreibt Konfigurationsabschnitte in die Datei.

Der obige Code funktioniert, aber es gibt ein kleines Problem damit. Es erstellt jedes Mal eine neue Einstellungsdatei, wenn das Programm ausgeführt wird. Um dieses Problem zu beheben, müssen Sie zwei Bedingungen überprüfen:

  • Existiert die Einstellungsdatei?? Wenn nicht, erstellen Sie eine neue Einstellungsdatei nur, wenn die Datei nicht vorhanden ist.
  • Die Einstellungsdatei existiert, enthält jedoch alle Daten? Ist es leer?? Schreiben Sie neue Konfigurationsdaten nur dann in die Einstellungsdatei, wenn sie leer sind.

Der folgende geänderte Code überprüft die beiden Bedingungen und erstellt nur eine neue Einstellungsdatei, wenn diese beiden Bedingungen erfüllt sind.

configParser importieren
OS importieren
config = configParser.ConfigParser ()
config ['Standard'] = "Sound": "1", "Musik": "1",
"Volumen": "0.8 "," Auflösung ":" 1920x1080 "
config ['Benutzer'] = "Sound": "1", "Musik": "1",
"Volumen": "0.8 "," Auflösung ":" 1920x1080 "
Einstellungen_file = os.Weg.Dirname (Betriebssystem.Weg.RealPath (__ Datei__))
+ Betriebssystem.SEP + "" Einstellungen.Conf "
wenn nicht os.Weg.existiert (Einstellungen_file)
oder os.STAT (Einstellungen_file).ST_SIZE == 0:
mit offenem ('Einstellungen.conf ',' w ') als configfile:
Konfiguration.Schreiben (configfile)

Die zweite Anweisung im obigen Code importiert das "Betriebssystem" -Modul. In der Variablen "Einstellungen_file" speichert der vollständige Pfad zu den "Einstellungen".Conf ”-Datei, die im Verzeichnis des Python -Skripts erstellt werden soll. Die nächste Anweisung überprüft zwei oben erwähnte Bedingungen. Die erste Klausel in der Aussage ist selbsterklärend. Die zweite Klausel überprüft, ob die Dateigröße "0 Bytes" lautet. Eine Null -Byte -Datei würde eine leere Datei ohne darin gespeicherte Daten bedeuten. Der Rest des Codes ist das gleiche wie das erste oben angegebene Beispiel.

Bisher speichern Sie die oben erläuterten Codeproben die Konfigurationsdatei im Verzeichnis des Python -Skripts selbst. Es handelt sich jedoch um eine übliche Praxis und ein FreedSktop -Standard, um Konfigurationsdateien in der “zu speichern.“.Konfigurationsverzeichnis im Home -Ordner. Das unten stehende Code -Beispiel wird ein neues „Einstellungen“ erstellt.Conf ”-Datei in" ~/.config/testApp ”Ordner.

configParser importieren
OS importieren
app_name = "testApp"
config_Folder = os.Weg.beitreten (os.Weg.Expansion ("~"), '.config ', app_name)
Betriebssystem.Makedirs (config_Folder, exist_ok = true)
Einstellungen_file = "Einstellungen.Conf "
full_config_file_path = os.Weg.join (config_Folder, settings_file)
config = configParser.ConfigParser ()
config ['Standard'] = "Sound": "1", "Musik": "1",
"Volumen": "0.8 "," Auflösung ":" 1920x1080 "
config ['Benutzer'] = "Sound": "1", "Musik": "1",
"Volumen": "0.8 "," Auflösung ":" 1920x1080 "
wenn nicht os.Weg.existiert (full_config_file_path)
oder os.STAT (full_config_file_path).ST_SIZE == 0:
mit open (full_config_file_path, 'w') als configfile:
Konfiguration.Schreiben (configfile)

Der obige Code ist nahezu das gleiche wie das frühere Beispiel, außer dass er den Ort der Einstellungen ändert.conf ”Datei zu" ~/.config/testApp/Einstellungen.conf ”. Die Variable "config_Folder" speichert den vollständigen Pfad zum Anwendungsordner, der in “erstellt werden soll.Konfigurationsverzeichnis ("~/.config/testapp/”). Das “os.Makedirs “erstellt eine Anweisung nur einen neuen App -Ordner, wenn es noch nicht vorhanden ist. Die Variable "full_config_file_path" speichert den vollständigen Pfad der Einstellungsdatei ("~/.config/testApp/Einstellungen.conf ”). Der Rest des Codes ist selbsterklärend.

Lesen einer Conf -Datei mit ConfigParserser

Das Parsen einer Konfigurationsdatei ist ziemlich einfach. Der configParser versucht, einen Wert mit Get (), Getfloat (), Getboolean () -Methoden oder Wörterbuchsyntax zu lesen. Im Falle eines Schlüsselfehlers werden Werte aus den Standardabschnitt- oder Fallback -Werten verwendet. Es ist eine gute Praxis, Standardabschnitt oder Fallback -Werte zu definieren, um Schlüsselfehler zu verhindern. Sie können Try-Except-Anweisungen auch für Supress-Fehler verwenden.

config = configParser.ConfigParser ()
Konfiguration.read (full_config_file_path)
is_sound_on = config ['user'].Getboolean ('Sound')
volumen_level = config ['user'].Getfloat ('Volumen')
Auflösung = config ['Benutzer'] ['Auflösung']
# Fallback -Wert "False" wird ignoriert, da bereits ein Standardabschnitt vorliegt.
# In Abwesenheit eines Standardabschnitts wird der Fallback -Wert ordnungsgemäß verwendet.
is_music_on = config ['user'].GetBoolean ('Musik', falsch)
print (is_sound_on, is_music_on, Volume_Level, Auflösung)

Im obigen Code -Beispiel „Konfigurieren.Lesen Sie ”Anweisung wird verwendet, um Daten aus einer Konfigurationsdatei zu lesen. In den folgenden Aussagen werden verschiedene integrierte GET-Methoden und Wörterbuchnotationen verwendet, um die Daten zu lesen. In der Variablendeklaration "is_music_on" ist das zweite Argument der Fallback -Wert (falsch). Beachten Sie, dass Fallback -Werte niedrigere Vorrang. In einfachen Worten haben Fallback-Werte keinen Einfluss, wenn ein Schlüsselwertpaar bereits im Standardabschnitt vorhanden ist.

Voller Code

Im Folgenden finden Sie den gesamten Code, der sowohl die erste Ausführung der Erstellung der Konfigurationsdatei als auch das Lesen der Konfigurationsdatei kombiniert.

#! /usr/bin/python3
configParser importieren
OS importieren
app_name = "testApp"
config_Folder = os.Weg.beitreten (os.Weg.Expansion ("~"), '.config ', app_name)
Betriebssystem.Makedirs (config_Folder, exist_ok = true)
Einstellungen_file = "Einstellungen.Conf "
full_config_file_path = os.Weg.join (config_Folder, settings_file)
config = configParser.ConfigParser ()
config ['Standard'] = "Sound": "1", "Musik": "1",
"Volumen": "0.8 "," Auflösung ":" 1920x1080 "
config ['Benutzer'] = "Sound": "1", "Musik": "1",
"Volumen": "0.8 "," Auflösung ":" 1920x1080 "
wenn nicht os.Weg.existiert (full_config_file_path)
oder os.STAT (full_config_file_path).ST_SIZE == 0:
mit open (full_config_file_path, 'w') als configfile:
Konfiguration.Schreiben (configfile)
Konfiguration.read (full_config_file_path)
is_sound_on = config ['user'].Getboolean ('Sound')
volumen_level = config ['user'].Getfloat ('Volumen')
Auflösung = config ['Benutzer'] ['Auflösung']
# Fallback -Wert "False" wird ignoriert, da bereits ein Standardabschnitt vorliegt.
# In Abwesenheit eines Standardabschnitts wird der Fallback -Wert ordnungsgemäß verwendet.
is_music_on = config ['user'].GetBoolean ('Musik', falsch)
print (is_sound_on, is_music_on, Volume_Level, Auflösung)

Abschluss

ConfigParser in Python bietet eine nützliche Möglichkeit, Einstellungen sowohl der Befehlszeile als auch der GUI -Python -Apps zu verarbeiten. Diese Konfigurationsdateien können auch als leichte textbasierte Datenbanken verwendet werden, sind jedoch möglicherweise nicht für erweiterte Dataatypen, große Datensätze und eine große Anzahl von Abfragen geeignet.