Python

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

So lesen und schreiben Sie INI- und Conf-Dateien mit Python
Die Programmiersprache Python enthält 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 vollständig mit INI-Dateien von Microsoft Windows kompatibel ist. Diese INI-Dateien können auch mit Python-Apps verwendet werden, die unter Linux ausgeführt werden, und bieten eine dauerhafte Möglichkeit zum Speichern und Abrufen von Werten.

Unter Linux ist es häufiger zu sehen „.conf“-Dateien als „.ini"-Dateien. Conf-Dateien in Linux sind wie alle anderen Textdateien und können daher beliebig strukturiert werden. Es hängt vom Parser ab, wie er ein „.conf“-Datei. Das ConfigParser-Modul von Python kann „.conf“-Dateien (oder jede andere zufällige Erweiterung), vorausgesetzt, diese Dateien sind in einer INI-kompatiblen Konfigurationssprache definiert. Dieser Artikel erklärt Lesen und Schreiben “.conf“-Dateien in Linux mit der neuesten stabilen Version von Python 3. Beachten Sie, dass, wenn Sie alle Vorkommen von „.conf“-Erweiterung in diesem Artikel mit „.ini“-Erweiterung, wäre das Ergebnis das gleiche. Der unten erläuterte Prozess und Code sollte mit einigen kleinen Unterschieden auch mit Microsoft Windows weitgehend kompatibel sein. Obwohl diese Unterschiede in diesem Artikel nicht behandelt werden.

ConfigParser-Modul

Konfigurationsdateiparser oder ConfigParser ist ein Python-Modul, mit dem Sie in Python-Apps verwendete Konfigurationsdateien lesen und schreiben können. Wie oben erläutert, unterstützt dieses Modul die INI-Dateisyntax. Eine sehr einfache“.ini“ / „.conf“-Datei sieht so aus.

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

Das Beispiel ".conf“-Datei oben hat zwei Abschnitte, „DEFAULT“ und „User“. Normalerweise sind Python-Programme so codiert, dass die Werte des DEFAULT-Abschnitts niemals geändert werden. Der Abschnitt DEFAULT dient zum Zurücksetzen von Gesamt- oder Einzelwerten auf Standardwerte. Der Benutzerabschnitt spiegelt Änderungen wider, die von einem Endbenutzer vorgenommen wurden, der das Python-Programm verwendet. Beachten Sie, dass die Abschnittsnamen beliebig sein können und es nicht unbedingt erforderlich ist, einen DEFAULT-Abschnitt zu haben. Wenn jedoch der Abschnitt „DEFAULT“ vorhanden ist (der Name sollte in Großbuchstaben sein), wird er verwendet, um sicher Standardwerte bereitzustellen, wenn ConfigParser bestimmte Variablen nicht parsen kann. Die Logik zum Umgang mit diesen Abschnitten, den darunter liegenden Variablen und den Fallback-Werten muss im Python-Programm selbst definiert werden. Symbole wie „#“ und „;“ kann verwendet werden, um Kommentare in „.conf“-Dateien. Bei allen Schlüssel-Wert-Paaren in der Konfigurationsdatei wird die Groß-/Kleinschreibung nicht beachtet und normalerweise in Kleinbuchstaben geschrieben.

Verarbeitung von Datentypen durch ConfigParser

Bevor Sie mit einigen Beispielen von ConfigParser fortfahren, ist es wichtig, die Handhabung von Datentypen durch dieses Modul zu verstehen. Für ConfigParser ist jeder geschriebene oder geparste Code ein String a. Es kann nicht zwischen Zahlen oder anderen Formaten unterscheiden. Programmierer müssen Logik in ihr Programm schreiben, um eine Zeichenfolge „1234“ in eine Zahl umzuwandeln, indem sie int(“1234“) verwenden, während sie Daten aus einem „.conf“-Datei.

Während das Konvertieren in Zahlen mit der int- und float-Methode eine ziemlich einfache Aufgabe ist, kann das Konvertieren in boolean schwierig sein, da Python bool("any_string") als True behandelt. Um dieses Problem zu lösen, können Sie bedingte Anweisungen verwenden, die auf eine bestimmte Zeichenfolge prüfen. Das ConfigParser-Modul bietet auch eine Methode namens „getboolean()“. Diese Methode kann 'yes'/'no', 'on'/'off', 'true'/'false' und '1'/'0' Boolesche Werte korrekt unterscheiden, auch wenn es sich um Strings handelt. ConfigParser enthält auch die Methoden getint() und getfloat() für Ihre Bequemlichkeit.

Schreiben und Speichern einer neuen Conf-Datei mit ConfigParser

