在 python 中加载未知数量的腌制对象

Loading an unknown amount of pickled objects in python

我有一个小而简单的电影注册应用程序,可以让用户在注册表中注册一部新电影。这目前仅使用腌制对象并保存对象不是问题,但从文件中读取未知数量的腌制对象似乎有点复杂,因为我在读取文件时找不到要迭代的任何对象序列。

有没有办法从 python 中的文件中读取未知数量的 pickled 对象(读入未知数量的变量,最好是列表)?

由于数据量如此之低,我认为没有必要使用比简单文件更花哨的存储解决方案。

当尝试使用带有此代码的列表时:

film = Film(title, description, length)
film_list.append(film)
open_file = open(file, "ab")
try:
  save_movies = pickle.dump(film_list, open_file)
except pickle.PickleError:
  print "Error: Could not save film to file."

它工作正常,当我加载它时,我得到一个返回的列表,但无论我注册了多少部电影,我仍然只得到列表中的一个元素。当键入 len(film_list) 时,它只会 returns 文件中 saved/added 的第一部电影。查看该文件时,它确实包含已添加到列表中的其他电影,但由于某些奇怪的原因它们未包含在列表中。

我正在使用此代码加载电影:

open_file = open(file, "rb")
try:
  film_list = pickle.load(open_file)
  print type(film_list) # displays a type of list
  print len(film_list) # displays that only 1 element is in the list
  for film in film_list: # only prints out one list item
    print film.name
except pickle.PickleError:
  print "Error: Unable to load one or more movies."

您可以通过对文件句柄对象重复调用 load 从文件中获取未知数量的已腌制对象。

>>> import string
>>> # make a sequence of stuff to pickle          
>>> stuff = string.ascii_letters
>>> # iterate over the sequence, pickling one object at a time
>>> import pickle
>>> with open('foo.pkl', 'wb') as f:
...     for thing in stuff:
...         pickle.dump(thing, f)
... 
>>> 
>>> things = []
>>> f = open('foo.pkl', 'rb')
>>> # load the first two objects
>>> things.append(pickle.load(f))
>>> things.append(pickle.load(f))
>>> # get the remaining pickled items
>>> while True:
...     try:          
...         things.append(pickle.load(f))
...     except EOFError:
...         break
... 
>>> stuff 
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> things
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
>>> f.close()