我正在尝试查找泡菜字典,但我得到了,找不到搜索主要是因为即使我使用pickle保存文件,也看不到硬盘“ employee.dat”文件。我的问题是由于某种原因,我也无法修改和保存信息。我尝试使用不同的方式,但我放弃了,并决定寻求帮助。我的指示是:
创建一个将Employee对象存储在字典中的程序。使用员工ID号作为密钥。该程序应显示一个菜单,让用户执行以下操作:
我的班级在一个单独的python文件上,名称为
emp.py
class Employee():
def __init__(self, name, number, department, job):
self.name = name
self.number = number
self.department = department
self.job = job
def set_name(self, name):
self.name = name
def set_number(self, number):
self.number = number
def set_department (self, department):
self.department = department
def set_job (self, job):
self.job = job
def get_name(self):
return self.name
def get_number(self):
return self.number
def get_department(self):
return self.department
def get_job(self):
return self.job
def __str__(self):
return "Name: " +self.name+ "\nID Number "+self.number+"\nDepartment "+self.department+"\nJob "+self.job
Program.py
import emp
import pickle
def main():
emp_dic = load_emp()
menu()
choice = int(input('Enter choice: '))
while choice!=5:
if choice == 1:
lookup(emp_dic)
elif choice == 2:
add_(emp_dic)
elif choice == 3:
change(emp_dic)
elif choice ==4:
dele_(emp_dic)
elif choice <= 0 or choice > 5:
print ('wrong selection')
elif choice == 5:
print ("quiting...")
print('')
print('')
menu()
choice = int(input('Enter choice: '))
save_emp(emp_dic)
def load_emp():
try:
load_dic = open('employee.dat' , 'rb')
emp_details = pickle.load(load_dic)
#load_dic.close()
except IOError:
emp_details = {}
return emp_details
def save_emp(emp_dic):
save_file = open('employee.dat','wb')
pickle.dump(emp_dic , save_file)
save_file.close()
def lookup(emp_dic):
search = input("Enter a search query: ")
search_result = emp_dic.get(search, "Entry not found")
print (search_result)
def add_(emp_dic):
again = ('y')
print("")
while again.lower() == 'y':
name_ = input("Enter an employee name: ")
number = input("Enter employee ID number: ")
depart = input("Enter Department: ")
job = input("Enter Job title: ")
if name_ not in emp_dic:
entry = emp.Employee (name_ ,number, depart, job)
#emp_dic[name_] = entry
with open("employee.dat", "wb") as infile:
print("")
pickle.dump(emp_dic, infile)
print("")
print("Name And Email Address Were Added Successfully")
print (name_, "has been successfully added", 1)
else:
print (name_, "already exists!")
again = input("Enter 'y' to continue or any key to quit: ")
def change(emp_dic):
search = input("Enter employee's name to change the details: ")
if search in emp_dic:
name_ = input("Enter new employee name: ")
number = int(input("Enter new employee ID number: "))
depart = input("Enter new Department: ")
job = input("Enter new Job title: ")
entry = emp.Employee (name_,number, depart, job)
emp_dic[name_] = entry
print (name_, "has been successfully updated")
else:
print ("Entry not found")
def delete_ (emp_dic):
search = input("Enter employee's to change details: ")
if search in emp_dic:
del emp_dic[search]
print (search, " has been deleted successfully: ")
else:
print ("Entry not found")
def menu():
print ('Yousef Saleh')
print ('Employee Management System')
print ('----------------------------')
print ("1)Look-up Employee Details ")
print ('2)Add new Employee Details ')
print ('3)Change an existing Employee Details ')
print ('4)Delete an Employee Details ')
print ('5)Quit the program ')
print ('----------------------------')
main()
两个重大问题和其他一些问题
add_()函数
您已注释了这一行,它将向dict添加新条目,如果不创建任何条目,请取消注释。
更改数字=输入(“输入员工ID号:”)至number = int(input(“输入员工ID号:”))
emp.py:更改
return "Name: " +self.name+ "\nID Number "+self.number+"\nDepartment "+self.department+"\nJob "+self.job
到类似的东西:
return "Name: " +self.name+ "\nID Number "+str(self.number)+"\nDepartment "+self.department+"\nJob "+self.job
或
return "Name: %s\nID Number %d\nDepartment %s\nJob %s" % (
self.name, self.number, self.department, self.job)
)
进一步建议的更改:main.py()
而不是:
menu()
choice = int(input('Enter choice: '))
while choice!=5:
...
menu()
choice = int(input('Enter choice: '))
执行类似操作:
choice = 0
while choice!=5:
print("currently %d entries in pickle file" % len(emp_dic))
menu()
choice = int(input('Enter choice: '))
...
我将为泡菜文件名使用一个全局变量,并在脚本开头声明它,然后将其余代码更改为不再直接使用该文件名。
PKL_FNAME = "employee.dat"
此外,我将更详细地说明将pickle文件存储在哪里,因为取决于您如何调用python脚本,当前的工作目录可能会不同。
例如,如果要使文件名始终与python脚本位于同一目录中,则可能需要执行类似的操作
PKL_FNAME = os.path.join(os.path.dirname(os.path.realpath(__file__)), "employee.dat")
不要忘记一个
import os
文件开头
也可以在add函数中,而不是直接调用pickle.dump,而是调用
save_emp(emp_dic)
或完全不腌制,如您的指示所述:
程序结束时,应该对字典进行腌制并将其保存到一个文件。
我还将更改load_emp()和save_emp()函数,如下所示:
def load_emp():
try:
with open(PKL_FNAME , 'rb') as fin:
emp_details = pickle.load(fin)
except IOError as exc:
print(exc)
emp_details = {}
return emp_details
def save_emp(emp_dic):
print(emp_dic)
with open(PKL_FNAME, 'wb') as fout:
pickle.dump(emp_dic , fout)
with语句可确保在所有情况下都关闭文件。