我在更改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
当我尝试更改member_phone
中存储的d
时,该值已更改,而不是按键流动,
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')
以及如何将dict保存到具有相同格式的文本文件中?
答案 0 :(得分:205)
Python只有pickle模块用于此类事情。
这些功能是保存和加载几乎所有对象所需的全部功能:
def save_obj(obj, name ):
with open('obj/'+ name + '.pkl', 'wb') as f:
pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)
def load_obj(name ):
with open('obj/' + name + '.pkl', 'rb') as f:
return pickle.load(f)
这些函数假设您当前工作目录中有一个obj
文件夹,该文件夹将用于存储对象。
请注意,pickle.HIGHEST_PROTOCOL是一种二进制格式,虽然不是很方便,但对性能有好处。协议0是一种文本格式。
为了保存Python集合,有shelve模块。
答案 1 :(得分:133)
Pickle可能是最好的选择,但是如果有人想知道如何使用NumPy将字典保存并加载到文件中:
import numpy as np
# Save
dictionary = {'hello':'world'}
np.save('my_file.npy', dictionary)
# Load
read_dictionary = np.load('my_file.npy').item()
print(read_dictionary['hello']) # displays "world"
仅供参考:NPY file viewer
答案 2 :(得分:16)
我不确定你的第一个问题是什么,但是如果你想将字典保存到文件中,你应该使用json
库。查看加载和放置函数的文档。
答案 3 :(得分:9)
将字典保存并加载到文件中
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)
答案 4 :(得分:2)
除非你真的想保留字典,否则我认为最好的解决方案是使用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"
答案 5 :(得分:2)
对于字符串的字典,例如您正在处理的字典,可以仅使用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')
答案 6 :(得分:2)
我还没有计时,但我打赌h5比泡菜更快;带压缩的文件大小几乎肯定会更小。
import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))
答案 7 :(得分:2)
在字典或某些其他数据可以轻松地映射为JSON格式的情况下,我们也可以使用json
模块。
将数据序列化到文件中
import json
json.dump( data, open( "file_name.json", 'w' ) )
从文件中读取数据:
import json
data = json.load( open( "file_name.json" ) )
此解决方案带来了很多好处,例如可以以不变的形式用于 Python 2.x 和 Python 3.x ,此外,数据还保存在 JSON中格式可以在许多不同的平台或程序之间轻松转移。这些数据也是人类可读的。
答案 8 :(得分:1)
快速而肮脏的解决方案:将字典转换为字符串并保存到文件,例如:
#dict could be anything:
savedict = open('savedict001.txt', 'w')
savedict.write(str(dict))
savedict.close()
答案 9 :(得分:1)
由于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,但是可以正确实现文件处理。
答案 10 :(得分:0)
我建议您使用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数据并将其存储在数据对象中。
答案 11 :(得分:0)
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)
答案 12 :(得分:0)
我喜欢使用漂亮的打印模块以非常用户友好的可读形式存储字典:
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