Python Tools

Datenpersistenz mit shelve und pickle

shelve und pickle sind Python-Module zur Speicherung und Serialisierung von Daten, wobei shelve eine einfache, dictionary-ähnliche Datenbank ermöglicht und pickle komplexe Python-Objekte in Byte-Streams umwandelt.


4 Minuten Lesezeit
28 Okt 2024
Datenpersistenz mit shelve und pickle

Was lerne ich in diesem Kurs?

In diesem Tutorial lernen Sie, wie Sie mit den Python-Modulen shelve und pickle Datenstrukturen speichern, verwalten und wiederherstellen, um eine effiziente und sichere Datenpersistenz in Ihren Projekten zu erreichen.

Hier ist ein umfassendes Tutorial zu den Python-Modulen shelve und pickle, die häufig zur Speicherung und Serialisierung von Daten verwendet werden. Das Tutorial enthält eine Einführung in beide Module, Anwendungsbeispiele und Best Practices.


Tutorial: Datenpersistenz mit shelve und pickle

Inhalt

  1. Was ist shelve und wie funktioniert es?
  2. Verwendung von shelve: Erstellung, Lesen und Schreiben von Daten
  3. Best Practices für shelve
  4. Einführung in pickle zur Serialisierung von Python-Objekten
  5. Vergleich und Verwendung von pickle und shelve
  6. Sicherheitshinweise bei pickle

Was ist shelve und wie funktioniert es?

Das Python-Modul shelve bietet eine einfache Möglichkeit, Datenstrukturen wie Dictionaries, Listen oder benutzerdefinierte Objekte in Dateien zu speichern, die später wieder geladen werden können. shelve kombiniert die Speicherung von Python-Objekten mit einem Dictionary-artigen Zugriff, sodass Daten wie in einem Dictionary gelesen und geschrieben werden können.

Shelve erstellt eine Datei, die als eine Art Mini-Datenbank fungiert, in der Python-Objekte persistiert gespeichert werden. Es ist besonders nützlich für kleinere Datenspeicher, bei denen eine vollständige Datenbanklösung übertrieben wäre.


Verwendung von shelve: Erstellung, Lesen und Schreiben von Daten

Grundlegende Schreiboperationen

Um eine shelve-Datei zu erstellen und Daten zu speichern, öffnen Sie ein shelve-Objekt im Schreibmodus ('c' für erstellen/aktualisieren). Sie können dann Daten in Form von Schlüssel-Wert-Paaren speichern, ähnlich wie bei einem Python-Dictionary. Die Schlüssel müssen vom Typ String sein.

import shelve

# Öffnen oder erstellen der Datenbankdatei
with shelve.open('mein_shelve') as db:
    # Speichern von Daten
    db['name'] = 'Max Mustermann'
    db['alter'] = 30
    db['hobbys'] = ['Lesen', 'Programmieren', 'Radfahren']

print("Daten wurden gespeichert.")

Der obige Code erstellt eine mein_shelve-Datei, falls diese noch nicht existiert, und speichert darin verschiedene Datenstrukturen.

Lesen und Abrufen von Daten

Nach dem Speichern können die Daten durch Öffnen der Datei und Zugriff auf die Schlüssel wieder abgerufen werden:

import shelve

# Öffnen der shelve-Datei im Lesemodus
with shelve.open('mein_shelve') as db:
    # Abrufen der Daten
    name = db['name']
    alter = db['alter']
    hobbys = db['hobbys']

    print(f"Name: {name}")
    print(f"Alter: {alter}")
    print(f"Hobbys: {hobbys}")

Aktualisieren und Hinzufügen von Daten

Sie können vorhandene Daten aktualisieren oder neue Einträge hinzufügen, indem Sie das shelve-Objekt erneut öffnen und die entsprechenden Schlüssel-Werte zuweisen.

import shelve

with shelve.open('mein_shelve') as db:
    # Aktualisieren eines bestehenden Eintrags
    db['alter'] = 31

    # Hinzufügen eines neuen Eintrags
    db['stadt'] = 'Berlin'

print("Daten wurden aktualisiert.")

Löschen von Daten

Um Daten zu entfernen, verwenden Sie das del-Statement auf dem Schlüssel:

import shelve

with shelve.open('mein_shelve') as db:
    # Löschen eines Eintrags
    del db['stadt']

print("Eintrag wurde gelöscht.")

Best Practices für shelve

  • Verwenden Sie den Kontext-Manager (with): Dadurch wird sichergestellt, dass die Datei korrekt geschlossen wird.

  • Daten vor dem Speichern vorbereiten: Shelve speichert nur Objekte, die pickle-kompatibel sind (Listen, Dictionaries, Klassenobjekte, etc.). Vermeiden Sie unpickelbare Objekte wie offene Dateihandles.

  • Vermeiden Sie die gleichzeitige Verwendung mehrerer Instanzen: Das shelve-Modul ist nicht für parallelen Zugriff geeignet. Um Datenkorruption zu vermeiden, sollte jeweils nur eine Instanz die Datei öffnen.

Einführung in pickle zur Serialisierung von Python-Objekten

Das pickle-Modul in Python ist ein leistungsstarkes Tool, um beliebige Python-Objekte in Byte-Streams zu serialisieren und in Dateien zu speichern oder über Netzwerke zu übertragen. Anders als shelve, das eine Struktur auf Basis eines Dictionaries bereitstellt, bietet pickle eine detaillierte und flexible Möglichkeit zur Serialisierung komplexer Objekte.

Speichern von Daten mit pickle

Mit pickle können wir Daten in einer Datei speichern, indem wir das dump-Verfahren verwenden.

import pickle

# Daten zum Speichern
daten = {'name': 'Max Mustermann', 'alter': 30, 'hobbys': ['Lesen', 'Programmieren', 'Radfahren']}

# Serialisieren und in einer Datei speichern
with open('daten.pickle', 'wb') as file:
    pickle.dump(daten, file)

print("Daten wurden serialisiert und gespeichert.")

Laden von Daten mit pickle

Gespeicherte Daten lassen sich mit load wieder in Python laden und rekonstruieren.

import pickle

# Deserialisieren und aus der Datei laden
with open('daten.pickle', 'rb') as file:
    daten = pickle.load(file)

print(f"Name: {daten['name']}")
print(f"Alter: {daten['alter']}")
print(f"Hobbys: {daten['hobbys']}")

Vergleich und Verwendung von pickle und shelve

  • Strukturierte Speicherung: shelve erstellt eine Struktur, die ähnlich wie ein Dictionary funktioniert und eignet sich, wenn ein einfacher, schlüsselbasierter Zugriff auf die Daten erforderlich ist.
  • Flexible Serialisierung: pickle ist flexibler, da es auch komplexe Objekte (z.B. Klasseninstanzen) speichern kann, jedoch keine direkte Schlüssel-Zugriffsmöglichkeit bietet.
  • Lese-/Schreibzugriff: shelve ist ideal für Datenbanken mit einfachem Lese-/Schreibzugriff, während pickle für die Speicherung und Wiederherstellung komplexer Datenstrukturen verwendet wird.

Beispiel: Kombinierte Verwendung von pickle und shelve

Es ist auch möglich, pickle zusammen mit shelve zu verwenden, um komplexe Datenstrukturen zu speichern:

import shelve
import pickle

# Erstellen eines komplexen Objekts
class Benutzer:
    def __init__(self, name, alter):
        self.name = name
        self.alter = alter
        self.hobbys = ['Lesen', 'Programmieren', 'Radfahren']

benutzer = Benutzer('Max Mustermann', 30)

# Speichern mit shelve und pickle
with shelve.open('benutzer_shelve') as db:
    db['benutzer'] = pickle.dumps(benutzer)

# Laden mit shelve und pickle
with shelve.open('benutzer_shelve') as db:
    benutzer = pickle.loads(db['benutzer'])

print(f"Name: {benutzer.name}")
print(f"Alter: {benutzer.alter}")
print(f"Hobbys: {benutzer.hobbys}")

In diesem Beispiel verwenden wir pickle innerhalb von shelve, um ein komplexes Python-Objekt zu speichern und wiederherzustellen.

Sicherheitshinweise bei pickle

Beim Arbeiten mit pickle sollten Sie einige Sicherheitsvorkehrungen treffen:

  • Untrusted Data nicht laden: pickle kann gefährlich sein, wenn die Daten von unbekannten Quellen stammen, da der Deserialisierungsprozess bösartigen Code enthalten könnte. Laden Sie daher nur Daten, die aus vertrauenswürdigen Quellen stammen.

  • Verwenden Sie alternative Serialisierungsformate für untrusted data: Wenn Daten aus unbekannten oder unsicheren Quellen stammen, sollten Sie stattdessen Formate wie JSON verwenden, die keine ausführbaren Objekte laden können.

  • Beispiel für sichere pickle-Nutzung:

   import pickle

   # Vertrauenswürdige Daten serialisieren
   sichere_daten = {'sicher': 'Ja', 'vertrauenswürdig': True}
   with open('sichere_daten.pickle', 'wb') as file:
       pickle.dump(sichere_daten, file)

   # Vertrauenswürdige Daten deserialisieren
   with open('sichere_daten.pickle', 'rb') as file:
       daten = pickle.load(file)

   print(daten)

Online- und Präsenzkurse zum Thema

Finden Sie interessante und zum Thema passende Kurse

Python Einführungskurs

Beginnen Sie Ihre Programmierkarriere mit unserem Python-Einführungskurs. Erlernen Sie grundlegende Konzepte wie Variablen, Schleifen und Datenstrukturen und bauen Sie eine solide Basis in Python auf. Durch praxisnahe Projekte und kompetente Anleitung entwickeln Sie wertvolle Programmierfähigkeiten.

5 Tage Vollzeit auch als Feierabendkurs Online

Nächster Termin: 20. Januar 2025
Preis pro Person: 1600,00 EUR

Rabattaktion: 3 für den Preis von 2!

Schulung Python für Fortgeschrittene

Diese Schulung „Python für Fortgeschrittene“ vertieft fortgeschrittene Programmiertechniken in Python, wie objektorientierte Programmierung, funktionale Programmierung und Persistenz. Die Teilnehmer lernen, wie sie komplexe Designs und Muster in Python umsetzen, effiziente Datenverarbeitung durchführen und wissenschaftliche Python-Bibliotheken nutzen können. Die Schulung bietet zudem praxisnahe Einblicke in Datenbanken, Metaklassen, Caching und maschinelles Lernen mit scikit-learn.

5 Tage Vollzeit Online

Nächster Termin: 13. Januar 2025
Preis pro Person: 1900,00 EUR

Rabattaktion: 3 für den Preis von 2!