Dateien und Daten verarbeiten¶
Dateien lesen, schreiben und strukturierte Daten für typische Administrations- und Automatisierungsaufgaben verarbeiten.
Ein Großteil der täglichen Arbeit von Systemadministratoren besteht aus der Verarbeitung von Daten. Logdateien müssen analysiert, Konfigurationsdateien gelesen, Berichte erzeugt und Daten zwischen verschiedenen Systemen ausgetauscht werden.
Python bietet hierfür eine Vielzahl leistungsfähiger Werkzeuge. Textdateien, CSV-Dateien und JSON-Dokumente lassen sich mit wenigen Zeilen Code verarbeiten. Gleichzeitig ermöglichen die eingebauten Datenstrukturen eine komfortable Weiterverarbeitung der eingelesenen Informationen.
In diesem Kapitel lernen Sie die wichtigsten Techniken kennen, um Dateien sicher zu lesen und zu schreiben sowie strukturierte Daten effizient auszuwerten.
Diese Fähigkeiten bilden die Grundlage vieler Automatisierungs-, Monitoring- und Reporting-Lösungen.
Textdateien lesen und schreiben¶
Dateien öffnen und schließen¶
In Python öffnet man Dateien mit der Funktion open(). Dabei gibt man den Pfad und den Modus an, z.B. 'r' für Lesen oder 'w' für Schreiben. Anders als in Sprachen wie C++ oder Java muss man sich in Python nicht explizit um das Schließen der Datei kümmern, wenn man den sogenannten Kontextmanager (with-Anweisung) verwendet. Dadurch wird die Datei automatisch geschlossen, auch wenn Fehler auftreten.
# Logdatei zum Lesen öffnen
with open('/var/log/syslog', 'r', encoding='utf-8') as logfile:
for line in logfile:
print(line.strip())
Textdateien zeilenweise lesen¶
Für große Logdateien ist es wichtig, nicht die ganze Datei auf einmal in den Speicher zu laden. Python liest mit einer for-Schleife über das Dateiobjekt zeilenweise, was speichereffizient ist und auch bei sehr großen Dateien funktioniert.
with open('/var/log/syslog', 'r', encoding='utf-8') as logfile:
for line in logfile:
if 'ERROR' in line:
print(line.strip())
Ganze Datei auf einmal lesen¶
Möchte man die gesamte Datei als Text in einer Variable speichern, kann man read() verwenden. Das ist praktisch bei kleineren Dateien, z.B. Konfigurationsdateien.
Textdateien schreiben¶
Zum Schreiben öffnet man die Datei mit Modus 'w' (überschreiben) oder 'a' (anhängen). Auch hier empfiehlt sich with für das automatische Schließen.
# Neue Logdatei schreiben
with open('error_report.log', 'w', encoding='utf-8') as report:
report.write('Fehlerbericht vom Server\n')
report.write('========================\n')
Beispiel: Logdatei filtern und in neue Datei schreiben¶
Ein typischer Anwendungsfall ist, aus einer großen Logdatei nur die Zeilen mit Fehlern herauszufiltern und in eine neue Datei zu speichern.
input_path = '/var/log/syslog'
output_path = 'error_only.log'
with open(input_path, 'r', encoding='utf-8') as infile, \
open(output_path, 'w', encoding='utf-8') as outfile:
for line in infile:
if 'ERROR' in line or 'CRITICAL' in line:
outfile.write(line)
Umgang mit Dateipfaden¶
Für plattformunabhängige Skripte empfiehlt sich das Modul pathlib, das Pfadoperationen komfortabel und sicher macht.
from pathlib import Path
log_dir = Path('/var/log')
log_file = log_dir / 'syslog'
with log_file.open('r', encoding='utf-8') as f:
for line in f:
print(line.strip())
Hinweise zur Kodierung¶
Standardmäßig verwendet open() in Python 3 die Systemkodierung. Für Logdateien ist meist UTF-8 passend. Bei Problemen mit Sonderzeichen kann das explizite Setzen von encoding='utf-8' helfen.
Vergleich mit Shell-Skripten¶
Shell-Tools wie grep sind schnell und praktisch für einfache Filteraufgaben. Python bietet jedoch mehr Flexibilität, z.B. komplexe Auswertungen, Kombination mit anderen Datenquellen oder automatisierte Berichte, alles in einem Skript.
Zusammenfassung¶
- Verwenden Sie
with open(...) as f:für sicheren und automatischen Umgang mit Dateien. - Lesen Sie große Dateien zeilenweise, um Speicher zu schonen.
- Schreiben Sie Ausgaben in separate Dateien, um Logs zu filtern oder Berichte zu erstellen.
- Nutzen Sie
pathlibfür plattformunabhängige Pfadoperationen. - Achten Sie auf korrekte Textkodierung, um Fehler mit Sonderzeichen zu vermeiden.
CSV-Dateien verarbeiten¶
CSV-Dateien mit dem csv-Modul lesen¶
CSV-Dateien (Comma-Separated Values) sind ein weit verbreitetes Format für tabellarische Daten, z. B. Serverlogs, Inventarlisten oder Monitoring-Daten. Python bietet mit dem eingebauten Modul csv eine einfache und zuverlässige Möglichkeit, CSV-Dateien zu lesen und zu schreiben.
Ein typisches Beispiel: Eine Logdatei mit Serverzugriffen im CSV-Format, die wir analysieren wollen:
zeit,benutzer,aktion,erfolg
2024-06-01 08:15:23,admin,login,True
2024-06-01 08:17:45,guest,download,False
2024-06-01 08:20:10,admin,upload,True
So lesen Sie diese Datei ein und verarbeiten sie zeilenweise:
import csv
with open('zugriffe.csv', encoding='utf-8') as datei:
reader = csv.DictReader(datei) # Liest jede Zeile als Wörterbuch
for zeile in reader:
zeit = zeile['zeit']
benutzer = zeile['benutzer']
aktion = zeile['aktion']
erfolg = zeile['erfolg'] == 'True'
print(f"{zeit}: {benutzer} hat {aktion} ausgeführt (Erfolg: {erfolg})")
Warum DictReader?
- Er ordnet automatisch Spaltenüberschriften zu, was den Code lesbarer macht.
- Im Vergleich zu Shell-Skripten ist so die Verarbeitung strukturierter und weniger fehleranfällig.
CSV-Dateien schreiben¶
Für Berichte oder Datenexporte erzeugen Sie CSV-Dateien ebenfalls mit csv:
import csv
bericht = [
{'benutzer': 'admin', 'aktionen': 5, 'erfolgreich': 5},
{'benutzer': 'guest', 'aktionen': 3, 'erfolgreich': 2},
]
with open('bericht.csv', 'w', newline='', encoding='utf-8') as datei:
feldnamen = ['benutzer', 'aktionen', 'erfolgreich']
writer = csv.DictWriter(datei, fieldnames=feldnamen)
writer.writeheader() # Schreibt die Kopfzeile
writer.writerows(bericht) # Schreibt alle Zeilen
Hinweis: Der Parameter newline='' verhindert Probleme mit Zeilenumbrüchen, die unter Windows auftreten können.
Praxis: Logdatei filtern und zusammenfassen¶
Angenommen, Sie wollen alle fehlgeschlagenen Aktionen aus einer Logdatei extrahieren und als CSV speichern:
import csv
with open('zugriffe.csv', encoding='utf-8') as eingabe, \
open('fehlgeschlagen.csv', 'w', newline='', encoding='utf-8') as ausgabe:
reader = csv.DictReader(eingabe)
writer = csv.DictWriter(ausgabe, fieldnames=reader.fieldnames)
writer.writeheader()
for zeile in reader:
if zeile['erfolg'] != 'True':
writer.writerow(zeile)
Best Practices für CSV-Verarbeitung¶
- Encoding immer angeben: UTF-8 ist Standard und vermeidet Probleme mit Umlauten.
with-Anweisung verwenden: Sorgt für automatisches Schließen der Dateien.DictReader/DictWriterbevorzugen: Klarer und leichter wartbar als Listenindexierung.- Große Dateien zeilenweise verarbeiten: Vermeidet hohen Speicherverbrauch.
Vergleich mit Shell-Skripten¶
Shell-Tools wie awk oder cut sind schnell für einfache Extraktionen, aber Python bietet:
- Bessere Lesbarkeit und Wartbarkeit
- Einfachere Fehlerbehandlung
- Leichte Erweiterbarkeit (z. B. komplexere Filter, Aggregationen)
Damit ist Python ideal für Automatisierungsskripte, die über einfache Textmanipulation hinausgehen.
Mit diesen Grundlagen können Sie CSV-Daten aus Logs, Inventarlisten oder Monitoring-Tools effizient verarbeiten und eigene Berichte erstellen – ein wichtiger Baustein für Ihre Automatisierungsaufgaben.
JSON-Dateien verarbeiten¶
JSON verstehen und warum es wichtig ist¶
JSON (JavaScript Object Notation) ist ein einfaches, textbasiertes Format, um strukturierte Daten auszutauschen. Es ist in der Administration besonders nützlich, weil viele moderne Systeme und APIs JSON verwenden – etwa Cloud-Dienste, Monitoring-Tools oder Konfigurationsdateien.
Anders als klassische INI- oder XML-Dateien ist JSON leicht lesbar und direkt in Python als Datenstruktur nutzbar. Das macht es ideal für Automatisierungsskripte, die mit externen Systemen kommunizieren oder komplexe Konfigurationen verarbeiten.
JSON-Dateien in Python lesen¶
Python bietet das eingebaute Modul json, mit dem Sie JSON-Dateien unkompliziert einlesen können. Dabei wird der JSON-Text in Python-Datenstrukturen wie Dictionaries und Listen umgewandelt.
import json
# Beispiel: Serverinventar aus JSON-Datei laden
with open('server_inventar.json', 'r', encoding='utf-8') as datei:
inventar = json.load(datei) # JSON wird als Python-Datenstruktur geladen
# Zugriff auf Daten
for server in inventar['server']:
print(f"Hostname: {server['hostname']}, IP: {server['ip']}")
Hinweis: Verwenden Sie immer with open(...) für den sicheren Umgang mit Dateien. So wird die Datei automatisch geschlossen, auch bei Fehlern.
JSON-Dateien schreiben¶
Ebenso einfach ist das Speichern von Daten in JSON-Dateien. Das ist nützlich, wenn Sie z.B. Berichte oder Konfigurationsänderungen automatisiert erzeugen wollen.
import json
# Beispiel: Monitoring-Ergebnis als JSON speichern
monitoring_ergebnis = {
"host": "webserver01",
"status": "OK",
"services": ["nginx", "ssh", "docker"]
}
with open('monitoring_report.json', 'w', encoding='utf-8') as datei:
json.dump(monitoring_ergebnis, datei, indent=4) # schön formatiert speichern
Praktische Tipps für die Arbeit mit JSON¶
- Encoding beachten: JSON-Dateien sind meist UTF-8-codiert. Öffnen Sie Dateien daher immer mit
encoding='utf-8', um Probleme mit Sonderzeichen zu vermeiden. - Indentation für Lesbarkeit: Beim Schreiben hilft
indent=4, die Datei übersichtlich zu formatieren. Das erleichtert manuelle Prüfungen. - Fehler abfangen: JSON-Dateien können fehlerhaft sein. Nutzen Sie
try-except, um z.B.json.JSONDecodeErrorabzufangen und Fehlermeldungen auszugeben.
Beispiel: Konfigurationsdatei lesen und anpassen¶
Viele Tools speichern Einstellungen in JSON. Hier ein Beispiel, wie Sie eine Konfigurationsdatei laden, ändern und speichern.
import json
config_path = 'app_config.json'
try:
with open(config_path, 'r', encoding='utf-8') as f:
config = json.load(f)
except FileNotFoundError:
print(f"Konfigurationsdatei {config_path} nicht gefunden.")
config = {}
except json.JSONDecodeError as e:
print(f"Fehler beim Lesen der JSON-Datei: {e}")
config = {}
# Konfiguration anpassen
config['logging']['level'] = 'DEBUG'
# Änderungen speichern
with open(config_path, 'w', encoding='utf-8') as f:
json.dump(config, f, indent=4)
print("Konfiguration aktualisiert.")
JSON vs. Shell-Skripte¶
Shell-Skripte können JSON nur schwer parsen oder erzeugen. Python bietet hier klare Vorteile: - Direkte Umwandlung von JSON in Python-Datenstrukturen - Einfaches Lesen und Schreiben komplexer Daten - Bessere Fehlerbehandlung
Mit diesen Grundlagen sind Sie bestens gerüstet, um JSON-Daten in Ihrem Automatisierungsalltag sicher und effizient zu nutzen.