2017-12-11 3 views
-1

Pythonでpicklesを使ってレジストラシステムを作成しようとしています。私はユーザ入力を記録するシステムを持っていますが、プログラムの将来の実装のためにそれを保存しません。ここでPython picklesがデータを格納していません

は、プログラムを起動するコードです:

import datetime 
import pandas as pd 
import pickle as pck 
import pathlib 
from pathlib import * 
from registrar import * 

prompt = "Please select an option: \n 1 Create a new course \n 2 Schedule a new course offering \n 3 List this school's course catalogue \n 4 List this school's course schedule \n 5 Hire an instructor \n 6 Assign an instructor to a course \n 7 Enroll a student \n 8 Register a student for a course \n 9 List this school's enrolled students \n 10 List the students that are registered for a course \n 11 Submit a student's grade \n 12 Get student records \n 13 Exit" 

farewell = "Thank you for using the Universal University Registrar System. Goodbye!" 

print ("Welcome to the Universal University Registration System.") 

print ("\n") 

try: #As long as CTRL-C has not been pressed, or 13 not been input by user. 

    input_invalid = True 
    while input_invalid: 
    inst = input("Please enter the name of your institution. ").strip() 
    domain = input("Please enter the domain. ").strip().lower() 
    if inst == "" or domain == "": 
     print("Your entry is invalid. Try again.") 
    else: 
     input_invalid = False 

    schoolie = Institution(inst, domain) 

    if Path(inst + '.pkl').exists() == False: 
    with open(inst + '.pkl', 'r+b') as iptschool: 
     schoolie = pck.load(iptschool) 

    while True: 
    print (prompt) 
    user_input = input("Please enter your choice: ") 
    try: 
     user_input = int(user_input) 
     if user_input < 1 or user_input > 14: #UserInput 14: on prompt. 
     raise ValueError("Please enter a number between 1 and 13, as indicated in the menu.") 
    except ValueError: 
     print("Not a valid number. Please try again.") 

    if user_input == 1: #Create a new course 
     input_invalid2 = True #Ensure that the user actually provides the input. 
     while input_invalid2: 
     input_name = input("Please enter a course name: ").strip() 
     input_department = input("Please enter the course's department: ").strip() 
     input_number = input("Please enter the course's number (just the number, not the departmental prefix): ").strip() 
     try: 
      input_number = int(input_number) 
     except ValueError: 
      print ("Please print an integer. Try again.") 
     input_credits = input("Please enter the number of credits awarded for passing this course. Please use an integer: ").strip() 
     try: 
      input_credits = int(input_credits) 
     except ValueError: 
      print ("Please print an integer. Try again.") 

     if input_name != "" and input_department != "" and input_number and input_credits: 
      input_invalid2 = False #Valid input 
     else: 
      print("One or more of your entries is invalid. Try again.") 

     added_course = Course(input_name, input_department, input_number, input_credits) 
     for course in schoolie.course_catalog: 
     if course.department == input_department and course.number == input_number and course.name == input_name: 
      print("That course is already in the system. Try again.") 
      input_invalid2 == True 
     if input_invalid2 == False: 
     schoolie.add_course(added_course) 
     print ("You have added course %s %s: %s, worth %d credits."%(input_department,input_number,input_name, input_credits)) 

そして、ここでは、それが保存され、それがないされていることを明らかにすべきである第二の選択肢です。

elif user_input == 2: #Schedule a course offering 
     input_invalid2 = True #Ensure that the user actually provides the input. 
     while input_invalid2: 
     input_department = input("Please input the course's department: ").strip() 
     input_number = input("Please input the course's number: ").strip() 
     course = None 
     courseFound = False 
     for c in schoolie.course_catalog: 
      if c.department == input_department and c.number == input_number: #Course found in records 
      courseFound = True 
      course = c 
      input_section_number = input("Please enter a section number for this course offering: ").strip() 
      input_instructor = input("If you would like, please enter an instructor for this course offering: ").strip() 
      input_year = input("Please enter a year for this course offering: ").strip() 
      input_quarter = input("Please enter the quarter in which this course offering will be held - either SPRING, SUMMER, FALL, or WINTER: ").strip().upper() 
      if input_course != "" and input_course in schoolie.course_catalog and input_section_number.isdigit() and input_year.isdigit() and input_quarter in ['SPRING', 'SUMMER', 'FALL', 'WINTER'] and input_credits.isdigit(): 
       if input_instructor != "": #Instructor to be added later, if user chooses option 6. 
       added_course_offering = CourseOffering(c, input_section_number, None, input_year, input_quarter) 
       else: 
       added_course_offering = CourseOffering(c, input_section_number, input_instructor, input_year, input_quarter) 
       schoolie.add_course_offering(added_course_offering) 
       input_invalid2 = False #Valid input 
       print ("You have added course %s, Section %d: %s, worth %d credits."%(input_course,input_section_number,input_name, input_credits)) 
      else: 
       print("One or more of your entries is invalid. Try again.") 
     if courseFound == False: #If course has not been found at the end of the loop: 
      print("The course is not in our system. Please create it before you add an offering.") 
      break 

ところで、私はシステムが適切に閉じていると思います。私が間違っている場合私を訂正してください:

elif user_input == 13: #Exit 
     with open(inst + '.pkl', 'wb') as output: 
     pck.dump(schoolie, output, pck.HIGHEST_PROTOCOL) 
     del schoolie 
     print (farewell) 
     sys.exit() 

except KeyboardInterrupt: #user pushes Ctrl-C to end the program 
    print(farewell) 

私はピクルスファイルを設定している方法に何か問題があると思います。私はそれらを作成していますが、私はそれらにデータを入れていないようです。

この質問の長年の性質についてお詫び申し上げますが、詳細が私が抱えていた問題の理解に役立つことを願っています。助けを前にありがとう!

+0

(ドキュメントから)? pickleファイルにデータを保存することは、おそらく正しい方法ではありません。代わりに、CSVファイルまたはSQLiteを使用することができます。 –

+1

そのコードの大部分は、あなたの 'pickle'問題とは無関係です(そして長い行全てで読むのは難しいです)。あなたのコードがちょうど酸洗いの問題に焦点を当てた[mcve]だったらもっと良いでしょう。しかし、私はいくつかの奇妙なことに気付きました。たとえば、.pklファイルが 'if Path(inst + '.pkl')。exists()== False:'で存在しないかどうかをテストします。 –

+0

観測に感謝します。私はファイルが存在しない場合、プログラムはそれを作成する必要があると書いていました。行がありません。 –

答えて

0

あなたがダンプとロードを逆に持っているようだ。正確に何をしようとする

Signature: pck.load(file, *, fix_imports=True, encoding='ASCII', errors='strict') 
Docstring: 
Read and return an object from the pickle data stored in a file. 

Signature: pck.dump(obj, file, protocol=None, *, fix_imports=True) 
Docstring: 
Write a pickled representation of obj to the open file object file. 
関連する問題