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 :

Je n'arrive pas à parcourir le JSON


Sujet :

Python

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut Je n'arrive pas à parcourir le JSON
    Bonjour,

    J'ai suivi le tutoriel, pour parcourir un fichier JSON simple ça marche bien, mais je souhaite parcourir un autre fichier et là j'ai des erreurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    # Mon programme en Python
    ## 1) Ouverture fichier JSON
    fichier_json = open('Wiktionnaire_francais_FINAL/json_noms/donnees_anglais_1.json', 'r') # Attention c'est dans le répertoire Python ! 
     
    #2) Lire le JSON sous Python
    import json
    with fichier_json as fichier:
    	data = json.load(fichier)
    	print(data["cmcontinue"])
    Sachant que mon fichier JSON est sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {"batchcomplete":"","continue":{"cmcontinue":"page|41424f5244455552|137363","continue":"-||extracts"},"query":
    {"categorymembers":[{"ns":100,"title":"Annexe:Substantifs en français"},
    {"ns":0,"title":"0-day"},{"ns":0,"title":"06"},
    {"ns":0,"title":"1,2-dichloropropane"},
    {"ns":0,"title":"1,3-dichloropropène"},
    {"ns":0,"title":"1-alpha,2-alpha,3-bêta,4-alpha,5-alpha,6-bêta-hexachlorocyclohexane"},{.......
    Les erreurs :

    Traceback (most recent call last):
    File "<pyshell#144>", line 2, in <module>
    data = json.load(fichier)
    File "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\json\__init__.py", line 268, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
    File "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\json\__init__.py", line 319, in loads
    return _default_decoder.decode(s)
    File "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\json\decoder.py", line 342, in decode
    raise JSONDecodeError("Extra data", s, end)
    json.decoder.JSONDecodeError: Extra data: line 1 column 14010 (char 14009)



    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Il faut que vous regardiez dans le fichier pour savoir pourquoi json.load râle.
    Le fait est que cette bibliothèque ne sait pas décoder une suite d'objets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> import json
    >>> json.loads('{}')
    {}
    >>> json.loads('{}{}')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\py_env\py34-64\lib\json\__init__.py", line 318, in loads
        return _default_decoder.decode(s)
      File "C:\py_env\py34-64\lib\json\decoder.py", line 346, in decode
        raise ValueError(errmsg("Extra data", s, end, len(s)))
    ValueError: Extra data: line 1 column 3 - line 1 column 5 (char 2 - 4)
    >>>
    alors que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> json.loads('[{},{}]')
    [{}, {}]
    >>>
    '[{},{}]' est un seul objet composé de... alors que '{}{}' est la concaténation de 2 objets.

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

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    Merci pour votre réponse.
    Le fichier JSON est un peu complexe, il a cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    { {...},  { [.............] } }, { {...},  { [.............] } }
    si j'utilise json.loads j'ai également une erreur.
    Est-ce que je peux lire u json avec cette forme ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    S'il est de cette forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    { {...},  { [.............] } }, { {...},  { [.............] } }
    alors il ressemble plutôt à:
    vous pourriez voir ce que çà donne en ajoutant un '[' au début et un ']' à la fin.
    Mais c'est du bricolage... les options sont:
    - générer un fichier plus propre,
    - séparer les "records" JSON avant de les soumettre à json.load

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

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    J'ai ajouté des crochets, ça m'a donné un autre liste d'erreurs :
    Traceback (most recent call last):
    File "C:\Program Files (x86)\EasyPHP-12.1\www\my portable files\mon_programme_v0_ouverture_fichier.py", line 8, in <module>
    data = json.load(fichier)
    File "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\json\__init__.py", line 268, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
    File "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\json\__init__.py", line 319, in loads
    return _default_decoder.decode(s)
    File "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\json\decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\json\decoder.py", line 355, in raw_decode
    obj, end = self.scan_once(s, idx)
    json.decoder.JSONDecodeError: Expecting ',' delimiter: line 2 column 14010 (char 14011)



    Comment je peux nettoyer le JSON. C'est un grand fichier ?
    En fait, j'ai obtenu ce fichier à partir d'une API qui donne justement le format JSON, pourquoi n'est-il pas bon ?

    Merci

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par geeka Voir le message
    Comment je peux nettoyer le JSON. C'est un grand fichier ?
    En fait, j'ai obtenu ce fichier à partir d'une API qui donne justement le format JSON, pourquoi n'est-il pas bon ?
    Pour l'instant, la seule chose que vous savez c'est que çà génère des trucs (une "suite d'objets json") de la forme "{} {}" et non "{}, {}" comme vous le mentionniez dans votre post précédent
    *et* que la bibliothèque json de Python n'en veut pas (pas plus d'ailleurs que les validateurs json disponibles "on-line" - ce n'est qu'une information, çà ne veut pas dire que ce sont des constructions illicites).

    Est-ce que vous utilisez "correctement" votre API? N'y-a-t-il pas des possibilités pour rendre le JSON produit plus comestible par la bibliothèque Python?

    S'il faut remettre "en forme", il faut déjà s'assurer qu'on ne va rencontrer que la forme "{} {}" et non pas d'autres bizarreries genre: "[{}, {}] {}". A partir de là ce ne sont que des chaînes de caractères, compter les paires de "{", "}" avec une boucle "for" est un exercice que vous avez dans les tutos pour débutants (le faire avec le module re est à peine plus compliqué)... mais, il faut quand même s'assurer de la variabilité des patterns que vous allez devoir "mouliner" ne serait-ce que pour "tester" que çà fait bien ce que vous attendez sur des exemples "simples".

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

  7. #7
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    Salut,

    J'ai trouvé où était le souci! C'est bien dans le fichier JSON. La structure n'est pas bonne, il manque des virgules, c'est dû au fait que lorsque j'ai récupéré les données par l'API (qui permet de ne récupérer que 500 articles à la fois), j'en ai récupéré plus, mais il ne l'a pas mis en forme.
    Du coup, en rajoutant des virgules ça marche.

    Merci beaucoup pour votre aide.

    J'aurais une autre question :
    Je souhaite récupérer une donnée au tant que variable. Je n'y arrive pas.
    J'ai cette erreur :
    TypeError: list indices must be integers or slices, not str
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    import json         
     
    fichier_json = open(donnees_francais_1.json.', 'r', encoding="utf-8") 
    with fichier_json as fichier:
       data = (json.load(fichier))      
       data (['title'])

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par geeka Voir le message
    J'aurais une autre question :
    Je souhaite récupérer une donnée au tant que variable. Je n'y arrive pas.
    J'ai cette erreur :
    TypeError: list indices must be integers or slices, not str
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    import json         
     
    fichier_json = open(donnees_francais_1.json.', 'r', encoding="utf-8") 
    with fichier_json as fichier:
       data = (json.load(fichier))      
       data (['title'])
    Votre variable "data" est associée à un objet composé de "list" et de "dict". Lorsque vous écrivez data (['title']) outre que vous devriez avoir une erreur du genre TypeError: 'XXXX' object is not callable, il n'y a que vous pour savoir comment est construit "data" et comment y aller chercher la clef "title": on ne peut pas vous aider.
    note: "list" et "dict" sont des structures de base et tous les tutos apprennent à vous en servir.

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

  9. #9
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    Merci beaucoup pour votre aide.
    Il fallait que je suive l'arborescence

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/05/2011, 21h35
  2. Je n'arrive pas à parcourir mon tableau $_POST
    Par beegees dans le forum Langage
    Réponses: 7
    Dernier message: 22/03/2009, 11h59
  3. j'arrive pas à parcourir un resultset avec while
    Par une_tite_question dans le forum JDBC
    Réponses: 11
    Dernier message: 12/06/2008, 16h53
  4. scrollbar qui dans les navigateurs n'arrive pas à faire parcourir toute la page
    Par katlinea dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 30/07/2007, 10h02
  5. j'arrive pas a arreter mon thread d'arriere-plan
    Par ms91fr dans le forum Langage
    Réponses: 6
    Dernier message: 06/06/2003, 21h36

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