Warum erstellt das Modul "shelve" in Python manchmal Dateien mit verschiedenen Erweiterungen?

8

Ich führe ein Python-Programm, das das shelve -Modul über pickle verwendet. Nach dem Ausführen dieses Programms bekomme ich manchmal eine Ausgabedatei als a.data , aber zu anderen Zeiten bekomme ich drei Ausgabedateien als a.data.bak , a.data.dir und a.data.dat .

Warum ist das so?

    
Ali_IT 23.04.2013, 14:22
quelle

1 Antwort

22

Hier gibt es einige Indikationen. Folge mir vorsichtig.

Das shelve -Modul wird über das anydbm -Modul implementiert. Dieses Modul fungiert als Fassade für 4 verschiedene spezifische DBM-Implementierungen und wählt das erste verfügbare Modul beim Erstellen einer neuen Datenbank in der folgenden Reihenfolge aus:

  1. dbhash (veraltet, aber immer noch die erste Option anydbm ). Dies ist ein Proxy für das Modul bsddb , .open() ist wirklich bsddb.hashopen()
  2. gdbm , Python-Modul für die GNU DBM-Bibliothek, bietet mehr Funktionalität als das dbm -Modul Angebot, wenn es mit dieser gleichen Bibliothek verwendet wird.
  3. dbm , ein Proxy-Modul, das entweder die Bibliotheken ndbm , BSD DB und GNU DBM verwendet (ausgewählt wenn Python kompiliert wird).
  4. dumbdbm , eine reine Python-Implementierung.

Es ist dieser Auswahlbereich, der shelve -Dateien dazu bringt, zusätzliche Erweiterungen auf verschiedenen Plattformen zu erstellen.

Das Modul dumbdbm fügt die Erweiterungen .bak , .dat und .dir hinzu:

  

Öffnen Sie eine dumbdbm-Datenbank und geben Sie ein dumbdbm-Objekt zurück. Das Argument filename ist der Basisname der Datenbankdatei (ohne spezifische Erweiterungen). Wenn eine dumbdbm-Datenbank erstellt wird, werden Dateien mit den Erweiterungen .dat und .dir erstellt.

Die .dir -Datei wird nach .bak verschoben, da neue Index-Dicts für Änderungen an den Datenstrukturen festgeschrieben werden.

Dies bedeutet, dass die anderen drei Optionen für anydbm auf Ihrer Plattform nicht verfügbar sind.

Die anderen Formate können Ihnen andere Erweiterungen geben. Das Modul dbm kann .dir , .pag oder .db verwenden, abhängig davon, welche Bibliothek für dieses Modul verwendet wurde.

    
Martijn Pieters 26.04.2013, 07:45
quelle

Tags und Links