2013-10-05 116 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))