Сохранение и загрузка объектов и использование рассола

Я пытаюсь сохранить и загрузить объекты, используя модуль pickle .
Сначала я объявляю свои объекты:

 >>> class Fruits:pass ... >>> banana = Fruits() >>> banana.color = 'yellow' >>> banana.value = 30 

После этого я открываю файл под названием «Fruits.obj» (ранее я создал новый .txt-файл, и я переименовал «Fruits.obj»):

 >>> import pickle >>> filehandler = open(b"Fruits.obj","wb") >>> pickle.dump(banana,filehandler) 

После этого я закрываю сеанс, и я начал новый, и я поставил следующий (попытка доступа к объекту, который он должен был сохранить):

 file = open("Fruits.obj",'r') object_file = pickle.load(file) 

Но у меня есть это сообщение:

 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python31\lib\pickle.py", line 1365, in load encoding=encoding, errors=errors).load() ValueError: read() from the underlying stream did notreturn bytes 

Я не знаю, что делать, потому что я не понимаю этого сообщения. Кто-нибудь знает, как я могу загрузить свой объект «банан»? Спасибо!

РЕДАКТИРОВАТЬ: Как некоторые из вас заговорили, я поставил:

 >>> import pickle >>> file = open("Fruits.obj",'rb') 

Не было никаких проблем, но следующий вопрос:

 >>> object_file = pickle.load(file) 

И у меня ошибка:

 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python31\lib\pickle.py", line 1365, in load encoding=encoding, errors=errors).load() EOFError 

6 Solutions collect form web for “Сохранение и загрузка объектов и использование рассола”

Что касается вашей второй проблемы:

  Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python31\lib\pickle.py", line 1365, in load encoding=encoding, errors=errors).load() EOFError 

После того, как вы прочтете содержимое файла, указатель файла будет в конце файла – дальнейших данных для чтения не будет. Вы должны перемотать файл так, чтобы он был снова прочитан:

 file.seek(0) 

Обычно вы хотите использовать диспетчер контекстов, чтобы открыть файл и прочитать данные из него. Таким образом, файл будет автоматически закрыт после завершения завершения блока, что также поможет организовать ваши файловые операции в значимые фрагменты.

Наконец, cPickle является более быстрой реализацией модуля рассола в C. Итак:

 In [1]: import cPickle In [2]: d = {"a": 1, "b": 2} In [4]: with open(r"someobject.pickle", "wb") as output_file: ...: cPickle.dump(d, output_file) ...: # pickle_file will be closed at this point, preventing your from accessing it any further In [5]: with open(r"someobject.pickle", "rb") as input_file: ...: e = cPickle.load(input_file) ...: In [7]: print e ------> print(e) {'a': 1, 'b': 2} 

Для меня работает следующее:

 class Fruits: pass banana = Fruits() banana.color = 'yellow' banana.value = 30 import pickle filehandler = open("Fruits.obj","wb") pickle.dump(banana,filehandler) filehandler.close() file = open("Fruits.obj",'rb') object_file = pickle.load(file) file.close() print(object_file.color, object_file.value, sep=', ') # yellow, 30 

Всегда открывать в двоичном режиме, в этом случае

 file = open("Fruits.obj",'rb') 

Вы тоже забыли прочитать его как двоичный.

В вашей части записи у вас есть:

 open(b"Fruits.obj","wb") # Note the wb part (Write Binary) 

В прочитанной части у вас есть:

 file = open("Fruits.obj",'r') # Note the r part, there should be ab too 

Поэтому замените его на:

 file = open("Fruits.obj",'rb') 

И это сработает 🙂


Что касается вашей второй ошибки, это, скорее всего, причина, не закрывая / синхронизируя файл должным образом.

Попробуйте этот бит кода для написания:

 >>> import pickle >>> filehandler = open(b"Fruits.obj","wb") >>> pickle.dump(banana,filehandler) >>> filehandler.close() 

И это (без изменений) читать:

 >>> import pickle >>> file = open("Fruits.obj",'rb') >>> object_file = pickle.load(file) 

В более быстрой версии будет использоваться оператор with .

Для записи:

 >>> import pickle >>> with open('Fruits.obj', 'wb') as fp: >>> pickle.dump(banana, fp) 

Для чтения:

 >>> import pickle >>> with open('Fruits.obj', 'rb') as fp: >>> banana = pickle.load(fp) 

Вы не открыли файл в двоичном режиме.

 open("Fruits.obj",'rb') 

Должно сработать.

Для вашей второй ошибки файл, скорее всего, пустой, что означает, что вы случайно опорожнили его или использовали неправильное имя файла или что-то в этом роде.

(Предполагается, что вы действительно закрыли сеанс. Если нет, то это потому, что вы не закрыли файл между записью и чтением).

Я тестировал ваш код, и он работает.

Кажется, вы хотите сохранить свои экземпляры класса во время сеансов, а использование pickle – достойный способ сделать это. Тем не менее, есть пакет под названием klepto который абстрагирует сохранение объектов на интерфейс словаря, поэтому вы можете выбрать сортировку объектов и сохранить их в файл (как показано ниже) или рассортировать объекты и сохранять их в базе данных, или вместо этого использования pickle использовать json или многие другие варианты. Хорошая вещь о klepto заключается в том, что, абстрагируясь с общим интерфейсом, это упрощает, поэтому вам не нужно запоминать детали низкого уровня о том, как сэкономить путем травления в файл или иначе.

Обратите внимание, что он работает для динамически добавленных атрибутов класса, которые мариновать не могут …

 dude@hilbert>$ python Python 2.7.6 (default, Nov 12 2013, 13:26:39) [GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from klepto.archives import file_archive >>> db = file_archive('fruits.txt') >>> class Fruits: pass ... >>> banana = Fruits() >>> banana.color = 'yellow' >>> banana.value = 30 >>> >>> db['banana'] = banana >>> db.dump() >>> 

Затем мы перезапускаем …

 dude@hilbert>$ python Python 2.7.6 (default, Nov 12 2013, 13:26:39) [GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from klepto.archives import file_archive >>> db = file_archive('fruits.txt') >>> db.load() >>> >>> db['banana'].color 'yellow' >>> 

Klepto работает на python2 и python3.

Получить код здесь: https://github.com/uqfoundation

  • Как реплицировать C # 'byte' и 'Write' в Python
  • Объект BeautifulSoup не рассохнет, вызывает интерпретатор для бесшумного сбоя
  • Как сократить время, затрачиваемое на загрузку файла pickle в python
  • Рассортировать динамически параметризованный подкласс
  • Можно ли мариновать объект cookiejar?
  • python pickle дает «AttributeError: объект« str »не имеет атрибута« писать »»
  • Как получить unpickling для работы с iPython?
  • Почему генераторы не могут мариноваться?
  • Python - лучший язык программирования в мире.