Очень новичок программист, извините, если это глупо или если мой английский неверен. Итак, у меня есть эта адресная книга в командной строке, которую я пишу. Он состоит из словаря, который содержит объект с ключом в качестве переменной имени, и каждый объект имеет связанные с ним переменные, такие как имя человека, адрес электронной почты и т. Д. Он работает, но теперь я пытаюсь сделать он сохраняет словарь постоянно в памяти с использованием рассола.EOFerror в непокрывающемся словаре Python из пустого файла соленья
def create_person():
"""Adds an instance object of the Person class to the dictionary persons. persons is a global variable, that has been created previously. DATA is a variable that points to a file named test.data that exists in the same directory as the script."""
name = raw_input("Enter the person's name here: ")
email = raw_input("Enter the person's email here: ")
phone = raw_input("Enter the person's phone here: ")
address = raw_input("Enter the person's address here: ")
f = open(DATA, "rb")
persons = pickle.load(f) #assign whatever is saved in the dictionary in persistent memory to global variable persons, which is empty at this point in the beginning
f.close()
persons[name] = Person(name, email, phone, address)
f = open(DATA, "wb")
pickle.dump(persons, f)
f.close()
Однако, я получаю эту ошибку:
Traceback (most recent call last):
File "testpickle.py", line 85, in <module>
main()
File "testpickle.py", line 40, in main
create_person()
File "testpickle.py", line 20, in create_person
persons = pickle.load(f)
File "/home/pedro/anaconda/lib/python2.7/pickle.py", line 1378, in load
return Unpickler(file).load()
File "/home/pedro/anaconda/lib/python2.7/pickle.py", line 858, in load
dispatch[key](self)
File "/home/pedro/anaconda/lib/python2.7/pickle.py", line 880, in load_eof
raise EOFError
EOFError
Я не понимаю этого. Я на самом деле уже написал эту программу, и она работала с сохранением памяти, но я случайно удалил ее. Что происходит?
Вы уверены, что определение класса 'Person' точно так же, как это было до аварии? Это одна из возможных причин. – martineau
Я настоятельно рекомендую вам не использовать 'pickle' практически для любых целей, потому что механизм очень хрупкий. Как ранний Pythoner, концепция интерфейса pickle была соблазнительной: «Я могу сохранить свои объекты и вернуть их без усилий». К сожалению, поскольку маринованные данные реализованы в виде программ для простой стековой машины, однобитовая ошибка разрушит все это. Ваш код выглядит правильно, но [тихие ошибки] (http://stackoverflow.com/questions/10263564/python-pickling-dictionary-eoferror) могут вторгнуться. Вместо этого используйте [sqlite3] (https://docs.python.org/2/library/sqlite3.html). – msw
@martineau Класс Person не совсем то же самое, но от него ничего не должно измениться. Все, что я сделал, это удалить одну из переменных (отношений). – chilliefiber