2016-05-04 2 views
0

У меня есть некоторые данные, оставшиеся, когда я удаляю элемент в полке. Я пробовал с pop, del и clear, но результат тот же. Остальные данные находятся в файле с расширением dat. Таким образом, даже после использования метода очистить размер файла данных не 0Ko.Каков самый чистый способ удаления данных в полке?

Вот что я судимый:

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

Есть ли способ, чтобы полностью удалить данные о в полке?

+0

Откройте полку в виде файла и вызовите '.truncate()'? –

+0

@WayneWerner Это правда, что я могу легко полностью очистить файл с помощью 'truncate'. Но если я просто хочу полностью и правильно удалить одну уникальную информацию, которая будет сложнее. – Morgan

ответ

0

Удаление всех данных в полке отличается от удаления всех данных в файле.

Очевидно, что полка создает файл базы данных, который (по крайней мере для меня) составляет около 13 тыс. Без данных. Попробуйте следующее:

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) 

Вы увидите, что у вашей полки нет ключей, но у нее все еще есть размер. Если вы отредактируете файл с шестнадцатеричным редактором, вы увидите, что есть много данных, но оно, вероятно, имеет какое-то отношение к формату файла базы данных.

+0

Я пробовал, и проблема такая же. Я понял, что размер файла никогда не будет 0k, но я не понимаю, почему размер файла все еще растет при каждом выполнении вашего скрипта? Это не должно быть почти 13k? – Morgan

0

Вы можете удалить объект с полки на del d[key], это правильный путь. Но когда вы удаляете все объекты в вашем полке, это означает, что есть пустой dict. Таким образом, ваш файл в полке содержит маринованный пустой диктофон по этой причине размер ячейки не равен 0.

Смежные вопросы