2017-04-19 80 views
1

我一直在试图让这本词典在Python中工作,但我失败了。我在SO上找到了一些类似的解决方案,但我无法让它们工作。我很确定它与我调用函数的方式有关。我已经尝试将每件作品放入一个单独的功能中,但失败了。我仍然得到以下错误信息:Python EOFError:Ran输入错误信息

employee_dictionary = pickle.load(file)

EOFError: Ran out of input

这里是我的代码:

import pickle 
import os.path 

def main(): 
    employee_dictionary = {} 

    if os.path.exists("employee.dat"): 
     file = open("employee.dat","rb") 
     employee_dictionary = pickle.load(file) 
     file.close() 

    else: 
     emp1 = Employee("Susan Myers", 47899, "Accounting", "Vice President") 
     emp2 = Employee("Mark Jones", 39119, "IT", "Programmer") 
     emp3 = Employee("Joy Rogers", 81774, "Manufacturing", "Engineer") 

     employee_dictionary = {emp1.get_ID_number(): emp1.get_name()+ '' + emp1.get_dept()+ '' + emp1.get_job_title(),\ 
           emp2.get_ID_number(): emp2.get_name()+ '' + emp2.get_dept()+ '' + emp2.get_job_title(),\ 
           emp3.get_ID_number(): emp3.get_name()+ '' + emp3.get_dept()+ '' + emp3.get_job_title()} 

     return employee_dictionary 

employee_dictionary = main() 

choice = 'y' 
while choice.upper()== 'Y': 
    print("Make a selection from the following actions:") 
    print("Lookup an employee in the dictionary: 1") 
    print("Add a new employee to the dictionary: 2") 
    print("Change an existing employee's name, department, and job title in the dictionary: 3") 
    print("Delete an employee from the dictionary: 4") 
    print("Quit the program: 5") 
    selection = input("Make your selection: ") 

    if int(selection) == 1: 
     id_number = input("What is the employee's ID number?") 

     if int(id_number) in employee_dictionary.keys(): 
      print(employee_dictionary[int(id_number)]) 

     else: 
      print("The employee does not exist.") 

    else: 
     if int(selection) == 2: 
      id_number = input("What is the employee's ID number?") 

      if int(id_number) in employee_dictionary.keys(): 
       print('That employee already exists.') 

      else: 
       name = input("Enter the name of the employee:") 
       dept = input("Enter the department of the employee:") 
       title = input("Enter the job title of the employee:") 
       emp4 = Employee(name,int(id_number), dept, title) 
       employee_dictionary[emp4.get_ID_number()]= emp1.get_name()+ '' + emp4.get_dept()+ '' + emp4.get_job_title() 

       print("The employee was added.") 

     else: 
      if int(selection) == 3: 
       id_number = input("What is the employee's ID number?") 

       if int(id_number) in employee_dictionary.keys(): 
        name = input("Enter the name of the employee:") 
        dept = input("Enter the department of the employee:") 
        title = input("Enter the job title of the employee:") 
        emp4 = Employee(name,int(id_number), dept, title) 
        employee_dictionary[emp4.get_ID_number()]= emp1.get_name()+ '' + emp4.get_dept()+ '' + emp4.get_job_title() 

        print("The employee record has been updated.") 

       else: 
        print("Record not found.") 

      else: 
       if int(selection) == 4: 
        id_number = input("What is the employee's ID number?") 
        print("Deleted: ", employee_dictionary.pop(int(id_number),"Record not found.")) 

       else: 
        if int(selection)!=5: 
         print("") 

choice = input("Do you want to make another selection (y or n)?") 
file = open('employee.dat','wb') 
pickle.dump(employee_dictionary,file) 
file.close() 

原来这里是Employee类:

class Employee: 
    def __init__(self, name, ID_number, dept, job_title): 
     self.__name = name 
     self.__ID_number = ID_number 
     self.__dept = dept 
     self.__job_title = job_title 

    #set methods 
    def set_name(self,name): 
     self.__name = name 
    def set_ID_number(self,ID_number): 
     self.__ID_number = ID_number 
    def set_dept(self,dept): 
     self.__dept = dept 
    def set_job_title(self,job_title): 
     self.__job_title = job_title 


    #get methods  
    def get_name(self): 
     return self.__name 
    def get_ID_number(self): 
     return self.__ID_number 
    def get_dept(self): 
     return self.__dept 
    def get_job_title(self): 
     return self.__job_title 

def main(): 

    emp1 = Employee("Susan Myers", 47899, "Accounting", "Vice President") 
    emp2 = Employee("Mark Jones", 39119, "IT", "Programmer") 
    emp3 = Employee("Joy Rogers", 81774, "Manufacturing", "Engineer") 

    #A bunch of print statements go here 

main() 
+0

目录中是否有一个空的'employee.dat' ?.假设较早的运行崩溃并留下一个空文件。您下次遇到此错误。所以,它的部分问题是你想如何处理一个损坏的.dat文件。你可以捕获异常,删除文件,然后在else子句中执行。您需要为此重构您的代码。 – tdelaney

