Okay so my question is pretty specific and I apologize in advance. I'm a new programmer and tried developing on my own from scratch. It was relatively successful only I have one last problem, that I can see. You can view my code here in its entirety.
So the problem I'm having is related to the way I save the file. I first tried to pickle it since it's a dictionary but I kept getting an error because my dictionary is
(name, class) pairs.
I searched around on here and saw I could try JSON to do the same. Ended up with the same kind of errors. Eventually I found the klepto module which worked. I saved my dictionary successfully and loaded it successfully. It wasn't until later I found that I can add new items to the file but whenever I remove something from my dict and save. The next time I load it. The key I removed is still there.
TLDR: Can add things just fine to my dict and save to txt file but when I remove from the dict and save it won't save the removed key.
Anyway I'm stumped on where my problem lies in the way I'm saving the file or the way I'm loading it or both? Any help would be very appreciated.
Edit: Ok I'm assuming it's the way I have it currently set to save and load.
try:
alcohols = file_archive('Alcohols.txt')
alcohols.load()
except IOError:
alcohols = {}
print('alcohols doesn\'t exist.')
and
print('Exiting and saving the data.')
alcohols.dump('Alcohols.txt') #saves the dictionary data as is
It saves the dictionary fine while adding new items but say I have to make an edit and remove something then save and exit. Next time loaded up it would have the old items as well as any new ones. Oddly enough I seem to have broken something in all my editing. Doesn't save new entries.
Edit2:
del alcohols[name] #deletes the key out of the dict
This is how I remove the keys. Originally I was using the pop method but when it wouldn't save the changes I tried this. As a note it DID remove they key, value from the dictionary but saving and reloading wouldn't reflect that change.
alcohols[name] = Alcohol() #instantiates the new class
Ths is how I am creating new key, value pairs.
SOLVED edit:
My problem was with the way I deleted them from the dictionary. In case anyone stumbles into here later. Look at @Mike Mckerns answer. Had to remove from the archived dictionary.
Basically, you are deleting from the "in-memory" cache, and not from the "file" cache. A
klepto
archive by default gives you "in-memory" cache, which you use directly through the dict interface, and it also gives you anarchive
which is the back-end.Thus, when you
dump
, you transfer the in-memory items to the back-end. To delete from the cache and from the archive, you have to delete from both.I guess I could make it easier to delete from both in a single function call...