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 :

Problème de KeyError [Python 3.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Avril 2021
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Problème de KeyError
    Bonjour à tous,

    Je suis loin d'être expert Python, et surtout là, je sèche complet ...
    J'aurais besoin de vos yeux aiguisés pour m'aider à y voir plus clair.
    Voilà mon problème intervient lorsque j'exécute ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import json
     
    with open('json_test.json') as json_1 :
        json_file = json.load(json_1)
     
        req_json = json_file['source']
        json_file_2 = json.loads(req_json)
     
        for i in json_file_2['ev']:
            for j in json_file_2['ev'][i] :
                print(json_file_2['ev'][i][j]['h'])
    J'obtiens ça :

    print(json_file_2['ev'][i][j]['h'])
    KeyError: 'h'

    Pourtant si je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import json
     
    with open('json_test.json') as json_1 :
        json_file = json.load(json_1)
     
        req_json = json_file['source']
        json_file_2 = json.loads(req_json)
     
        for i in json_file_2['ev']:
            for j in json_file_2['ev'][i] :
                print(json_file_2['ev'][i][j])
    J'obtiens ça :

    {'pos': 110284, 'ver': 1.95, 'res': 0, 'lock': False, 'h': 6.5, 'p1': 428603, 'pl': 'fraises'}
    {'pos': 110284, 'ver': 1.95, 'res': 0, 'lock': False, 'h': 5.5, 'p1': 317698, 'pl': 'poires'}

    Et encore plus bizarre, si je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import json
     
    with open('json_test.json') as json_1 :
        json_file = json.load(json_1)
     
        req_json = json_file['source']
        json_file_2 = json.loads(req_json)
     
        for i in json_file_2['ev']:
            for j in json_file_2['ev'][i] :
                print(json_file_2['ev'][i][j]['pos'])
    J'obtiens la liste des 'pos'.
    Si je remplace 'pos' par 'ver' ça fonctionne également, tout comme pour 'res' et pour 'lock'.
    Il n'y a que pour 'h', 'p1' et 'pl' qu'il me renvoie une KeyError.
    Je ne sais plus quoi faire, je ne comprends absolument pas pourquoi je suis capable d'afficher les 4 premières "key" mais que les 5, 6 et 7 soient en KeyError.
    Si vous aviez une petite idée je suis preneur ...

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Bravo4892 Voir le message
    Il n'y a que pour 'h', 'p1' et 'pl' qu'il me renvoie une KeyError.
    Je ne sais plus quoi faire, je ne comprends absolument pas pourquoi je suis capable d'afficher les 4 premières "key" mais que les 5, 6 et 7 soient en KeyError.
    Si vous aviez une petite idée je suis preneur ...
    Joli truc pour l'instant incompréhensible (donner le contenu du json aurait été un plus).
    En attendant tu peux tenter print("h" in json_file_2['ev'][i][j]) ou for k in json_file_2['ev'][i][j].keys(): print(k, type(k), json_file_2['ev'][i][j][k])...

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Avril 2021
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Je vais essayer de poster le json dans la journée si je trouve un peu de temps.
    Merci déjà pour ces propositions je vais tester.
    J'avoue avoir tenté tellement de choses que je ne sais même pas si j'ai déjà tenté ça...
    Mais comme tu dis, c'est incompréhensible...
    Comment puis-je avoir accès aux 4 premières ''keys'' mais pas aux 3 dernières, alors que je ne fais que changer 'pos' par 'h' dans mon code, et que les ''keys'' sont visibles, et au même endroit.
    Ça me dépasse.
    Merci pour ton retour en tout cas.
    Je reviens vers toi pour te dire ce qu'il en est dès que possible.
    Bonne journée 😉

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bravo4892 Voir le message
    Je vais essayer de poster le json dans la journée si je trouve un peu de temps.
    Si possible essayer d'isoler que la partie du fichier qui pose souci...

    Citation Envoyé par Bravo4892 Voir le message
    Ça me dépasse.
    Oui, moi aussi
    Autre proposition:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (k, v) in json_file_2['ev'][i][j].items():
    	print(k, type(k), v, type(v))		# Toujours très utile d'afficher type(truc) quand on debuggue
    	if k == "h":
    		print("ok")
    		print(json_file_2['ev'][i][j][k])
    		print(json_file_2['ev'][i][j]["h")
    	# if
    # for

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Avril 2021
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Joli truc pour l'instant incompréhensible (donner le contenu du json aurait été un plus).
    En attendant tu peux tenter print("h" in json_file_2['ev'][i][j]) ou for k in json_file_2['ev'][i][j].keys(): print(k, type(k), json_file_2['ev'][i][j][k])...
    Alors finalement le json complet aurait pu t'aider facilement.
    En gros l'erreur provient du fait que les 3 dernières "keys" n'existent pas sur le début du fichier.
    Aussi quand j'exécute le code, il cherche la "key" 'h' sur la première ligne, ne la trouve pas (évidemment) et renvoie l'erreur.
    Pour afficher ces clés spécifiques, je dois lui donner une condition pour aller chercher uniquement lorsque 'po' est égal à un certain nombre.
    C'était déjà le but final de mon projet mais je me suis obstiné à vouloir afficher impérativement toutes les "keys" alors que de base je sais que je ne dois aller les chercher que pour certains 'pos'.
    Merci pour ton aide en tout cas.
    Je clos le sujet

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bravo4892 Voir le message
    Citation Envoyé par Bravo4892 Voir le message
    Pourtant si je fais ça...J'obtiens ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {'pos': 110284, 'ver': 1.95, 'res': 0, 'lock': False, 'h': 6.5, 'p1': 428603, 'pl': 'fraises'}
    {'pos': 110284, 'ver': 1.95, 'res': 0, 'lock': False, 'h': 5.5, 'p1': 317698, 'pl': 'poires'}
    En gros l'erreur provient du fait que les 3 dernières "keys" n'existent pas sur le début du fichier.
    Tu ne pouvais donc pas obtenir ce que tu décris si les clefs n'y sont pas. Or personne ne peut résoudre un problème si son exposé est incorrect.
    Heureusement il existe un axiome que tous les habitués du forum connaissent: si Python le dit c'est que c'est vrai. Donc quand le PO dit "j'ai ça et Python dit le contraire" on part implicitement du principe que le PO se trompe ce qui nous évite de galérer pour rien. On donne des idées d'instructions pour aider à trouver mais on (enfin "je") se (me) foule pas plus que ça.

    Citation Envoyé par Bravo4892 Voir le message
    Pour afficher ces clés spécifiques, je dois lui donner une condition pour aller chercher uniquement lorsque 'po' est égal à un certain nombre.
    Si ça t'arrange tu peux utiliser dict.getdefault(k, v) qui renvoie "v" si "k" n'existe pas.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Avril 2021
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Alors en fait si si j'obtenais bien ce que j'ai dit.
    Mais pas seulement...
    En gros j'avais des données avant, avec d'autres 'pos', 'ver', 'res', 'lock' mais pas les 3 dernières.
    J'ai tronqué le résultat car très long pour ne conserver que ce qui m'intéressait, et c'est ce qui a provoqué mon erreur, puisque je ne voyais plus que le début du fichier ne comportait pas ces ''keys''...

    Mais comme tu dis si bien, si Python le dit, c'est que JE faisais bien une erreur.
    Ça paraissait inconcevable, mais il suffisait juste de relever le nez pour le voir.
    Le json complet aurait permis de le voir plus vite en revanche.

    Oui ta proposition est une bonne idée, j'ai fait différemment mais ça fonctionne très bien 😉

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

Discussions similaires

  1. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  2. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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