Python从pickle保存的数据中删除条目

Python从pickle保存的数据中删除条目,python,io,pickle,Python,Io,Pickle,首先,我知道我必须重写整个文件的状态,以便从pickle保存的数据中删除1项 我有一个以二进制形式保存用户名和密码(密码的哈希值)的文件。它由以下代码创建: import pickle import hashlib def Encryption(data): return hashlib.sha224(data).hexdigest() db = {'user1' : Encryption('password1'), 'user2' : Encryption('password2')

首先,我知道我必须重写整个文件的状态,以便从pickle保存的数据中删除1项

我有一个以二进制形式保存用户名和密码(密码的哈希值)的文件。它由以下代码创建:

import pickle
import hashlib

def Encryption(data):
    return hashlib.sha224(data).hexdigest()

db = {'user1' : Encryption('password1'), 'user2' : Encryption('password2'), 'user3' : Encryption('password3')}
fh = open('database.db', 'wb')
pickle.dump(db, fh)
fh.close()
我想从文件中删除
user2,password2
(第二项)。这就是我所做的

import pickle
import hashlib
from os import path

n='user2'

def Encryption(data):
    return hashlib.sha224(data).hexdigest()

if path.isfile('database.db'):
    fh=open('database.db','rb')
    db=pickle.load(fh)
    fh.close()

_newlist,_newlist2=([] for i in range (2))    
_username=[]
_password=[]

#Get the user names and passwords hash values into two different list
for user in db:
    _username.append(user)
    _password.append(db[user])    

#If user name is equal to the user name i want to delete, skip . Else append it to new list
for i in range(len(_username)):
    if n==_username[i]:
        pass
    else:
        _newlist.append(_username[i])
        _newlist2.append(_password[i])

#Clear the file
fh=open('database.db','wb')
fh.close()

#Re-write the new lists to the file
for i in range(len(_newlist)):
    db={_newlist[i]:_newlist2[i]}
    fh = open('database.db', 'ab')
    pickle.dump(db,fh)

它不删除第二个条目(user2,password2),而是删除除最后一个条目以外的所有条目。有人能帮我指出代码中的错误吗?

您可以使用一个字典存储用户和密码,只需从该字典中删除“要删除的用户”

import pickle
from os import path

user_to_delete = 'user2'

# Open the database if it exists, otherwise create one...
if path.isfile('database.db'):
    with open('database.db','rb') as f:
        db = pickle.load(f)
else: # Create some database.db with users&passwords to test this program..
    db = {'user1':'password1', 'user2':'password2', 'user3':'password3'}
    with open('database.db', 'wb') as f:
        pickle.dump(db, f)

# try to delete the given user, handle if the user doesn't exist.
try:
    del db[user_to_delete]
except KeyError:
    print("{user} doesn't exist in db".format(user=user_to_delete))

# write the 'new' db to the file.
with open('database.db', 'wb') as f:
    pickle.dump(db, f)