无法查找,更改并保存到泡菜词典

问题描述 投票:-1回答:1

我正在尝试查找泡菜字典,但我得到了,找不到搜索主要是因为即使我使用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()
python
1个回答
0
投票

两个重大问题和其他一些问题

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语句可确保在所有情况下都关闭文件。

© www.soinside.com 2019 - 2024. All rights reserved.