0

我正在尝试将许多变量存储在一个文件中。我尝试过 JSON、pickle 和 shelve,但它们似乎都只接受一个变量

import shelve
myShelve = shelve.open('my.shelve')
myShelve.update(aasd,
    basd,
    casd,
    dasd,
    easd,
    fasd,
    gasd,
    hasd,
    iasd,
    jasd)
myShelve.close()

还有泡菜

import pickle
with open("vars.txt", "wb") as File:
    pickle.dumps(aasd,
        basd,
        casd,
        dasd,
        easd,
        fasd,
        gasd,
        hasd,
        iasd,
        jasd,
        File)

我得到的错误是

TypeError: update() takes at most 2 positional arguments (11 given)

TypeError: pickle.dumps() takes at most 2 positional argument (11 given)

我不确定除了使用数据库之外是否还有其他存储变量的方法,但这有点超出了我目前的能力。

4

3 回答 3

0

您一次只能腌制一个变量,但它可以是一个dict或其他 Python 对象。您可以将许多变量存储在一个对象中并腌制该对象。

import pickle

class Box:
    pass

vars = Box()

vars.x = 1
vars.y = 2
vars.z = 3

with open("save_vars.pickle", "wb") as f:
    f.write(pickle.dumps(vars))

with open("save_vars.pickle", "rb") as f:
    v = pickle.load(f)

assert vars.__dict__ == v.__dict__
于 2013-10-30T23:25:31.143 回答
0

使用pickle,您一次转储一个对象。每次转储到文件时,都会添加另一个“记录”。

import pickle
with open("vars.txt", "wb") as File:
    for item in (aasd,
                 basd,
                 casd,
                 dasd,
                 easd,
                 fasd,
                 gasd,
                 hasd,
                 iasd,
                 jasd)
    pickle.dump(item,File)

现在,当您想要取回数据时,您可以pickle.load从文件中读取下一个“记录”:

import pickle
with open('vars.txt') as fin:
   aasd = pickle.load(fin)
   basd = pickle.load(fin)
   ...

或者,根据数据的类型,假设数据是json能够序列化的东西,您可以将其存储在 json 列表中:

import json
# dump to a string, but you could use json.dump to dump it to a file.
json.dumps([aasd,
            basd,
            casd,
            dasd,
            easd,
            fasd,
            gasd,
            hasd,
            iasd,
            jasd])
于 2013-10-30T23:09:00.010 回答
0

编辑:我只是想到了一种不同的方式来存储你的变量,但这有点奇怪,我想知道大师们对此有何看法。

您可以保存一个文件,其中包含变量定义的 python 代码,例如vars.py,它由定义您的值的简单语句组成:

x = 30
y = [1,2,3]

然后将其加载到您的程序中,只需执行此操作from vars import *,您将拥有xy定义它们,就像您输入它们一样。


下面的原始正常答案...

有一种方法可以使用 JSON 来取回您的变量,而无需重新定义它们的名称,但您必须首先创建一个变量字典。

import json

vars={}  # the dictionary we will save.

LoL = [ range(5), list("ABCDE"), range(5) ]
vars['LOList'] = LoL
vars['x'] = 24
vars['y'] = "abc"

with open('Jfile.txt','w') as myfile:
    json.dump(vars,myfile,indent=2)

现在将它们加载回来:

with open('Jfile.txt','r') as infile:
    D = json.load(infile)

    # The "trick" to get the variables in as x,y,etc:
    globals().update(D)

现在 x 和 y 是从它们的字典条目中定义的:

print x,y
24 abc

还有一种使用逐个变量定义的替代方法。这样,您不必预先创建字典,但是当您重新加载变量时,必须以正确的顺序重新命名变量。

z=26
w="def"

with open('Jfile2.txt','w') as myfile:
    json.dump([z,w],myfile,indent=2)

with open('Jfile2.txt','r') as infile:
    zz,ww = json.load(infile)

和输出:

print zz,ww
26 def
于 2013-10-31T00:48:02.620 回答