2013-10-05 154 views
54

我在更改字典值并将字典保存为文本文件时出现问题(格式必须相同),我只想更改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 

当我尝试改变存储在dmember_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') 

以及如何保存字典t o具有相同格式的文本文件?

回答

7

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

+0

为什么JSON?使用“repr” – mguijarr

+2

@mguijarr将Python字典转储到文件更容易,但解析它并不容易。 Plus json易于手动编辑并导入任何其他程序。 – kalhartt

+0

我喜欢约翰的建议 - 看到这个帖子了一个很好的和简单的例子http://stackoverflow.com/a/11027021/765827 – jacanterbury

119

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模块。

+0

'save_obj'似乎需要文件'OBJ /“+名字+” .pkl'已经存在。我创建了一个名为'Q',填充了字典,并发出的呼吁'save_obj(Q, “Qtable”)'我得到了一个错误:'FileNotFoundError:[错误2]没有这样的文件或目录:“OBJ/Qtable.pkl “在写入文件之前,如何创建文件? –

+1

@ToothpickAnemone使用'WB +'创建文件,即:'开放的( 'OBJ /' +名字+ '.pkl', 'WB +')' –

+0

@ andrey.s:我不认为你说的话会令任何区别,因为它不能解决问题。 – martineau

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" 
+0

是什么'当然意味着,你需要去适应你的变化()函数:' –

+1

的问题,一个'dict'使用,而CSV更像一个列表 – mguijarr

3

下面是它如何能做到仅使用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') 
60

泡菜可能是最好的选择,但如果有人想知道如何保存和载入字典文件使用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" 

FYI:NPY file viewer

2

我没有定时但我敢打赌,h5比咸菜快;压缩的文件大小肯定会更小。

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