如何在Python中动态分配pickle名称?

时间:2013-02-17 16:44:46

标签: python pickle

我有一个循环,我想腌制所有输出。问题是我无法将变量指定为pickle名称。我可以用这个小例子说清楚:

lst = [a,d,e,g,h,j]
for i in lst:
    pickle.dump(i,open('xx.p','wb'))

正如我之前所说,我想为列表中的每个i指定不同的名称。换句话说,我想将我的变量值指定为pickle名称。 ('a.p' - >表示第一个,'d.p' - >表示第二个,依此类推)。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以通过检查变量的名称来查找变量的名称。在这里你有两个探索这个想法的功能,一个用于酸洗,一个用于去除。

你需要将环境传递给pickling函数,以便找出变量名称,创建一个将名称映射到变量的字典,并最终挑选包含变量及其名称的字典。

unpickling函数将使用文件中的未修改变量更新传递给它的环境(通常是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)