2013-10-05 21 views
54

Ho un problema con la modifica di un valore di dict e il salvataggio del dict in un file di testo (il formato deve essere lo stesso), voglio solo cambiare il campo member_phone.Come salvare un dizionario in un file?

mio file di testo è il seguente formato:

memberID:member_name:member_email:member_phone 

e ho diviso il file di testo con:

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 

Quando provo cambiare il member_phone immagazzinate nella d, il valore è cambiato non scorre con la chiave,

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') 

e come salvare la dict t o un file di testo con lo stesso formato?

risposta

7

Non sono sicuro di quale sia la tua prima domanda, ma se vuoi salvare un dizionario in un file dovresti probabilmente usare la libreria json. Consulta la documentazione dei carichi e mette le funzioni.

+0

Perché json? È ancora più semplice scaricare il dizionario Python in un file usando "repr" – mguijarr

+2

@mguijarr, ma analizzarlo non è così facile. Plus json è facile da modificare a mano e importare in qualsiasi altro programma. – kalhartt

+0

Mi piace il suggerimento di John - vedi questo post per un esempio semplice e buono http://stackoverflow.com/a/11027021/765827 – jacanterbury

119

Python ha il modulo pickle solo per questo genere di cose.

Queste funzioni sono tutto ciò che è necessario per il salvataggio e il caricamento praticamente qualsiasi oggetto:

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) 

Queste funzioni supporre che si dispone di una cartella obj nella directory di lavoro corrente, che verrà utilizzato per memorizzare gli oggetti.

Nota che pickle.HIGHEST_PROTOCOL è un formato binario, che non può essere sempre conveniente, ma è buono per le prestazioni. Il protocollo 0 è un formato di testo.

Per salvare raccolte di Python c'è il modulo shelve.

+0

'save_obj' sembra richiedere che il file' obj/'+ nome +' .pkl' già esistere. Ho creato un dizionario chiamato 'Q', lo ho popolato e ho chiamato' save_obj (Q, "Qtable") 'Ho ricevuto un errore:' FileNotFoundError: [Errno 2] Nessun file o directory di questo tipo: 'obj/Qtable.pkl "Come si crea il file in primo luogo prima di scriverlo? –

+1

@ToothpickAnemone usa 'wb +' per creare il file, cioè: 'con open ('obj /' + nome + '.pkl', 'wb +')' –

+0

@ andrey.s: Non penso che quello che dici farà qualsiasi differenza perché non affronta il problema. – martineau

2

A meno che non si desideri veramente mantenere il dizionario, penso che la soluzione migliore sia utilizzare il modulo Python csv per leggere il file. Quindi, si ottengono file di dati e si può cambiare member_phone o qualunque cosa si voglia; infine, è possibile utilizzare nuovamente il modulo csv per salvare il file nello stesso formato mentre lo si apre.

Codice per la lettura:

import csv 

with open("my_input_file.txt", "r") as f: 
    reader = csv.reader(f, delimiter=":") 
    lines = list(reader) 

Codice per la scrittura:

with open("my_output_file.txt", "w") as f: 
    writer = csv.writer(f, delimiter=":") 
    writer.writerows(lines) 

Naturalmente, è necessario adattare il change() funzione:

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

cosa si intende per 'Ovviamente, è necessario adattare la propria funzione change():' –

+1

nella domanda, è stato usato un 'dict' mentre csv funziona più come una lista – mguijarr

3

Ecco come potrebbe essere fatto utilizzando solo le funzionalità di elaborazione testi incorporate di 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

Pickle è probabilmente l'opzione migliore, ma nel caso qualcuno si chiede come salvare e caricare un dizionario per un file utilizzando 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

non ho cronometrato ma scommetto che h5 è più veloce del pickle; il file con compressione è quasi certamente più piccolo.

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