2013-06-27 18 views
6

Utworzono plik półki i wstawiłem dane słownikowe. Teraz chcę wyczyścić plik półki, aby ponownie użyć go jako czysty plik.Jak zrobić plik shelve pusty w python?

import shelve 
dict = shelve.open("Sample.db") 
# insert some data into sample.db 
dict = { "foo" : "bar"} 

#Now I want to clean entire shelve file to re-insert the data from begining. 
+0

Dlaczego po prostu nie usunąć pliku? –

+1

Zauważ, że 'dict = {" foo ":" bar "}' powinno być 'dict [" foo "] =" bar "'. Tak jak obecnie, nie wstawia danych do obiektu półki - zamiast tego wskazuje "dict" na nowy obiekt słownika, pozostawiając niezmienioną półkę. – george

Odpowiedz

9

półek zachowuje się jak słownik, a więc:

dict.clear() 

Alternatywnie, można zawsze usunąć plik i niech shelve utworzyć nową.

+0

Moduł 'shelve' może dodawać elementy do nazwy pliku, które mu podasz, a na moim komputerze faktycznie tworzy kilka plików.Czyszczenie słownika wydaje się łatwiejsze, ponieważ omija pytanie o plik lub pliki do usunięcia. – kuzzooroo

1

dict.clear() jest najprostszym i powinien być ważny, ale nie wydaje się rzeczywiście skasować pliki półki (Python 3.5.2, Windows 7 64-bit). Na przykład, rozmiar pliku półka .dat rośnie za każdym razem uruchomić poniższy fragment, a chciałbym oczekiwać, że zawsze mają ten sam rozmiar:

shelf = shelve.open('shelf') 
shelf.clear() 
shelf['0'] = list(range(10000)) 
shelf.close() 

Aktualizacja:dbm.dumb, który shelve wykorzystuje jako swój bazodanowym pod Windows, zawiera ten element TODO in its code:

  • odebrania wolnego miejsca (obecnie przestrzeń zajmowana raz przez usunięte lub rozwinięte elementy nigdy nie jest ponownie używane)

Wyjaśnia to stale rosnący problem z plikiem półek.


Więc zamiast dict.clear() używam shelve.open z flag='n'. Cytowanie shelve.open() documentation:

Opcjonalny parametr flagi ma taką samą interpretację jako flagi parametru dbm.open().

I dbm.open() documentation dla flag='n':

Zawsze utworzyć nową, pustą bazę danych, otwarty do odczytu i zapisu

Jeśli półka jest już otwarty, użycie byłoby:

shelf.close() 
shelf = shelve.open('shelf', flag='n') 
0

Żadna z tych naprawdę nie działała Co robiłem, to tworzenie funkcji do obsługi usuwania pliku.

import shelve 
import pyperclip 
import sys 
import os 

mcbShelf = shelve.open('mcb') 
command = sys.argv[1].lower() 

def remove_files(): 
    mcbShelf.close() 
    os.remove('mcb.dat') 
    os.remove('mcb.bak') 
    os.remove('mcb.dir') 

if command == 'save': 
    mcbShelf[sys.argv[2]] = pyperclip.paste() 
elif command == 'list': 
    pyperclip.copy(", ".join(mcbShelf.keys())) 
elif command == 'del': 
    remove_files() 
else: 
    pyperclip.copy(mcbShelf[sys.argv[1]]) 

mcbShelf.close()