Nehmen wir an, die „.conf“-Datei existiert nicht und Sie möchten sie beim ersten Start des Programms automatisch erstellen. Der folgende Code erstellt eine neue "Einstellungen".conf“-Datei in dem Verzeichnis, von dem aus das Python-Programm ausgeführt wurde.

Konfigurationsparser importieren
config = configparser.KonfigParser()
config['DEFAULT'] = "Sound" : "1", "Musik" : "1",
"Lautstärke" : "0.8", "Auflösung" : "1920x1080"
config['User'] = "sound" : "1", "music" : "1",
"Lautstärke" : "0.8", "Auflösung" : "1920x1080"
mit open('Einstellungen.conf', 'w') als Konfigurationsdatei:
Konfiguration.schreiben (Konfigurationsdatei)

Die erste Anweisung im obigen Code importiert das ConfigParser-Modul. Die zweite Anweisung erstellt ein wörterbuchähnliches Objekt namens „config“. Sie können jetzt die standardmäßige Python-Wörterbuchsyntax verwenden, um Abschnitte und darunter enthaltene Variablen zu definieren, wie aus den nächsten beiden Anweisungen ersichtlich ist. Schließlich 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, was dazu führt, dass alle vom Benutzer vorgenommenen Änderungen an der Einstellungsdatei überschrieben werden. Um dieses Problem zu beheben, müssen Sie zwei Bedingungen überprüfen:

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

Konfigurationsparser importieren
Importieren von OS
 
config = configparser.KonfigParser()
config['DEFAULT'] = "Sound" : "1", "Musik" : "1",
"Lautstärke" : "0.8", "Auflösung" : "1920x1080"
config['User'] = "sound" : "1", "music" : "1",
"Lautstärke" : "0.8", "Auflösung" : "1920x1080"
settings_file = os.Pfad.dirname(os.Pfad.realpfad(__datei__))
+ os.sep + "Einstellungen".conf"
wenn nicht os.Pfad.existiert (Einstellungsdatei)
oder os.stat(settings_file).st_größe == 0:
mit open('Einstellungen.conf', 'w') als Konfigurationsdatei:
Konfiguration.schreiben (Konfigurationsdatei)

Die zweite Anweisung im obigen Code importiert das Modul „os“. Die Variable „settings_file“ speichert den vollständigen Pfad zu den „Einstellungen“.conf“-Datei, die im Verzeichnis des Python-Skripts erstellt werden soll. Die nächste Anweisung prüft zwei oben genannte Bedingungen. Die erste Klausel in der Aussage ist selbsterklärend. Die zweite Klausel prüft, ob die Dateigröße „0 Byte“ beträgt. Eine Null-Byte-Datei würde eine leere Datei ohne darin gespeicherte Daten bedeuten. Der Rest des Codes ist derselbe wie im ersten oben genannten Beispiel.

Bisher speichern die oben erläuterten Codebeispiele die Konfigurationsdatei im Verzeichnis des Python-Skripts selbst. Es ist jedoch gängige Praxis und Freedesktop-Standard, Konfigurationsdateien im „.config“-Verzeichnis im Home-Ordner. Das folgende Codebeispiel erstellt eine neue "Einstellungen".conf“-Datei in „~/.config/testapp“-Ordner.

Konfigurationsparser importieren
Importieren von OS
 
app_name = "testapp"
config_folder = os.Pfad.beitreten (os.Pfad.expanduser("~"), '.config', app_name)
os.makedirs(config_folder, exist_ok=True)
settings_file = "Einstellungen.conf"
full_config_file_path = os.Pfad.join(config_folder, settings_file)
 
config = configparser.KonfigParser()
config['DEFAULT'] = "Sound" : "1", "Musik" : "1",
"Lautstärke" : "0.8", "Auflösung" : "1920x1080"
config['User'] = "sound" : "1", "music" : "1",
"Lautstärke" : "0.8", "Auflösung" : "1920x1080"
 
wenn nicht os.Pfad.existiert (vollständiger_config_file_path)
oder os.stat(full_config_file_path).st_größe == 0:
mit open(full_config_file_path, 'w') als Konfigurationsdatei:
Konfiguration.schreiben (Konfigurationsdatei)

