2013-04-23 16 views
8

Używam programu w języku Python, który korzysta z modułu shelve na szczycie pickle. Po uruchomieniu tego programu czasami otrzymuję jeden plik wyjściowy jako a.data, ale w innych przypadkach otrzymuję trzy pliki wyjściowe jako a.data.bak, a.data.dir i a.data.dat.Dlaczego moduł półki w Pythonie czasami tworzy pliki o różnych rozszerzeniach?

Dlaczego tak jest?

+0

To prawdopodobnie program robiący to. Sam moduł [shelve] (http://hg.python.org/cpython/file/e0c0bcd60033/Lib/shelve.py) niczego takiego nie robi. – mata

+3

'" Jako efekt uboczny, rozszerzenie może zostać dodane do nazwy pliku i może zostać utworzony więcej niż jeden plik. "' [(C)] (http://docs.python.org/2/library/shelve. html # shelve.open) To nie odpowiada _why_, chociaż. –

Odpowiedz

22

Jest tu trochę niedowidzenia. Obserwuj mnie uważnie.

Moduł shelve jest implementowany na wierzchu anydbm module. Moduł ten działa jako fasady dla 4 różnych konkretnych implementacji DBM i będzie odebrać pierwszy moduł dostępne podczas tworzenia nowej bazy danych, w następującej kolejności:

  1. dbhash (przestarzałe ale nadal pierwszą anydbm wyboru). Jest to proxy dla bsddb module, .open() jest naprawdę bsddb.hashopen()
  2. gdbm, moduł Pythona dla biblioteki GNU DBM, oferując więcej funkcji niż moduł dbm może zaoferować w przypadku korzystania z tego samego lbrary.
  3. dbm, moduł proxy używający bibliotek ndbm, BSD DB i GNU DBM (wybieranych podczas kompilowania Pythona).
  4. dumbdbm, implementacja czystego Pythona.

Jest to zakres wyborów sprawia, że ​​shelve pliki wydają się rosnąć dodatkowych rozszerzeń na różnych platformach.

Moduł dumbdbm jest ten, który dodaje .bak, .dat i .dir rozszerzeń:

Otwarta baza dumbdbm i zwraca obiekt dumbdbm. Argument filename jest nazwą bazową pliku bazy danych (bez żadnych konkretnych rozszerzeń). Po utworzeniu bazy danych dumbdbm tworzone są pliki z rozszerzeniami .dat i .dir.

Plik .dir została przeniesiona do .bak jako nowe dicts indeksowe są zobowiązani do zmian dokonanych w strukturach danych.

Oznacza to, że inne trzy opcje anydbm nie są dostępne na platformie.

Inne formaty mogą dawać inne rozszerzenia. Moduł dbm może używać .dir, .pag lub .db, w zależności od tego, jaka biblioteka była używana dla tego modułu.

+0

Dziękuję za odpowiedź. jeszcze jedna rzecz. Czy wiesz, jak zmusić mój program do używania dumbdbm, a nie innych modułów do baz danych? –

+3

Utwórz dwa puste pliki z rozszerzeniami '.dir' i' .dat', jeśli jeszcze nie istnieją, po czym 'anydbm' założy, że istnieje już baza' dumbdbm' i używa modułu 'dumbdbm'. –

Powiązane problemy