web-dev-qa-db-fra.com

Python lire le fichier JSON et le modifier

Bonjour, j'essaie de prendre les données d'un fichier JSON, de les insérer et de les identifier, puis d'effectuer POST REST .

{
    'name':'myname'
}

et je voudrais ajouter un identifiant pour que les données json ressemblent à:

 {
     'id': 134,
     'name': 'myname'
 }

Alors j'ai essayé:

import json
f = open("data.json","r")
data = f.read()
jsonObj = json.loads(data)

Je n'arrive pas à charger le fichier au format JSON. Que dois-je faire pour pouvoir convertir le fichier json en objet json et ajouter une autre valeur id. 

30
codeBarer

Définir l'élément en utilisant data['id'] = ....

import json

with open('data.json', 'r+') as f:
    data = json.load(f)
    data['id'] = 134 # <--- add `id` value.
    f.seek(0)        # <--- should reset file position to the beginning.
    json.dump(data, f, indent=4)
    f.truncate()     # remove remaining part
51
falsetru

la solution de falsetru est bien, mais a un petit bug:

Supposons que la longueur initiale de "id" était supérieure à 5 caractères. Lorsque nous vidons ensuite avec le nouveau "id" (134 avec seulement 3 caractères), la longueur de la chaîne écrite à partir de la position 0 dans le fichier est plus court que la longueur d'origine. Des caractères supplémentaires (tels que '}') laissés dans le fichier à partir du contenu d'origine.

J'ai résolu ce problème en remplaçant le fichier d'origine.

import json
import os

filename = 'data.json'
with open(filename, 'r') as f:
    data = json.load(f)
    data['id'] = 134 # <--- add `id` value.

os.remove(filename)
with open(filename, 'w') as f:
    json.dump(data, f, indent=4)
25
VadimBelov

Je voudrais présenter une version modifiée de la solution de Vadim. Il est utile de gérer les demandes asynchrones d’écriture/modification de fichier json. Je sais que cela ne faisait pas partie de la question initiale, mais pourrait être utile pour les autres.

En cas de modification de fichier asynchrone, os.remove(filename) lèvera FileNotFoundError si les demandes sont fréquentes. Pour résoudre ce problème, vous pouvez créer un fichier temporaire avec un contenu modifié, puis le renommer en même temps que l'ancienne version. Cette solution fonctionne correctement pour les cas synchrones et asynchrones.

import os, json, uuid

filename = 'data.json'
with open(filename, 'r') as f:
    data = json.load(f)
    data['id'] = 134 # <--- add `id` value.
    # add, remove, modify content

# create randomly named temporary file to avoid 
# interference with other thread/asynchronous request
tempfile = os.path.join(os.path.dirname(filename), str(uuid.uuid4()))
with open(tempfile, 'w') as f:
    json.dump(data, f, indent=4)

# rename temporary file replacing old file
os.rename(tempfile, filename)
0
Vadym Pasko