2016-05-04 6 views
0

Ich habe einige Daten übrig, wenn ich ein Element in einem Regal lösche. Ich versuchte mit pop, del und clear, aber das Ergebnis ist das gleiche. Die verbleibenden Daten befinden sich in der Datei mit der Datendatei. Auch nach der Verwendung der Methode clear ist die Größe der Dat-Datei nicht 0Ko.Was ist der sauberste Weg, Daten in einem Regal zu entfernen?

Das ist, was ich habe versucht:

import shelve 
test = shelve.open('test') 
test['a']=1 
#test.pop('a') 
#del test['a'] 
#test.clear() 
test.close() 

Gibt es eine Möglichkeit, um vollständig eine Daten eines shelve zu entfernen?

+0

Öffnen Sie das Regal als Datei und rufen Sie '.truncate()'? –

+0

@WayneWerner Das stimmt, dass ich die Datei problemlos mit 'truncate' säubern kann. Aber wenn ich nur eine eindeutige Daten vollständig und richtig entfernen möchte, wird das schwieriger. – Morgan

Antwort

0

Das Entfernen aller Daten im Regal unterscheidet sich von dem Entfernen aller Daten in der Datei.

Offenbar erstellt shelve eine Datenbankdatei, die (zumindest für mich) etwa 13k groß ist und keine Daten enthält. Versuchen Sie folgendes:

import os 
import shelve 

with shelve.open('fnord') as db: 
    db['color'] = 'blue, no yelloowwwww!' 
    print(list(db.keys())) 

print(os.stat('fnord').st_size) 

with shelve.open('fnord') as db: 
    db.clear() 
    print(list(db.keys())) 

print(os.stat('fnord').st_size) 

Sie werden sehen, dass Ihr Regal keine Schlüssel hat, aber es hat immer noch Größe. Wenn Sie Ihre Datei mit einem Hex-Editor bearbeiten, werden Sie sehen, dass es viele Daten gibt, aber wahrscheinlich hat dies etwas mit dem Datenbankdateiformat zu tun.

+0

Ich habe es versucht und das Problem ist das gleiche. Ich verstehe, dass die Dateigröße nie 0k ist, aber die Sache, die ich nicht verstehe, ist, warum die Größe der Datei immer noch wächst, wenn ich dein Skript ausführe? Das sollte nicht immer fast 13k sein? – Morgan

0

Sie können Objekt aus dem Regal von del d[key] löschen, es ist der richtige Weg. Wenn Sie jedoch alle Objekte in Ihrem Bereich löschen, bedeutet dies, dass ein leeres Diktat vorhanden ist. So enthält Ihre Shelve-Datei in Essig eingelegtes leeres dict in diesem Grund sile Größe ist nicht 0.

Verwandte Themen