我有一个游戏玩家服务,创造他们和其他东西的一类。
我需要在一个文件中保存这些球员后来的对象使用它。 我已经试过了泡菜模块,但我不知道如何保存多个对象,并再次加载它们? 有没有办法做到这一点,或者我应该使用其他类,如列表和保存和载入我的对象列表中?
有没有更好的办法?
我有一个游戏玩家服务,创造他们和其他东西的一类。
我需要在一个文件中保存这些球员后来的对象使用它。 我已经试过了泡菜模块,但我不知道如何保存多个对象,并再次加载它们? 有没有办法做到这一点,或者我应该使用其他类,如列表和保存和载入我的对象列表中?
有没有更好的办法?
使用列表,元组,或者字典是迄今为止做到这一点的最常见方式:
import pickle
PIK = "pickle.dat"
data = ["A", "b", "C", "d"]
with open(PIK, "wb") as f:
pickle.dump(data, f)
with open(PIK, "rb") as f:
print pickle.load(f)
这版画:
['A', 'b', 'C', 'd']
然而,咸菜文件可以包含任意数量的咸菜。 这里是产生相同的输出码。 但是请注意,这是很难写出和理解:
with open(PIK, "wb") as f:
pickle.dump(len(data), f)
for value in data:
pickle.dump(value, f)
data2 = []
with open(PIK, "rb") as f:
for _ in range(pickle.load(f)):
data2.append(pickle.load(f))
print data2
如果你这样做,你就有责任了解很多泡菜你怎么写出来的文件中。 上面的代码做的是通过酸洗列表的对象的数目的第一。
两个补充添彼得斯接受的答案 。
首先 ,你不需要保存,如果你停止加载当你到了文件的末尾您单独腌制的项目数:
def loadall(filename):
with open(filename, "rb") as f:
while True:
try:
yield pickle.load(f)
except EOFError:
break
items = loadall(myfilename)
这是假设该文件只包含咸菜; 如果有什么在那里一样,发电机将尝试把其他任何在那里泡菜过,这可能是危险的。
其次 ,这样一来,你没有得到一个列表,而是一个发电机 。 这将在同一时间,这是有用的,如果转储数据是非常大的负荷只有一个项目到内存 - 一个可能的原因,你可能想在第一时间分别腌制多个项目。 您还可以遍历items
用for
循环,好像它是一个列表。
试试这个:
import pickle
file = open('test.pkl','wb')
obj_1 = ['test_1', {'ability', 'mobility'}]
obj_2 = ['test_2', {'ability', 'mobility'}]
obj_3 = ['test_3', {'ability', 'mobility'}]
pickle.dump(obj_1, file)
pickle.dump(obj_2, file)
pickle.dump(obj_3, file)
file.close()
file = open('test.pkl', 'rb')
obj_1 = pickle.load(file)
obj_2 = pickle.load(file)
obj_3 = pickle.load(file)
print(obj_1)
print(obj_2)
print(obj_3)
file.close()
我将使用给出一个面向对象的演示pickle
保存和恢复一个或多个object
:
class Worker(object):
def __init__(self, name, addr):
self.name = name
self.addr = addr
def __str__(self):
string = u'[<Worker> name:%s addr:%s]' %(self.name, self.addr)
return string
# output one item
with open('testfile.bin', 'wb') as f:
w1 = Worker('tom1', 'China')
pickle.dump(w1, f)
# input one item
with open('testfile.bin', 'rb') as f:
w1_restore = pickle.load(f)
print 'item: %s' %w1_restore
# output multi items
with open('testfile.bin', 'wb') as f:
w1 = Worker('tom2', 'China')
w2 = Worker('tom3', 'China')
pickle.dump([w1, w2], f)
# input multi items
with open('testfile.bin', 'rb') as f:
w_list = pickle.load(f)
for w in w_list:
print 'item-list: %s' %w
输出:
item: [<Worker> name:tom1 addr:China]
item-list: [<Worker> name:tom2 addr:China]
item-list: [<Worker> name:tom3 addr:China]
如果你使用它很容易klepto
,它给你透明地存储在文件或数据库对象的能力。 它使用一个字典的API,并允许您dump
和/或load
从(在下面的情况下,序列化对象存储在目录中名为每个文件一个条目存档的特定条目scores
)。
>>> import klepto
>>> scores = klepto.archives.dir_archive('scores', serialized=True)
>>> scores['Guido'] = 69
>>> scores['Fernando'] = 42
>>> scores['Polly'] = 101
>>> scores.dump()
>>> # access the archive, and load only one
>>> results = klepto.archives.dir_archive('scores', serialized=True)
>>> results.load('Polly')
>>> results
dir_archive('scores', {'Polly': 101}, cached=True)
>>> results['Polly']
101
>>> # load all the scores
>>> results.load()
>>> results['Guido']
69
>>>