2013-04-23 11 views
8

Sto eseguendo un programma Python che utilizza il modulo shelve su pickle. Dopo aver eseguito questo programma a volte ottengo un file di output come a.data ma altre volte ottengo tre file di output come a.data.bak, a.data.dir e a.data.dat.Perché il modulo shelve in python talvolta crea file con estensioni diverse?

Perché è quello?

+0

Probabilmente è il programma che lo fa. Il modulo [shelve] (http://hg.python.org/cpython/file/e0c0bcd60033/Lib/shelve.py) non fa nulla del genere. – mata

+3

'" Come effetto collaterale, un'estensione può essere aggiunta al nome del file e più di un file può essere creato. "' [(C)] (http://docs.python.org/2/library/shelve. html # shelve.open) Questo non risponde _why_, però. –

risposta

22

C'è un po 'di indirezione qui. Seguimi attentamente.

Il modulo shelve è implementato su anydbm module. Questo modulo agisce come una facciata per 4 diverse implementazioni DBM specifici, e si riprenderà il primo modulo disponibile quando si crea un nuovo database, nel seguente ordine:

  1. dbhash (deprecato, ma ancora la prima scelta anydbm). Questo è un proxy per il bsddb module, .open() è davvero bsddb.hashopen()
  2. gdbm, modulo Python per la libreria GNU DBM, che offre più funzionalità rispetto al modulo dbm può offrire quando viene utilizzato con la stessa lbrary.
  3. dbm, un modulo proxy che utilizza le librerie ndbm, BSD DB e GNU DBM (scelto quando Python è compilato).
  4. dumbdbm, un'implementazione pure-python.

È questa gamma di scelte che fa apparire i file shelve estensioni extra su piattaforme diverse.

Il modulo dumbdbm è quella che aggiunge le .bak, .dat e .dir estensioni:

Aprire un database dumbdbm e restituisce un oggetto dumbdbm. L'argomento nomefile è il nome di base del file di database (senza estensioni specifiche). Quando viene creato un database dumbdbm, vengono creati i file con estensioni .dat e .dir.

Il file .dir viene spostato a .bak come nuovi dicts indice sono impegnati per le modifiche apportate alle strutture di dati.

significa che il altre tre opzioni per anydbm non sono disponibili sulla vostra piattaforma.

Gli altri formati potrebbero fornire altre estensioni. Il modulo dbm può utilizzare .dir, .pag o .db, a seconda della libreria utilizzata per quel modulo.

+0

Grazie per la risposta. solo un'altra cosa Sai come posso forzare il mio programma a usare dumbdbm non altri moduli per i database? –

+3

Crea due file vuoti con le estensioni '.dir' e' .dat' se non esistono ancora, dopo di che 'anydbm' assumerà che ci sia già un database' dumbdbm' e utilizzi il modulo 'dumbdbm'. –