+0

'file = open('employee.dat','wb')'有点危险。假设转储中出现问题,并且您收到空的或损坏的文件?您可以将其保存为不同的名称,并在知道已关闭时覆盖旧的.dat。 – tdelaney

+0

问题不在于您的代码*本身*,而是与文件中的数据有关。该文件是否因最初被腌渍而被修改或损坏?您使用的是与原始文件版本相同的Python版本吗?默认字符编码(您正在使用的)与最初腌制文件的编码是否相同?如果没有确认这个事实(即文件是腐败/不完整的),原始的泡菜操作是否会中途失败? – Travis

回答

0

对于未来的用户。我想出了一个解决方案。这是我得到的:

import os.path 
import pickle 

class Employee: 
    def __init__(self, name, ID_number, dept, job_title): 
     self.__name = name 
     self.__ID_number = ID_number 
     self.__dept = dept 
     self.__job_title = job_title 

    #set methods 
    def set_name(self,name): 
     self.__name = name 
    def set_ID_number(self,ID_number): 
     self.__ID_number = ID_number 
    def set_dept(self,dept): 
     self.__dept = dept 
    def set_job_title(self,job_title): 
     self.__job_title = job_title 


    #get methods  
    def get_name(self): 
     return self.__name 
    def get_ID_number(self): 
     return self.__ID_number 
    def get_dept(self): 
     return self.__dept 
    def get_job_title(self): 
     return self.__job_title 

def main(): 
    employee_dictionary = {} 

    if os.path.exists("employee.dat"): 
     file = open("employee.dat","rb") 
     employee_dictionary = pickle.load(file) 
     file.close() 

    else: 
     emp1 = Employee("Susan Myers", 47899, " Accounting", " Vice President") 
     emp2 = Employee("Mark Jones", 39119, " IT", " Programmer") 
     emp3 = Employee("Joy Rogers", 81774, " Manufacturing", " Engineer") 

     employee_dictionary = {emp1.get_ID_number(): emp1.get_name()+ ',' + emp1.get_dept()+ ',' + emp1.get_job_title(),\ 
           emp2.get_ID_number(): emp2.get_name()+ ',' + emp2.get_dept()+ ',' + emp2.get_job_title(),\ 
           emp3.get_ID_number(): emp3.get_name()+ ',' + emp3.get_dept()+ ',' + emp3.get_job_title()} 

     return employee_dictionary 

employee_dictionary = main() 

choice = 'y' 
while choice.upper()== 'Y': 
    print("Make a selection from the following actions:") 
    print("Lookup an employee in the dictionary: 1") 
    print("Add a new employee to the dictionary: 2") 
    print("Change an existing employee's name, department, and job title in the dictionary: 3") 
    print("Delete an employee from the dictionary: 4") 
    print("Quit the program: 5\n") 
    selection = input("Make your selection: ") 
    print("\n") 

    if int(selection) == 1: 
     id_number = input("What is the employee's ID number?") 

     if int(id_number) in employee_dictionary.keys(): 
      print("\nThe employee is:",employee_dictionary[int(id_number)],"\n") 

     else: 
      print("\nThe employee does not exist.\n") 

    else: 
     if int(selection) == 2: 
      id_number = input("What is the employee's ID number?") 

      if int(id_number) in employee_dictionary.keys(): 
       print('That employee already exists.\n') 

      else: 
       name = input("Enter the name of the employee:") 
       dept = input("Enter the department of the employee:") 
       title = input("Enter the job title of the employee:") 
       emp4 = Employee(name,int(id_number), dept, title) 
       employee_dictionary[emp4.get_ID_number()]= emp4.get_name()+ ', ' + emp4.get_dept()+ ', ' + emp4.get_job_title() 

       print("\nThe employee was added.\n") 

     else: 
      if int(selection) == 3: 
       id_number = input("What is the employee's ID number?") 

       if int(id_number) in employee_dictionary.keys(): 
        name = input("Enter the name of the employee:") 
        dept = input("Enter the department of the employee:") 
        title = input("Enter the job title of the employee:") 
        emp4 = Employee(name,int(id_number), dept, title) 
        employee_dictionary[emp4.get_ID_number()]= emp4.get_name()+ ', ' + emp4.get_dept()+ ', ' + emp4.get_job_title() 

        print("\nThe employee record has been updated.\n") 

       else: 
        print("\nRecord not found.\n") 

      else: 
       if int(selection) == 4: 
        id_number = input("What is the employee's ID number?") 
        print("\nDeleted: ", employee_dictionary.pop(int(id_number),"Record not found.")) 
        print("\n") 

       else: 
        if int(selection)!=5: 
         print("") 
        break 

choice = input("Do you want to make another selection (y or n)?") 
file = open('employee.dat','wb') 
pickle.dump(employee_dictionary,file) 
file.close()