如何将字典保存到文件中?
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.x和Python 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 更像是一个列表以上是关于如何将字典保存到文件中?的主要内容,如果未能解决你的问题,请参考以下文章