[Tutor] Shelve: remove dictionary from list

Timo timomlists at gmail.com
Wed Mar 4 17:47:59 CET 2009


Kent Johnson schreef:
> On Tue, Mar 3, 2009 at 12:18 PM, Timo <timomlists at gmail.com> wrote:
>   
>> Hello all, I'm using the Shelve module to store dictionaries in a list as a
>> value of a key.
>>
>> So:
>>
>> key = [{'keyA' : 1, 'keyB' : 2}, {'key1' : 1, 'key2' : 2}]
>>
>> The problem is I can't remove a dictionary from the list.
>>
>>
>> import shelve
>>
>> s = shelve.open('file')
>> try:
>>   for index, value in enumerate(s['key']):
>>       if value['keyA'] == 1 and value['keyB'] == 2:
>>           del value[index]
>> finally:
>>   s.close()
>>
>>
>> If I do some printing in between, I can see the dictionary actually gets
>> removed, but doesn't get saved. Any ideas why?
>>     
>
> From the shelve docs:
> By default, mutations to persistent-dictionary mutable entries are not
> automatically written back. If the optional writeback parameter is set
> to True, all entries accessed are cached in memory, and written back
> at close time; this can make it handier to mutate mutable entries in
> the persistent dictionary, but, if many entries are accessed, it can
> consume vast amounts of memory for the cache, and it can make the
> close operation very slow since all accessed entries are written back
> (there is no way to determine which accessed entries are mutable, nor
> which ones were actually mutated).
>
> In other words, by default, shelve does not know about changes you
> make to mutable values. You can either
> - open the shelve with writeback=True
> - explicitly store the modified value back into the shelve:
>   key = s['key']
>   # modify key
>   s['key'] = key
>   s.close()
>
> Kent
>   
Sorry, I should have known this myself since I do this to append data to 
it. Stupid mistake. Don't know why I didn't do this when deleting data.


More information about the Tutor mailing list