1

ループがあり、すべての出力をピクルしたいと思います。問題は、変数をピクル名として割り当てることができないことです。この小さな例でそれを明確にするかもしれません:

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

前に言ったように、リスト内のそれぞれiに異なる名前を割り当てたいと思います。つまり、変数の値を pickle 名として割り当てたいと考えています。('ap' -> 1 番目、'dp' -> 2 番目など)。

4

2 に答える 2

3

これは、 2つのリストを使用する場合に簡単に実行できます。1つはオブジェクト用で、もう1つはオブジェクトに名前を付けるためのものです。

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

変数が定義されている環境を調べると、変数の名前を見つけることができます。ここでは、このアイデアを探求する 2 つの関数を用意しています。

変数名を見つけ、名前を変数にマッピングするディクショナリを作成し、最終的に変数とその名前を含むディクショナリをピクルするために、環境をピクル関数に渡す必要があります。

locals()unpickling 関数は、ファイルから unpickle された変数を渡して環境 (通常は ) を更新します。

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 に答える