【问题标题】:Store many variables in a file在一个文件中存储许多变量
【发布时间】:2013-10-30 23:01:43
【问题描述】:

我正在尝试将许多变量存储在一个文件中。我尝试过 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)

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

【问题讨论】:

  • 这两种方法都不是这样。
  • 使用pickle,你dump一次一个对象到文件(例如,使用循环并反复调用dump)。然后,您可以一次 load 一个对象(例如在循环中)。
  • 是的,它们都存储一个值:文件的全部内容。所以存储一个字典。
  • pickle 的一种解决方法是将所有变量及其关联值存储在单个容器对象中——比如dict——然后保存那个东西。 shelve 的接口就像一个字典,因此每个变量都必须与其名称一起存储,例如myShelve['aasd'] = aasdmyShelve['basd'] = basd 等或myShelve.update({'aasd':aasd, 'basd':basd, etc})

标签: python python-3.x pickle shelve


【解决方案1】:

您一次只能腌制一个变量,但它可以是 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__

【讨论】:

    【解决方案2】:

    使用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])
    

    【讨论】:

      【解决方案3】:

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

      您可以保存一个包含变量定义的 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多