Der obige Code ist fast der gleiche wie im vorherigen Beispiel, außer dass er die Position von "Einstellungen" ändert.conf“-Datei in „~/.config/testapp/settings.conf”. Die Variable „config_folder“ speichert den vollständigen Pfad zum zu erstellenden Anwendungsordner in „.config“-Verzeichnis („~/.config/testapp/"). Das „os.makedirs“-Anweisung erstellt nur dann einen neuen App-Ordner, wenn er noch nicht existiert. Die Variable „full_config_file_path“ speichert den vollständigen Pfad der Einstellungsdatei („~/.config/testapp/settings.conf“). Der Rest des Codes ist selbsterklärend.

Lesen einer Conf-Datei mit ConfigParser

Das Parsen einer Konfigurationsdatei ist ziemlich einfach. Der ConfigParser versucht, einen Wert mithilfe der Methoden get(), getfloat(), getboolean() oder der Wörterbuchsyntax zu lesen. Bei einem Schlüsselfehler werden Werte aus dem Abschnitt DEFAULT oder Fallback-Werte verwendet. Es empfiehlt sich, den Abschnitt DEFAULT oder Fallback-Werte zu definieren, um Schlüsselfehler zu vermeiden. Sie können auch try-except-Anweisungen verwenden, um Fehler zu unterdrücken.

config = configparser.KonfigParser()
Konfiguration.read(full_config_file_path)
 
is_sound_on = config['Benutzer'].getboolean('sound')
volume_level = config['Benutzer'].getfloat('Volumen')
Auflösung = config['Benutzer']['Auflösung']
 
# Fallback-Wert "False" wird ignoriert, da bereits ein DEFAULT-Abschnitt vorhanden ist.
# Wenn kein DEFAULT-Abschnitt vorhanden ist, wird der Fallback-Wert ordnungsgemäß verwendet.
is_music_on = config['Benutzer'].getboolean('Musik', Falsch)
 
drucken (is_sound_on, is_music_on, volume_level, Auflösung)

Im obigen Codebeispiel „config“.read“-Anweisung wird verwendet, um Daten aus einer Konfigurationsdatei zu lesen. In den folgenden Anweisungen 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 (False). Beachten Sie, dass Fallback-Werte eine niedrigere Priorität haben als die im Abschnitt DEFAULT definierten Werte. Einfach ausgedrückt haben Fallback-Werte keine Auswirkung, wenn bereits ein Schlüssel-Wert-Paar im Abschnitt DEFAULT vorhanden ist.

Vollständiger Code

Unten ist der gesamte Code, der sowohl die Erstellung der Konfigurationsdatei beim ersten Durchlauf als auch das Lesen der Konfigurationsdatei kombiniert.

#! /usr/bin/python3
Konfigurationsparser importieren
Importieren von OS
 
app_name = "testapp"
config_folder = os.Pfad.beitreten (os.Pfad.expanduser("~"), '.config', app_name)
os.makedirs(config_folder, exist_ok=True)
settings_file = "Einstellungen.conf"
full_config_file_path = os.Pfad.join(config_folder, settings_file)
 
config = configparser.KonfigParser()
 
config['DEFAULT'] = "Sound" : "1", "Musik" : "1",
"Lautstärke" : "0.8", "Auflösung" : "1920x1080"
config['User'] = "sound" : "1", "music" : "1",
"Lautstärke" : "0.8", "Auflösung" : "1920x1080"
 
wenn nicht os.Pfad.existiert (vollständiger_config_file_path)
oder os.stat(full_config_file_path).st_größe == 0:
mit open(full_config_file_path, 'w') als Konfigurationsdatei:
Konfiguration.schreiben (Konfigurationsdatei)
 
Konfiguration.read(full_config_file_path)
is_sound_on = config['Benutzer'].getboolean('sound')
volume_level = config['Benutzer'].getfloat('Volumen')
Auflösung = config['Benutzer']['Auflösung']
 
# Fallback-Wert "False" wird ignoriert, da bereits ein DEFAULT-Abschnitt vorhanden ist.
# Wenn kein Abschnitt DEFAULT vorhanden ist, wird der Fallback-Wert ordnungsgemäß verwendet.
is_music_on = config['Benutzer'].getboolean('Musik', Falsch)
 
drucken (is_sound_on, is_music_on, volume_level, Auflösung)

Fazit

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

Top 5 ergonomische Computermaus-Produkte für Linux
Verursacht längere Computernutzung Schmerzen im Handgelenk oder in den Fingern?? Leiden Sie unter steifen Gelenken und müssen ständig die Hände schütt...
So ändern Sie die Maus- und Touchpad-Einstellungen mit Xinput in Linux
Die meisten Linux-Distributionen werden standardmäßig mit der Bibliothek „libinput“ ausgeliefert, um Eingabeereignisse auf einem System zu verarbeiten...
Weisen Sie Ihre Maustasten mit der X-Mouse Button Control für verschiedene Software unterschiedlich zu
Vielleicht benötigen Sie ein Tool, mit dem sich die Steuerung Ihrer Maus bei jeder von Ihnen verwendeten Anwendung ändern kann. In diesem Fall können ...