2014-07-04 19 views
5

Sto usando Python e ho un file JSON in cui vorrei aggiornare un valore relativo a una determinata chiave. Cioè, ho la my_file.json contenente i seguenti datiCome aggiornare un file JSON usando Python?

{"a": "1", "b": "2", "c": "3"} 

e vorrei cambiare solo il valore relativo alla chiave b2-9 in modo che il file aggiornato sguardo come come:

{"a": "1", "b": "9", "c": "3"} 

Come posso farlo?


Ho provato quanto segue ma senza successo (le modifiche non vengono salvate nel file):

with open('my_file.json', 'r+') as f: 
    json_data = json.load(f) 
    json_data['b'] = "9" 
    f.close() 
+0

Questo può aiutare: http://stackoverflow.com/questions/21035762/python-read -json-file-and-modify – Vipul

risposta

7

non ha salvato i dati modificati a tutti. Devi prima caricare, poi modificare, e solo poi salvare. Non è possibile modificare i file JSON sul posto.

with open('my_file.json', 'r') as f: 
    json_data = json.load(f) 
    json_data['b'] = "9" 

with open('my_file.json', 'w') as f 
    f.write(json.dumps(json_data)) 

Si può anche fare questo:

with open('my_file.json', 'r+') as f: 
    json_data = json.load(f) 
    json_data['b'] = "9" 
    f.seek(0) 
    f.write(json.dumps(json_data)) 
    f.truncate() 

Se si vuole renderlo sicuro, per la prima volta scrivere i nuovi dati in un file temporaneo nella stessa cartella, e quindi rinominare il file temporaneo sul il file originale. In questo modo non perderai alcun dato anche se qualcosa dovesse accadere nel mezzo.

Se vieni a pensarci, i dati JSON sono molto difficili da modificare sul posto, poiché la lunghezza dei dati non è fissa e le modifiche potrebbero essere piuttosto significative.

+0

Puoi fornire un esempio concreto? – user502052

+0

+1 per avermi ricordato di troncare – timgeb

2

Ci siamo quasi, basta scrivere il json_data aggiornato al file. Sbarazzarsi di f.close(), poiché l'istruzione with garantirà che il file sia chiuso. Quindi, il numero

with open('my_file.json', 'w') as f: 
    f.write(json.dumps(json_data)) 
+1

Cosa succede se i nuovi dati sono più brevi dei vecchi dati nel file ... – DrV

+0

@DrV - È il mio caso ... – user502052

+0

@DrV punto preso, un altro blocco 'with' è probabilmente più pulito di 'seek (0)' – timgeb

0

Questo è il modo più semplice per eseguire l'aggiornamento/scrittura del file json. dove si sta creando un'istanza di file di JSON come 'f' e la scrittura del 'data' nel file JSON,

#write json file 

with open('data.json', 'w') as f: 
    json.dump(data, f) 

#Read json file 

with open('data.json', 'r') as f: 
    json.load(data, f) 
Problemi correlati