EOFerror в откреплении словаря Python из пустого файла pickle
Очень начинающий программист, извините, если это глупо или мой английский неверен. Итак, у меня есть адресная книга командной строки, которую я пишу. Он состоит из словаря, который содержит объект с ключом в качестве имени переменной, и каждый объект имеет переменные, связанные с ним, такие как имя человека, адрес электронной почты и т. Д. Это работает, но сейчас я пытаюсь сделать он постоянно хранит словарь в памяти, используя pickle.
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
Я не понимаю этого. Я на самом деле уже написал эту программу, и она работала с сохранением памяти, но я случайно удалил ее. Что происходит?
2 ответа
pickle
ударять EOF
уверен, что файл поврежден (возможно, усечен, возможно, операция записи завершилась неудачно).
Если вы загрузите его куда-нибудь, мы сможем определить, что именно с ним не так. В худшем случае вам придется заглянуть внутрь и вывести данные, которые были там, чтобы повторно ввести их вручную.
Это ваша цена за использование нечитаемого формата и не обращая внимания на его целостность (например, запись в другой файл и только перемещение его поверх исходного после успешного сохранения).
ОБНОВИТЬ:
Если вы хотите начать с нового, "пустого" файла, то обработайте случай, когда файл отсутствует, и создайте пустой dict
, В конце концов, файл должен изначально отсутствовать, не так ли?
Пустой файл недействителен pickle
данные (должны как минимум содержать информацию о типе объекта).
Вот "один очевидный способ" ((c) Python Zen) обработать отсутствующий файл:
import errno
try: f = open(DATA, "rb")
except IOError,e:
if e[0]==errno.ENOENT: persons={}
else: raise
else:
persons = pickle.load(f)
f.close()
del f
Я не вижу ничего явно неправильного в вашем коде, но если вы просто хотите хранить пары ключ / значение, как это, вы, вероятно, должны использовать модуль shelve вместо домашнего решения.
import shelve
persons = shelve.open(DATA)
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: ")
persons[name] = Person(name, email, phone, address)
while more_people:
create_person()
persons.close()