我有一个循环,我想腌制所有输出。问题是我不能将我的变量分配为泡菜名称。我可能会用这个小例子说清楚:
lst = [a,d,e,g,h,j]
for i in lst:
pickle.dump(i,open('xx.p','wb'))
正如我之前所说,我想为i
列表中的每个分配不同的名称。换句话说,我想将我的变量值分配为泡菜名称。('ap' -> 第一个,'dp' -> 第二个,依此类推)。
如果您使用两个列表,一个用于您的对象,一个用于您想要命名的列表,您可以轻松地做到这一点:
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
)
您可以通过检查定义变量的环境来找到变量的名称。在这里,您有两个函数来探索这个想法,一个用于酸洗,一个用于解酸。
您需要将环境传递给酸洗函数以找出变量名称,创建一个将名称映射到变量的字典,并最终酸洗包含变量及其名称的字典。
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)