如何将字典保存到文件中?

Posted

技术标签:

【中文标题】如何将字典保存到文件中?【英文标题】: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')

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

【问题讨论】:

【参考方案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 的建议 - 请参阅这篇文章以获取一个好的简单示例 ***.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 更像是一个列表

以上是关于如何将字典保存到文件中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字典保存到文件中?

从python字典如何将键和值保存到* .txt文件[关闭]

python 如何将字典对象保存到json文件的示例

如何使用输出流或任何有效的方式将数据保存到文件中?

无法将字典保存到文件

如何使用 Cloudkit 将字典(或任何其他复杂结构)保存到 iCloud 中?