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 :

Ajout d'une ligne dans un fichier Json


Sujet :

Python

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2019
    Messages : 6
    Par défaut Ajout d'une ligne dans un fichier Json
    Bonjour,

    J'ai un fichier input Json il contient :

    Code JSON : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    { "anchorID": "01", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5}
    { "anchorID": "03", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5}

    Je veux ajouter {"anchorID": "05", "botID": "0000000000000b02", "distance": 2} dans le fichier output, à chaque fois où je trouve dans le fichier input "anchorID": "02

    Du coup l'output sera:

    Code JSON : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    { "anchorID": "01", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "05", "botID": "0000000000000b02", "distance": 2} 
    { "anchorID": "03", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "05", "botID": "0000000000000b02", "distance": 2}


    Merci d'avance

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par MariemBNM Voir le message
    Merci d'avance
    Tu nous as pris pour "pronto Python" ? Tu penses qu'un forum d'aide c'est un forum où on vient passer ses commandes ? Commence déjà par lire règles.

    Et pour ta demande il existe des sites pour ça. Tu y vas, tu payes et t'obtiens ton code.
    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]

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 732
    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 732
    Par défaut
    Salut,

    Un fichier JSON se lit avec le module json.
    Cela va convertir le contenu du fichier en une liste de dictionnaires.
    Liste à parcourir pour trouver les éléments où la clef anchorID est associée à la valeur "02" pour ajouter à la suite l'élément que vous voulez.
    C'est un peu comme si avec la liste [1, 2, 1, 2] vous vouliez ajouter 3 après chaque occurrence de 2.
    Cela fait, il faut écrire la liste avec le module json dans un nouveau fichier.

    Rien de bien compliqué.

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

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2019
    Messages : 6
    Par défaut
    Bonjour,
    Merci pour votre retour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import json
    With open('file.json') as j:
        data=json.load(j)
    for k, v in data.items():
         print(k,v)
    Mais, je n'ai pas compris comment ajouter la condition

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Citation Envoyé par MariemBNM Voir le message
    J'ai un fichier input Json il contient :

    Code JSON : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    { "anchorID": "01", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5}
    { "anchorID": "03", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5}
    Vous êtes sûr que c'est bien cela que vous avez dans votre fichier ?
    Je demande cela car il me semble que ce que vous avez posté n'est pas au format JSON...

    Est-ce que ce ne serait pas plutôt cela qu'il y a dans votre fichier :

    Code json : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [
     {"anchorID": "01", "botID": "0000000000000b02", "distance": 3.5},
     {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5},
     {"anchorID": "03", "botID": "0000000000000b02", "distance": 3.5},
     {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5}
    ]

    Si c'est bien cela alors il s'agit d'un tableau d'objets qui (si j'ai bien compris) correspond en Python à une liste de dictionnaires...

    Du coup il me semble que dans votre code (c'est with et non With, non ?):
    Citation Envoyé par MariemBNM Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import json
    With open('file.json') as j:
        data=json.load(j)
    for k, v in data.items():
         print(k,v)
    data est une liste et non un dictionnaire...
    C'est pour cela que lorsque j'ai testé votre code il y a eu une erreur : 'list' object has no attribute 'items'

    La méthode items fonctionne avec des dictionnaires et non avec des listes...

    Si par exemple on remplace cette ligne : for k, v in data.items(): par celle-ci :for k, v in data[0].items(): on obtient les clés et les valeurs du premier dictionnaire...


    Citation Envoyé par MariemBNM Voir le message
    Mais, je n'ai pas compris comment ajouter la condition :(
    Pour repérer l’élément "anchorID": "02" j'utiliserais cette condition : if(k == "anchorID" and v == "02"):

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2019
    Messages : 6
    Par défaut
    Bonjour ,
    Oui j'ai le contenu suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    { "anchorID": "01", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5}
    { "anchorID": "03", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5}
    J'ai essayé avec le code si dessous mai j'ai eu le fichier logout vide
    Merci pour votre aide


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    import json
    class Add_anchorFict:
        def __init__(self,anchor_Fict="05"):
            self.anchor_Fict=anchor_Fict
     
        def add_anchorFict(self,logname_in,logname_out):
            """simulates the anchor fict on the entire log"""
     
            with open(logname_in,'r') as log_in:
                try:
                    log_out = open(logname_out,'w+')
                except:
                    print("Could not create output log")
     
                for line in log_in:
     
                    if line == "\n":
                        continue
                    json_sample = json.loads(line)
                    for k,v in json_sample.items():
                        if(k=="ancorID" and v=="02"):
                            anchor_Fict=json_sample.copy()
                            anchor_Fict["anchorID"]="05"
                            anchor_Fict["distance"]=2
                            print(anchor_Fict)
                            json.dump(anchor_Fict,log_out)
                            log_out.write("\n")
                log_out.close()
     
    LOGIN = 'C:/Users/Desktop/data.json'
    LOGOUT_FOLDER= 'C:/Users/Desktop'
    LOGOUT = LOGOUT_FOLDER + '/' +  'log2.json'
    x= Add_anchorFict("05")
    x.add_anchorFict(LOGIN,LOGOUT)

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 732
    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 732
    Par défaut
    Salut,

    Citation Envoyé par MariemBNM Voir le message
    J'ai essayé avec le code si dessous mai j'ai eu le fichier logout vide
    Vous n'êtes pas en train d'essayer d'apprendre Python et demander de l'aide pour comprendre comment faire un exercice. Et si vous récupérez du code sur Internet, c'est pour ne pas perdre le temps de l'écrire par vous même: ce qui suppose que vous sachiez l'écrire.

    Et malheureusement, tout programmeur écrit rarement un code qui fonctionne du premier coup. Lorsqu'il constate que çà ne fonctionne pas, il essaie de voir si son code fait bien ce qu'il en attend. Sans utiliser un debuggeur symbolique, la commande "print" vous permet de vérifier que çà se passe comme attendu.

    Déjà si le fichier de sortie est vide, c'est qu'on y écrit rien dedans. Et lorsque vous exécutez votre code vous devriez constater que le print(anchor_Fict) à la ligne 25 n'affiche rien. Ce qui est cohérent avec "j'écris rien donc il reste vide".
    Et comme ces instructions sont sous la condition (k=="ancorID" and v=="02"), ben, c'est qu'elle n'est jamais vérifiée ou qu'il n'y a pas de lignes dans le fichier d'entrée.

    A vous de comprendre pourquoi.

    Cela corrigé, vous devriez constater d'autres défauts.
    Et accessoirement, si vous avez un dictionnaire, pas la peine de le balayer avec une boucle pour trouver clef/valeur.

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

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2019
    Messages : 6
    Par défaut
    Re Bonjour,

    Merci pour votre retour

    Cdt,

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,
    Citation Envoyé par MariemBNM Voir le message
    Oui j'ai le contenu suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    { "anchorID": "01", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5}
    { "anchorID": "03", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5}
    Ben encore fois il me semble que cela n'est pas du JSON... J'ai quand même testé cela avec le module JSON de python et cela ne fonctionne pas, il y a une erreur d'encodage...

    Cela ne m'étonne pas et semble confirmer que cela n'est pas au format JSON...

    C'est pour cette raison que je vous ai demandé si (dans votre fichier) il n'y aurait pas plutôt cela :

    Code json : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [
     {"anchorID": "01", "botID": "0000000000000b02", "distance": 3.5},
     {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5},
     {"anchorID": "03", "botID": "0000000000000b02", "distance": 3.5},
     {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5}
    ]
    Regardez bien il y a une paire de crochets [] et des virgules en plus...

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Ah oui ça y est, en analysant votre deuxième code j'ai compris...

    En fait votre fichier n'est pas un JSON et c'est pour cela que cette fois-ci (contrairement à la première fois) vous le lisez ligne par ligne pour récupérer chaque objet (dictionnaire) un par un...

    Oui pourquoi pas, cela semble une bonne solution...

    Citation Envoyé par MariemBNM Voir le message

    J'ai essayé avec le code si dessous mai j'ai eu le fichier logout vide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    import json
    class Add_anchorFict:
        def __init__(self,anchor_Fict="05"):
            self.anchor_Fict=anchor_Fict
     
        def add_anchorFict(self,logname_in,logname_out):
            """simulates the anchor fict on the entire log"""
     
            with open(logname_in,'r') as log_in:
                try:
                    log_out = open(logname_out,'w+')
                except:
                    print("Could not create output log")
     
                for line in log_in:
     
                    if line == "\n":
                        continue
                    json_sample = json.loads(line)
                    for k,v in json_sample.items():
                        if(k=="ancorID" and v=="02"):
                            anchor_Fict=json_sample.copy()
                            anchor_Fict["anchorID"]="05"
                            anchor_Fict["distance"]=2
                            print(anchor_Fict)
                            json.dump(anchor_Fict,log_out)
                            log_out.write("\n")
                log_out.close()
     
    LOGIN = 'C:/Users/Desktop/data.json'
    LOGOUT_FOLDER= 'C:/Users/Desktop'
    LOGOUT = LOGOUT_FOLDER + '/' +  'log2.json'
    x= Add_anchorFict("05")
    x.add_anchorFict(LOGIN,LOGOUT)
    C'est normal vous avez fait une faute de frappe, ce n'est pas : if(k=="ancorID" and v=="02"): mais if(k=="anchorID" and v=="02"):...

    C'est-à-dire il faut remplacer "ancorID" par "anchorID"...

    J'ai testé après avoir corrigé et j’obtiens un fichier contenant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {"anchorID": "05", "botID": "0000000000000b02", "distance": 2}
    {"anchorID": "05", "botID": "0000000000000b02", "distance": 2}
    Ce n'est pas encore exactement ce que vous voulez mais on avance...

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2019
    Messages : 6
    Par défaut
    J'ai pu ajouter la ligne. Finalement
    Merci pour tes remarques

  12. #12
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Vous avez fait comment alors ?

  13. #13
    Futur Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2019
    Messages : 6
    Par défaut
    J'ai oublié de mettre 'h' dans la condition, du coup "anchor ID "au lieu de "ancor ID"

  14. #14
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par MariemBNM Voir le message
    J'ai oublié de mettre 'h' dans la condition, du coup "anchor ID "au lieu de "ancor ID"
    Ah oui c'est ce que je vous avez signalé dans mon message précédent sauf qu'il n'y a pas d'espace, il fallait remplacer "ancorID" par "anchorID" (sans espace).

    Mais normalement il manque quelque chose encore car avec cette correction on obtient ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {"anchorID": "05", "botID": "0000000000000b02", "distance": 2}
    {"anchorID": "05", "botID": "0000000000000b02", "distance": 2}
    Alors que vous vouliez obtenir ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {"anchorID": "01", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "05", "botID": "0000000000000b02", "distance": 2} 
    {"anchorID": "03", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "02", "botID": "0000000000000b02", "distance": 3.5}
    {"anchorID": "05", "botID": "0000000000000b02", "distance": 2}
    Bon je pense que ce n'est pas trop difficile à ajouter...

Discussions similaires

  1. [TPW] Ajout d'une ligne dans un fichier texte après une position saisie
    Par Invité dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 19/12/2010, 11h27
  2. Remplacer ou ajouter une ligne dans un fichier
    Par jmelyn dans le forum Shell et commandes GNU
    Réponses: 18
    Dernier message: 09/04/2009, 15h37
  3. [DOM]ajouter une ligne dans un fichier xml
    Par aroua dans le forum APIs
    Réponses: 1
    Dernier message: 21/04/2008, 17h25
  4. ajouter une ligne dans un fichier
    Par e-medi dans le forum C
    Réponses: 7
    Dernier message: 21/09/2007, 10h40
  5. ajout d'une ligne dans un fichier
    Par anibal dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2007, 11h31

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