【问题标题】:How to save a dictionary to a file?如何将字典保存到文件中?
【发布时间】:2013-10-12 15:16:27
【问题描述】:

我在更改 dict 值并将 dict 保存到文本文件时遇到问题(格式必须相同),我只想更改 member_phone 字段。

我的文本文件格式如下:

memberID:member_name:member_email:member_phone

然后我将文本文件拆分为:

mdict={}
for line in file:
    x=line.split(':')
    a=x[0]
    b=x[1]
    c=x[2]
    d=x[3]
    e=b+':'+c+':'+d

    mdict[a]=e

当我尝试更改存储在d 中的member_phone 时,值已更改而不是按键流动,

def change(mdict,b,c,d,e):
    a=input('ID')
    if a in mdict:
        d= str(input('phone'))
        mdict[a]=b+':'+c+':'+d
    else:
        print('not')

以及如何将字典保存到相同格式的文本文件中?

【问题讨论】:

    标签: python file dictionary python-3.x


    【解决方案1】:

    我喜欢使用漂亮的打印模块以非常用户友好的可读形式存储字典:

    import pprint
    
    def store_dict(fname, dic):
        with open(fname, "w") as f:
            f.write(pprint.pformat(dic, indent=4, sort_dicts=False))
            # note some of the defaults are: indent=1, sort_dicts=True
    

    然后,在恢复时,读入文本文件并eval() 将字符串转回字典:

    def load_file(fname):
        try:
            with open(fname, "r") as f:
                dic = eval(f.read())
        except:
            dic = {}
        return dic
    

    【讨论】:

      【解决方案2】:

      Python 有 pickle 模块专门用于这类事情。

      这些函数是您保存和加载几乎任何对象所需的全部:

      with open('saved_dictionary.pkl', 'wb') as f:
          pickle.dump(dictionary, f)
              
      with open('saved_dictionary.pkl', 'rb') as f:
          loaded_dict = pickle.load(f)
      

      为了保存 Python 的集合,有 shelve 模块。

      【讨论】:

      • save_obj 似乎要求文件 obj/'+ name + '.pkl 已经存在。我创建了一个名为Q 的字典,填充它,然后调用save_obj(Q, "Qtable") 我收到一个错误:FileNotFoundError: [Errno 2] No such file or directory: 'obj/Qtable.pkl' 在写入文件之前如何首先创建文件?
      • @ToothpickAnemone 使用wb+ 创建文件,即:with open('obj/'+ name + '.pkl', 'wb+')
      • @andrey.s:我认为你所说的不会有任何影响,因为它没有解决问题。
      • @Toothpick Anemone:在模式中添加+ 不会影响您的问题(andrey.s 不正确)。你的问题听起来像是因为一两件事。要使此答案中的save_obj() 起作用,名为"obj" 的子目录必须已经存在,因为open() 不会自动创建一个。其次,save_obj() 的第一个参数是要保存的 Python 对象,而不是子目录的名称(尽管在示例 save_obj(Q, "Qtable") 调用中,Q 的含义并不完全清楚)。如果目录尚未以os.mkdir() 退出,您可以创建一个目录。
      • 这里添加了 'obj/' 字符串是有原因的吗?一般来说,保存任何东西的默认行为是保存在当前目录中,或者你给它完整的目录以保存在那里。我刚刚删除了它,它按预期工作!
      【解决方案3】:
      file_name = open("data.json", "w")
      json.dump(test_response, file_name)
      file_name.close()
      

      或者使用上下文管理器,哪个更好:

      with open("data.json", "w") as file_name:
          json.dump(test_response, file_name)
      

      【讨论】:

        【解决方案4】:

        由于 Pickle 存在一些安全问题并且速度很慢 (source),我会选择 JSON,因为它速度快、内置、可读且可互换:

        import json
        data = {'another_dict': {'a': 0, 'b': 1}, 'a_list': [0, 1, 2, 3]}
        # e.g. file = './data.json' 
        with open(file, 'w') as f: 
            json.dump(data, f)
        

        阅读同样简单:

        with open(file, 'r') as f:
            data = json.load(f)
        

        这类似于this answer,但正确实现了文件处理。

        【讨论】:

        • 感谢您正确实施文件处理!
        • 读取存储为键值对的.json文件时,json.load返回的默认数据结构将是dict?
        【解决方案5】:

        我建议使用 JSON 格式而不是 pickle 格式保存您的数据,因为 JSON 的文件是人类可读的,因为您的数据很小,这使您的调试更容易。其他程序也使用 JSON 文件来读取和写入数据。你可以阅读更多关于它here

        您需要安装 JSON 模块,您可以使用 pip 安装:

        pip install json
        
        
        # To save the dictionary into a file:
        json.dump( data, open( "myfile.json", 'w' ) )
        

        这会创建一个名为 myfile 的 json 文件。

        # To read data from file:
        data = json.load( open( "myfile.json" ) )
        

        这会读取 myfile.json 数据并将其存储在数据对象中。

        【讨论】:

          【解决方案6】:

          我们也可以使用json模块,在字典或其他一些数据可以很容易地映射到JSON格式的情况下。

          import json
          
          # Serialize data into file:
          json.dump( data, open( "file_name.json", 'w' ) )
          
          # Read data from file:
          data = json.load( open( "file_name.json" ) )
          

          这个解决方案带来了很多好处,例如以不变的形式适用于Python 2.xPython 3.x,此外,以 JSON 格式保存的数据可以在许多不同的平台或程序之间轻松传输。这些数据也是人类可读的

          【讨论】:

          • 好方法,但我认为直接使用open 代替with 创建的上下文并不安全。有没有保证,如果json.dump失败,文件句柄会被关闭?
          • 要获得美观、可读的 .json,请执行以下操作:with open('file_name.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4)
          【解决方案7】:

          Pickle 可能是最好的选择,但如果有人想知道如何使用 NumPy 将字典保存和加载到文件中:

          import numpy as np
          
          # Save
          dictionary = {'hello':'world'}
          np.save('my_file.npy', dictionary) 
          
          # Load
          read_dictionary = np.load('my_file.npy',allow_pickle='TRUE').item()
          print(read_dictionary['hello']) # displays "world"
          

          仅供参考:NPY file viewer

          【讨论】:

          • .item() 是干什么用的?
          • 为什么这个答案不如@Zah 的“pickle”答案那么受欢迎?更复杂的空间?
          • @frank 的可能性,因为 pickle 是 python 标准库的一部分,其中 numpy 是一个独立的项目。
          • @Gulzar 从我查到的内容中, np.load 返回一个 ndarray (执行type(read_dictionary) 揭示了这一点)并且 .item() 基本上将该元素转换为一个 python 标量对象,它是一个字典声明here
          • @Shai 你有没有安装 numpy 包...?
          【解决方案8】:

          我不确定您的第一个问题是什么,但如果您想将字典保存到文件中,您应该使用json 库。查找加载和放置函数的文档。

          【讨论】:

          • 为什么是 json?使用“repr”将 Python 字典转储到文件中更加容易
          • @mguijarr 但解析它并不容易。 Plus json 很容易手动编辑并导入到任何其他程序中。
          • 我喜欢 John 的建议 - 请参阅这篇文章以获取一个好的简单示例 stackoverflow.com/a/11027021/765827
          【解决方案9】:

          对于字符串字典,例如您正在处理的字典,可以仅使用 Python 的内置文本处理功能来完成。

          (请注意,如果值是其他值,这将不起作用。)

          with open('members.txt') as file:
              mdict={}
              for line in file:
                  a, b, c, d = line.strip().split(':')
                  mdict[a] = b + ':' + c + ':' + d
          
          a = input('ID: ')
          if a not in mdict:
              print('ID {} not found'.format(a))
          else:
              b, c, d = mdict[a].split(':')
              d = input('phone: ')
              mdict[a] = b + ':' + c + ':' + d  # update entry
              with open('members.txt', 'w') as file:  # rewrite file
                  for id, values in mdict.items():
                      file.write(':'.join([id] + values.split(':')) + '\n')
          

          【讨论】:

          • 这对字典不起作用:file.write(':'.join([id] + values.split(':')) + '\n') AttributeError: 'dict'对象没有属性“分裂”
          • @ShaiAlon:不是所有人,不。它绝对确实适用于那些值为字符串(具有split() 方法)的人——这是这个问题的主题。听起来你正试图在字典词典上使用它,所以不,它不适用于那些。我也不欣赏人们的反对票,因为他们并不真正理解问题(以及所提供答案的背景)。我会在合适的时候更新我的答案,所以请撤消你的反对票。
          【解决方案10】:

          保存并加载字典到文件:

          def save_dict_to_file(dic):
              f = open('dict.txt','w')
              f.write(str(dic))
              f.close()
          
          def load_dict_from_file():
              f = open('dict.txt','r')
              data=f.read()
              f.close()
              return eval(data)
          

          【讨论】:

            【解决方案11】:

            我没有计时,但我敢打赌 h5 比 pickle 快;压缩后的文件大小几乎肯定会更小。

            import deepdish as dd
            dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))
            

            【讨论】:

              【解决方案12】:

              除非你真的想保留字典,我认为最好的解决方案是使用csv Python 模块来读取文件。 然后,您将获得多行数据,您可以更改 member_phone 或任何您想要的; 最后,您可以再次使用csv 模块以相同格式保存文件 当你打开它时。

              阅读代码:

              import csv
              
              with open("my_input_file.txt", "r") as f:
                 reader = csv.reader(f, delimiter=":")
                 lines = list(reader)
              

              编写代码:

              with open("my_output_file.txt", "w") as f:
                 writer = csv.writer(f, delimiter=":")
                 writer.writerows(lines)
              

              当然,你需要调整你的change()函数:

              def change(lines):
                  a = input('ID')
                  for line in lines:
                    if line[0] == a:
                      d=str(input("phone"))
                      line[3]=d
                      break
                  else:
                    print "not"
              

              【讨论】:

              • Of course, you need to adapt your change() function:是什么意思
              • 在问题中,使用了dict,而 csv 更像是一个列表
              猜你喜欢
              • 2017-07-14
              • 2014-11-04
              • 1970-01-01
              • 2016-03-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多