2017-04-19 12 views
1

私はこの辞書をPythonで動作させようとしていますが、私は悲惨に失敗しました。私は同様のSOのいくつかのソリューションを見つけましたが、私はそれらを動作させることはできません。私はそれが関数を呼び出す方法と何か関係があると確信しています。私は個々の機能を別々の機能に入れてみましたが失敗しました。私はまだ、次のエラーメッセージを取得しています:ここで Python EOFError:入力エラーメッセージが出力されない

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() 

は、元従業員クラスです:将来のユーザーのために

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

employee_dictionary = pickle.load(file)

EOFError: Ran out of input

はここに私のコードです。私は解決策を見つけました。ここに私が持っているものがあります:

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() 
関連する問題