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()    
Другие вопросы по тегам