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

时间:2015-02-28 12:14:05

标签: python command-line pickle

我有一个简单的小型电影注册应用,可让用户在注册表中注册新电影。这当前只使用腌制对象并保存对象不是问题,但是从文件中读取未知数量的腌制对象似乎有点复杂,因为在读取文件时我无法找到任何对象序列进行迭代。 / p>

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

由于数据量太低,我认为不需要使用比简单文件更精美的存储解决方案。

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

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)时,它只返回保存/添加到文件中的第一部电影。查看文件时,它确实包含添加到列表中的其他电影,但由于某些奇怪的原因,它们未包含在列表中。

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

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."

1 个答案:

答案 0 :(得分:1)

您可以通过在文件句柄对象上重复调用load来从文件中获取未知数量的pickle对象。

>>> 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()