我有一个循环,我想腌制所有输出。问题是我无法将变量指定为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' - >表示第二个,依此类推)。
答案 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)