Skip to main content
 首页 » 编程设计

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

2025年05月04日10softidea

首先,我知道this post这说明我必须重写整个文件,以便我从 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),而是删除了除最后一个条目之外的所有条目。有谁能帮我指出我的代码有什么问题吗?

请您参考如下方法:

您可以使用一个字典存储用户和密码,只需从该字典中删除“user-to-delete”。

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)