2013-06-27 26 views
6

Bir raf dosyası oluşturdum ve bir sözlük verisi ekledim. Şimdi temiz bir dosya olarak yeniden kullanmak için bu raf dosyasını temizlemeyi istiyorum.Python'da raf dosyasını nasıl boş yapabilirim?

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

Neden dosyayı silmiyorsunuz? –

+1

Not: dict = {"foo": "bar"} 'dict [" foo "] =" bar "' olmalıdır. Şimdi olduğu gibi, raf nesnesine veri eklemiyor - bunun yerine rafta değişiklik yapılmadan yeni bir sözlük nesnesine "dict" işaret ediyor. – george

cevap

9

Raf böylece sadece bir sözlük gibi davranır: Alternatif

dict.clear() 

, her zaman dosyayı kaldırmak ve yeni bir tane oluşturun rafa sağlayabilirsiniz.

+0

'Shelve' modülünün verdiğiniz dosya adına bir şeyler eklemesine izin verilir ve makinemde aslında bir çift dosya oluşturur.Sözlüğü temizlemek, hangi dosya veya dosyaların silineceği sorusundan uzaklaştıkça daha kolay görünüyor. – kuzzooroo

-1

Bu sizin aradığınız şey olduğunu düşünüyorum.

del dict["foo"] 
1

dict.clear() (Windows 7 64 bit Python 3.5.2) en kolay ve geçerli olmalıdır, ama aslında raf dosyaları temizlemez gibi görünüyor. Ben her zaman aynı boyutta olması beklenebilir Örneğin, raf .dat dosya boyutu, aşağıdaki kod parçasını çalıştırmayı her zaman büyür:

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

Güncelleme: shelve olarak kullandığıdbm.dumb, onun Windows altında veritabanını altında yatan, bu TODO öğeyi in its code içerir:

  • boş alanı yeniden (şu anda, uzay kez işgal Silinen veya genişletilmiş öğeleri tarafından bu büyüyen raf dosyası sorunu açıklar)

yeniden asla.


Yani yerine dict.clear()

, ben flag='n' ile shelve.open kullanıyorum. shelve.open() documentation alıntı:

isteğe bayrak parametresi dbm.open bayrak parametresi ile aynı yorumu vardır().

Ve dbm.open() documentation flag='n' için:

daima okuma için açık ve raf zaten açıksa

yazma yeni, boş bir veritabanı oluşturmak, kullanım olacaktır:

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

Bunların hiçbiri gerçekten işe yaramaz Ne yaptım bir func oluşturuyordu Dosya silme işlemek için.

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() 
İlgili konular