1

我有一个循环,我想腌制所有输出。问题是我不能将我的变量分配为泡菜名称。我可能会用这个小例子说清楚:

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

正如我之前所说,我想为i列表中的每个分配不同的名称。换句话说,我想将我的变量值分配为泡菜名称。('ap' -> 第一个,'dp' -> 第二个,依此类推)。

4

2 回答 2

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

于 2013-02-17T17:48:38.990 回答
1

您可以通过检查定义变量的环境来找到变量的名称。在这里,您有两个函数来探索这个想法,一个用于酸洗,一个用于解酸。

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

locals()unpickling 函数将使用文件中的 unpickled 变量更新您传递给它的环境(通常)。

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)
于 2013-02-17T17:54:49.510 回答