我有一个问题,改变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')
如何将字典保存为相同格式的文本文件?
我建议使用JSON格式而不是pickle格式保存数据,因为JSON的文件是人类可读的,这使得您的调试更容易,因为您的数据很小。JSON文件也被其他程序用来读取和写入数据。你可以在这里阅读更多信息
你需要安装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数据。
由于Pickle有一些安全问题,并且速度较慢(来源),我将选择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)
这类似于这个答案,但是正确地实现了文件处理。
如果性能改进仍然不够,我强烈推荐orjson,快速,正确的JSON库,用于Rust之上的Python构建。
除非你真的想保留字典,否则我认为最好的解决方案是使用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"
对于字符串字典(例如您正在处理的字符串字典),只能使用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')