2017-12-11 6 views
-1

Ich versuche ein Registrar-System durch Python mit Gurken zu erstellen. Ich habe das System dazu gebracht, Benutzereingaben aufzuzeichnen, aber es speichert es nicht für zukünftige Implementierungen des Programms.Python Pickles speichern keine Daten

Hier ist der Code, der das Programm starten:

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

Und hier ist die zweite Option, die zeigen soll, dass es gespeichert ist, aber es funktioniert nicht.

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 

Übrigens, ich denke, ich habe das System ordnungsgemäß schließen. Korrigieren Sie mich, wenn ich falsch:

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) 

Ich glaube, dass es etwas falsch mit der Art und Weise ist, dass ich die Gurken Dateien bin einrichten. Ich erstelle sie, aber ich scheine keine Daten in sie zu stecken.

Ich entschuldige mich für die langatmige Natur dieser Frage, aber ich hoffe, dass die Details Ihnen helfen werden, die Probleme zu verstehen, die ich gehabt habe. Vielen Dank im Voraus für die Hilfe!

+0

Was genau wollen Sie tun? Das Speichern von Daten in Pickle-Dateien ist wahrscheinlich nicht der richtige Ansatz. Möglicherweise möchten Sie stattdessen eine CSV-Datei oder SQLite verwenden. –

+1

Der größte Teil dieses Codes ist irrelevant für Ihr Problem mit "Gurke" (und es ist schwer, es mit allen langen Zeilen zu lesen). Es wäre besser, wenn Ihr Code ein [McVE] wäre, der sich nur auf das Beizproblem konzentriert. Allerdings habe ich einige seltsame Dinge bemerkt. ZB testen Sie, ob die .pkl-Datei nicht existiert mit 'if Path (inst + '.pkl'). Exists() == False:' aber dann versuchen Sie es trotzdem zu lesen! –

+0

Danke für die Beobachtung. Ich habe versucht zu schreiben, dass, wenn die Datei nicht existiert, sollte das Programm es erstellen. Da fehlt eine Zeile. –

Antwort

0

es scheint, Sie haben können Sicherungs- und umgekehrt: (von der Dokumentation)

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.