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

1 投票
2 回答
2817 浏览
提问于 2025-04-17 16:10

我有一个循环,我想把所有的输出都保存起来。问题是我不能把我的变量当作保存文件的名字。让我用一个简单的例子来说明这个问题:

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

撰写回答