如何在Python中动态分配pickle名称?
我有一个循环,我想把所有的输出都保存起来。问题是我不能把我的变量当作保存文件的名字。让我用一个简单的例子来说明这个问题:
lst = [a,d,e,g,h,j]
for i in lst:
pickle.dump(i,open('xx.p','wb'))
正如我之前提到的,我想给我列表中的每个 i
赋予不同的名字。换句话说,我想把我的变量的值当作保存文件的名字。比如说,'a.p' 是第一个,'d.p' 是第二个,依此类推。
2 个回答
1
你可以通过查看变量定义的环境来找到变量的名字。这里有两个函数来探讨这个想法,一个是用来“打包”的,另一个是用来“解包”的。
你需要把环境传递给打包函数,这样才能找到变量的名字,创建一个字典,把名字和变量对应起来,最后把这个包含变量及其名字的字典打包起来。
解包函数会用你传给它的环境(通常是 locals()
)来更新,从你的文件中解包出变量。
import pickle
def pickle_vars(fileName, env, *vs):
d = dict([(x, env[x]) for v in vs for x in env if v is env[x]])
with open(fileName, 'wb') as f:
pickle.dump(d, f)
def unpickle_vars(fileName, env):
with open(fileName, 'rb') as f:
d = pickle.load(f)
env.update(d)
def f():
x = 10
y = 20
pickle_vars('vars', locals(), x, y)
f()
unpickle_vars('vars', globals())
print x,y
这里有一个修改过的函数,可以把每个变量打包到一个单独的文件中,文件名就是变量的名字,后面加上 .p
的扩展名:
def pickle_vars(fileName, env, *vs):
d = [(x, env[x]) for v in vs for x in env if v is env[x]]
for name, var in d:
with open(name + '.p', 'wb') as f:
pickle.dump(var, f)
3
如果你用两个列表来做这件事会很简单,一个列表用来存放你的对象,另一个列表用来存放你想给它们起的名字:
lst = [a,d,e,g,h,j]
nm_lst = ['a', 'b', 'd', 'e', 'h', 'j']
for i,nm in zip(lst,nm_lst):
pickle.dump(i,open('{0}.p'.format(nm),'wb'))
或者你也可以用字典来实现这个功能(这是评论里提到的建议)
my_dict = {'a':a, 'b':b}
for key, val in my_dict.iteritems():
pickle.dump(val,open('{0}.p'.format(key),'wb'))
(如果你使用的是python3,iteritems
要换成items
)