【问题标题】:Save/Load a Dictionary保存/加载字典
【发布时间】:2021-02-05 00:49:54
【问题描述】:

我发现其他几个人在这方面寻求帮助,但不是具体我想要做什么。我有一本包含各种格式(int、str、bool 等)的字典,我正在尝试保存它,以便以后加载它。这是代码的基本版本,没有与此无关的所有额外陷阱。

petStats = { 'name':"", 'int':1, 'bool':False }

def petSave(pet):
    with open(pet['name']+".txt", "w+") as file:
        for k,v in pet.items():
            file.write(str(k) + ':' + str(v) + "\n")

def digimonLoad(petName):
    dStat = {}
    with open(petName+".txt", "r") as file:
        for line in file:
            (key, val) = line.split(":")
            dStat[str(key)] = val
    print(petName,"found. Loading",petName+".")
    return dStat

简而言之,我只是通过在每行上保存一个带有 Key:Value 的文本文件来强制它,然后在加载时将它们全部拆分。不幸的是,这将我所有的 int 和 bool 都变成了字符串。有没有我可以用来保存字典的文件格式(我不需要能够阅读它,但方便会很好)我​​可以很容易地重新加载?

这适用于基本字典,但如果我开始添加诸如数组之类的东西,这将失控。

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    使用pickle。这是标准库的一部分,因此您可以直接导入它。

    import pickle
    
    pet_stats = {'name':"", 'int':1, 'bool':False}
    
    def pet_save(pet):
        with open(pet['name'] + '.pickle', 'wb') as f:
            pickle.dump(pet, f, pickle.HIGHEST_PROTOCOL)
    
    def digimon_load(pet_name):
        with open(pet_name + '.pickle', 'rb') as f:
            return pickle.load(f)
    

    Pickle 可以处理比 JSON 更多的数据类型,并自动将它们加载为正确的 Python 类型。 (有一些方法可以使用 JSON 保存更多类型,但它需要更多工作。)如果您需要输出是人类可读的,或者需要与非 Python 程序共享,那么 JSON(或 XML)会更好,但两者都不会出现对于您的用例是必要的。泡菜是最简单的。

    如果您需要查看文件中的内容,只需使用 Python 加载它或

    python -m pickle foo.pickle
    

    而不是文本编辑器。 (仅对来自您信任的来源的文件进行腌制,pickle 根本无法抵御黑客攻击。)

    【讨论】:

      【解决方案2】:

      使用模块json

      import json
      
      def save_pet(pet):
          filename = <Whatever filename you want>
          with open(filename, 'w') as f:
              f.write(json.dumps(pet))
      
      def load_pet(filename):
          with open(filename) as f:
              pet = json.loads(f.read())
          return pet
      

      【讨论】:

      • 如果字典的内容可以转换成json的话很好的解决方案,但这不适用于其他无法转换为json的python对象。
      【解决方案3】:

      问:我可以使用一种文件格式来保存字典以重新加载吗?

      A:是的,有很多。立即想到 XML 和 JSON。

      例如:

      jsonfile.txt

       {
        "brand": "Ford",
        "model": "Mustang",
        "year": 1964
      }
      

      这是一个将文件读入字典的示例:

      import json
      
      with open('data.txt','r') as json_file:
         data = json.load(json_file)
      

      ...以及将字典写入 JSON 的示例:

      import json
      with open('data.txt','w') as fp:
          fp.write(json.dumps(data))
      

      如果你更喜欢 XML,还有很多库,包括xmltodict

      import xmltodict
      
      with open('path/to/file.xml') as fd:
          doc = xmltodict.parse(fd.read())
      

      【讨论】:

        【解决方案4】:

        有两个有用的词你可能还不知道:序列化和泡菜。

        序列化是指将数据结构(如您的字典)转换为可写入存储的字节流,然后从存储中检索以重新创建该数据结构的过程。这是一项常见的任务,您的直觉是正确的:尝试自己完成这一切很快就会失控。

        Pickle 是实现序列化的标准 python 模块。它易于使用、成熟并适用于大量 Python 数据类型。你可以在这里阅读更多关于泡菜的信息:https://docs.python.org/3/library/pickle.html

        【讨论】:

        • 它实际上并不适用于所有 Python 数据类型。尝试腌制一个 lambda。见what can be pickled and unpickled
        • 谢谢@gilch。我已经编辑了我的评论。匆忙阅读 pickle vs json 文档是我的错。
        猜你喜欢
        • 2020-02-26
        • 2016-08-15
        • 1970-01-01
        • 2021-05-12
        • 2013-02-27
        • 1970-01-01
        • 1970-01-01
        • 2016-09-25
        • 1970-01-01
        相关资源
        最近更新 更多