Pickle 转储多个变量并在另一个目录的另一个文件中读取它们

Pickle dump multiple variables and read them on aother file on another directory

如何转储多个 python 变量并将它们加载到另一个文件中?

我现在的代码:

EXP_load = pickle.load(open("data.dat", "rb"))
if EXP_load == "0":
    EXP = str("0")
    Kills = str("0")
    Items = str("0")
    pickle.dump(EXP, open("data.dat", "wb"))
    pickle.dump(Kills, open("data.dat", "wb"))
    pickle.dump(Items, open("data.dat", "wb"))

其他目录下的其他文件:

    EXP_load = pickle.load(open("data.dat", "rb"))
print("3[1;30;40m EXP: " + EXP_load +", Slain: " +", Items: "+ "3[0m")
import pickle
def saveLoad(opt):
    global calc
    if opt == "save":
        f = file(filename, 'wb')
        pickle.dump(calc, f, 2)
        f.close
        print 'data saved'
    elif opt == "load":
        f = file(filename, 'rb')
        calc = pickle.load(f)
    else:
        print 'Invalid saveLoad option'

如果您真的需要 very-very 几行代码中 save/load 多个变量的简单解决方案,那么您可以执行下一步:

# Save
with open('data.dat', 'wb') as f:
    pickle.dump((exp, kills, items), f)
# Load
with open('data.dat', 'rb') as f:
    exp, kills, items = pickle.load(f)

但是如果你想要一些花哨而漂亮的东西,那么我实施了下一个有点高级的解决方案:

Try it online!

def save(file_name, **nargs):
    import pickle, os
    if os.path.exists(file_name):
        with open(file_name, 'rb') as f:
            nargs = {**pickle.load(f), **nargs}
    with open(file_name, 'wb') as f:
        pickle.dump(nargs, f)

def load(file_name, *pargs, **nargs):
    import pickle, os
    d = {}
    if os.path.exists(file_name):
        with open(file_name, 'rb') as f:
            d = pickle.load(f)
    if len(pargs) + len(nargs) == 0:
        return d
    r = (
        tuple(d[k] for k in pargs) +
        tuple(d.get(k, defv) for k, defv in nargs.items())
    )
    return r if len(pargs) + len(nargs) != 1 else r[0]


    
# ----- Usage examples ------
        
# First script, saving things
# Save some things
exp, kills, items = 1, "three", [3, '4']
save('data.dat', exp = exp, kills = kills, items = items)
# Save one more thing later
mana = 456
save('data.dat', mana = mana)
# Maybe change/update some already saved things later
kills = "four"
save('data.dat', kills = kills)


# Second script, loading things
# Load some things
kills, items = load('data.dat', 'kills', 'items')
print('kills', kills, 'items', items)
# Load some other things later
mana, exp = load('data.dat', 'mana', 'exp')
print('mana', mana, 'exp', exp)
# Also possible to load just one thing
mana = load('data.dat', 'mana')
print('mana', mana)
# Also possible to provide default value for part of fields if they are missing
exp, energy, mana = load('data.dat', 'exp', energy = 'missing_energy', mana = 'missing_mana')
print('exp', exp, 'energy', energy, 'mana', mana)
# Load everything that was saved, if no extra params provided
all_saved = load('data.dat')
print('all_saved', all_saved)

输出:

kills four items [3, '4']
mana 456 exp 1
mana 456
exp 1 energy missing_energy mana 456
all_saved {'exp': 1, 'kills': 'four', 'items': [3, '4'], 'mana': 456}