Python 3.3 Pickle Errors для чтения/записи

Я пытаюсь написать программу, которая отображает меню и позволяет пользователям писать в файл, читать из файла или выходить. Файл содержит объект списка, поэтому я использую файл.dat. Я прочитал документацию python и загрузил потоки "pickle error" на этом сайте, но, похоже, не понимаю, почему я получаю ошибки, которые получаю. Я бы хотел прозрения!

Ошибка для функции write_to_file :

integer is required

Насколько я могу судить, я использую правильную форму open, которая, казалось, давала другим пользователям проблему с этой ошибкой, и я не могу найти что-либо в документации Python о требуемом аргументе integer для pickle.dump (Кроме того, я уверен, что метод, который я использую, чтобы позволить пользователю вводить данные в файл, неверен, но я не смог пройти мимо ошибок рассола, предшествующих ему.)

def write_to_file():
 s = open('studentInfo.dat')
 pickle.dump(info, s, 'wb')
 shelve.open(s)
 print(s)
 print("You may now add information to the file:")
 input(s[''])
 s.close()

Ошибка для функции read_file :

io.UnsupportedOperation: write

У меня нет аргументов 'w' или 'wb' в этой функции, и я хочу, чтобы это было как действие только для чтения. Где скрывается ошибка записи?

def read_file():
 f = open('studentInfo.dat', 'rb')
 pickle.dump(info, f)
 shelve.open(f, 'rb')
 print("Here is the student information: \n")
 print(f)
 f.close()

Здесь полный код:

#import necessary modules:
import pickle, shelve

# create list object
info = [[("student", "John"),("GPA","4.0"), ("ID", "01234")],
 [("student", "Harry"),("GPA","3.2"), ("ID", "03456")],
 [("student", "Melissa"),("GPA","1.8"), ("ID", "05678")],
 [("student", "Mary"),("GPA","3.5"), ("ID", "07899")]]

#Function Definitions
def write_to_file():
 s = open('studentInfo.dat')
 pickle.dump(info, s, 'wb')
 shelve.open(s)
 print(s)
 print("You may now add information to the file:")
 input(s[''])
 s.close()

def read_file():
 f = open('studentInfo.dat', 'rb')
 pickle.dump(info, f)
 shelve.open(f, 'rb')
 print("Here is the student information: \n")
 print(f)
 f.close()

#def main(): #while loop as program engine, constantly prompt user, display menu, etc.

menu = ("\n0 - Exit the Program", #Exit
 "\n1 - Add student information", #Write to file
 "\n2 - Print student information") #Read file

print(menu)
menuchoice = int(input("Please enter a number that matches the menu option you want: "))
##writetofile = open("studentInfo.dat", "wb")
##printinfo = open("studentInfo.dat", "rb")

if menuchoice == 0:
 input("\nPress the 'enter' key to exit the program.")
elif menuchoice == 1:
 print("You may add a student, gpa, or student ID to the file")
 write_to_file()
elif menuchoice == 2:
 read_file()
1 ответ

Вам необходимо передать параметр режима вызову open(), а не pickle.dump():

s = open('studentInfo.dat', 'wb')
pickle.dump(info, s)

Чтобы загрузить из открытого файла, используйте pickle.load():

f = open('studentInfo.dat', 'rb')
info = pickle.load(f)

Вам не нужен модуль shelve и звонки здесь вообще. Удалите их.

Вы, вероятно, захотите использовать файлы в качестве контекстных менеджеров здесь, автоматически закрывая их:

with open('studentInfo.dat', 'wb') as outputfile:
 pickle.dump(info, outputfile)

а также

with open('studentInfo.dat', 'rb') as inputfile:
 info = pickle.load(inputfile)

Вы не можете добавить только добавить неструктурированную дополнительную информацию в файл после открытия; добавьте новую информацию в info прежде чем травить info в файл:

def write_to_file():
 # take input and add that to 'info' here.
 # gather a name, GPA and ID into 'new_name', 'new_gpa' and 'new_id'
 info.append([("student", new_name),("GPA", new_gpa), ("ID", new_id)])

 with open('studentInfo.dat', 'wb') as outputfile:
 pickle.dump(info, outputfile)

Ваша read_file() должна, вероятно, возвращать прочитанную информацию, или вы должны сделать info явным global:

def read_file():
 with open('studentInfo.dat', 'rb') as inputfile:
 info = pickle.load(inputfile)
 return info

Вернувшись из функции, вы можете затем присвоить ее info или распечатать ее:

read_info = read_file()
print("Here is the student information: \n")
print(read_info)

licensed under cc by-sa 3.0 with attribution.