IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Merge 2 fichiers Json [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 573
    Par défaut Merge 2 fichiers Json
    Bonjour,

    Je cherche a merger deux fichiers Json
    Pas faire une concaténation des 2 fichiers, mais plutôt un update.

    En résumé, j'ai un fichier json 'brut' et un fichier json 'modif'
    La structure des 2 fichiers est la même
    Si une valeur est présente dans le fichier 'modif' en gros, elles n'est pas vide alros on prend cette valeur, sinon, on garde celle du fichier brut

    Existe t'il une solution autre que de parser les 2 structures et de faire des if then else ?

    Merci pour votre aide

    Thais

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par thais781 Voir le message
    Existe t'il une solution autre que de parser les 2 structures et de faire des if then else ?
    Une fusion dépend de la structure... qui peut être compliquée... mais si ce sont de simples tableaux on va récupérer des dictionnaires et faire un update.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 573
    Par défaut
    Yes, merci pour ton aide
    On est effectivement dans une solution simple : récupérer des dictionnaires et faire un update.

    Est ce qu'il y a une fonctions qui permet de le faire ou je dois le coder à la mano ?

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par thais781 Voir le message
    Est ce qu'il y a une fonctions qui permet de le faire ou je dois le coder à la mano ?
    Ben oui, il vient de te le dire => update !!!

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> a={1 : "toto", 2 : "titi"}
    >>> b={1 : "tata", 5 : "tutu" }
    >>> a.update(b)
    >>> a
    {1: 'tata', 2: 'titi', 5: 'tutu'}
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 966
    Par défaut
    Attention toutefois avec update car si la clé est présente mais vide ou à blanc dans b, cela remplacera la valeur dans a.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> a = json.loads('{"1" : "toto", "2" : "titi" }')
    >>> b = json.loads('{"1" : null, "5" : "tutu" }')
    >>> a.update(b)
    >>> a
    {'1': None, '2': 'titi', '5': 'tutu'}
    Edit :
    Je n'ai pas trouvé de paramètre pour ignorer les valeurs nulles dans la méthode loads.
    Donc, j'ignore s'il y a plus simple ou plus efficace (les puristes me corrigeront) mais pour éviter ça, il faut filtrer les valeurs à None.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> a = json.loads('{"1" : "toto", "2" : "titi" }')
    >>> b = json.loads('{"1" : null, "5" : "tutu" }')
    >>> a.update({k:v for k, v in b.items() if v is not None})
    >>> a
    {'1': 'toto', '2': 'titi', '5': 'tutu'}

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Hello,

    Si les architectures diffèrent, il faudra sans doute vérifier aussi les types (list ou dict) à coup d'isinstance...

    Il faudra prendre aussi le cas où les clés sont identiques dans les deux JSON et savoir ce qu'on fait avec leurs valeurs.

    Ça peut être un bon exercice sur la récursivité...

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 573
    Par défaut
    Merci pour votre aide.
    Ca fonctionne bien sur le structure simples, mais moins sur les structures compliquées :

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    a = {'level_1': {
             'level_11': {'level_111': '9'},
             'level_12': {'level_121': 'hello'}
          }}
    b = {'level_1': {
             'level_11': {'level_111': ''},
             'level_12': {'level_121': 'salut'}
          }}
    a.update(b)
    Ca remplace bien le 'hello' par 'salut' dans le level_121 mais aussi le '9' par le 'level_111

    Donc j'ai essayé de supprimer les endroits ou c'est vide mais ca me supprime tout ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    a = {'level_1': {
             'level_11': {'level_111': '9'},
             'level_12': {'level_121': 'hello'}
          }}
    b = {'level_1': {
             'level_12': {'level_121': 'salut'}
          }}
    a.update(b)
    me donne en résultat : {'level_1': {'level_12': {'level_121': 'salut'}}}

    Donc update oui, sauf si la valeur existe ;-)

    Une autre idée ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 573
    Par défaut
    Avec une petite fonction récursive ca fonctionne bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    def update_dict(d, u):
        for k, v in u.items():
            if isinstance(v, dict):
                d[k] = update_dict(d.get(k, {}), v)
            else:
                if k in d:
                    d[k] = v
        return d

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par thais781 Voir le message
    Ca fonctionne bien sur le structure simples, mais moins sur les structures compliquées :
    C'est ce que j'ai dis dès le départ: pas de solution générale... que des solutions (à écrire à chaque fois) qui prendront en compte la structure du JSON (qui est un composite de dictionnaires et de listes).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Création de fichier json avec PHP
    Par versus68 dans le forum Langage
    Réponses: 1
    Dernier message: 02/06/2008, 11h56
  2. [AJAX] recupérer plusieur fichiers JSON
    Par Emcy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/10/2007, 14h41
  3. structure fichier JSON
    Par Emcy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/03/2007, 08h51
  4. [AJAX] Récupération d'un fichier JSON avec javaScript
    Par guerin dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/11/2006, 19h05
  5. Shell - Merge de fichiers
    Par tesla dans le forum Linux
    Réponses: 4
    Dernier message: 29/06/2004, 02h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo