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 :

Parser une chaine


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2003
    Messages : 20
    Par défaut Parser une chaine
    Bonjour,

    J'ai une chaine du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {authorized:true,authorizedInFullscreen:true,channelAuthorized:true,orangeOnlyAuthorized:true}
    J'aimerais récupérer les valeurs dans un dictionnaire (par exemple).

    J'ai pensé à utiliser JSON :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    string = {authorized:true,authorizedInFullscreen:true,channelAuthorized:true,orangeOnlyAuthorized:true}
    dic = json.loads(string)
    print dic
    Mais j'obtiens une exception : « NameError: name 'true' is not defined ». Je pense qu'il faut utiliser l'argument « parse_constant » de la fonction loads() mais je ne sais pas comment faire.

    Quelqu'un peut-il m'aiguiller ?

    Merci

  2. #2
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    true n'existe pas, mais True oui

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Bonsoir,



    « NameError: name 'true' is not defined »
    parce que True étant l’une des deux valeurs booléennes, true est censé être une étiquette (une ’variable’, en terme incorrect)
    Or aucun objet d’étiquette true n’a dû être défini auparavant.



    Ce que tu présentes comme une chaîne a des accolades devant et derrière. je suppose que c’est une erreur et que tu voulais parler d’une chaîne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ch = 'authorized:true,authorizedInFullscreen:true,'\
         +'channelAuthorized:true,orangeOnlyAuthorized:true'

    Ne connaissant pas le module json, je propose ceci pour obtenir un dictionnaire à partir de la chaîne ch ci-dessus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ch = 'authorized:true,authorizedInFullscreen:true,'\
         +'channelAuthorized:true,orangeOnlyAuthorized:true'
     
    d = dict( (x,y=='true') for x,y in ( u.split(':') for u in ch.split(',') ))
    print d
    print type(d)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {'orangeOnlyAuthorized': True, 'channelAuthorized': True, 'authorized': True, 'authorizedInFullscreen': True} 
    <type 'dict'>




    Si les accolades sont bien présentes il suffit de prendre ch[1:-1]

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

    On fait ce qu'on veut mais les chaines qui ressemblent à du JSON ont du être produites par une _chose_ qui produit de drôles objets JSON(*) ou... ils ont mal voyagé... Enfin, il faut remonter à la source avant de ramer pour reconstruire ce qui a été perdu - ici les quotes mais ailleurs ca va être quoi?

    JSON c'est pas excessivement compliqué mais, faire un parseur qui s'adapte aux erreurs humaines c'est du code beurk de chez beurk - Python ou pas.

    Cordialement,
    - W
    (*) Il n'est pas dit que la chose qui produise cela parle JSON.... Mais dans ce cas, que produit elle?
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Mais je n’ai pas ramé ! Je m’amuse.

    C’est bien parce que je n’ai pas eu envie de ramer comme un Argonaute avec JSON que j’en suis resté à une compréhension disons toute personnelle du problème.

    Je ne savais pas si je répondais correctement, et j’avoue que cette préoccupation m’est sortie de l’esprit et que je me suis juste amusé avec ce défi: tiens, et si j’avais à faire ça, comment je ferais ? Ça m’a fait réviser les manières de construire un dictionnaire. Et ensuite j’en fais profiter, au cas où...

    C’est sûr que ça donne une réponse carrément en dehors du vrai problème et un peu égoïste (ou parasite ? est-ce ce que tu as voulu dire ?), mais si je fais une mauvais réponse, l’autre il a qu’à pas faire une mauvaise question.

    Quant à toi, wiztricks, tu ne te contentes plus de faire les bonnes réponses, tu reconstitues les bonnes questions. C’est pas de jeu.





    Au fait, le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import json
    json_string = '''{
        "authorized": true,
        "authorizedInFullscreen": true,
        "channelAuthorized": true,
        "orangeOnlyAuthorized": true
    }'''
    print json.loads(json_string)
    me produit une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Traceback (most recent call last):
      File "D:/Python264/json.py", line 1, in <module>
        import json
      File "D:/Python264\json.py", line 9, in <module>
        print json.loads(json_string)
    AttributeError: 'module' object has no attribute 'loads'


    Mais ça ne va pas m’empêcher de dormir, j’ai plein d’autres sujets plus importants à voir.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Quant à toi, wiztricks, tu ne te contentes plus de faire les bonnes réponses, tu reconstitues les bonnes questions. C’est pas de jeu.


    Traceback (most recent call last):
    File "D:/Python264/json.py", line 1, in <module>
    import json
    File "D:/Python264\json.py", line 9, in <module>
    print json.loads(json_string)
    AttributeError: 'module' object has no attribute 'loads'
    Tu as nommé ton script json.py et l'import trouve autre chose que la bibliothèque JSON que tu espères.
    De temps en temps, il faut dormir un peu...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2003
    Messages : 20
    Par défaut
    Citation Envoyé par N.tox Voir le message
    true n'existe pas, mais True oui
    En JSON, si.

    Citation Envoyé par wiztricks
    Question: qui vous a vendu ces chaines de caractères pour du JSON?
    Le moteur DWR utilisé par Orange pour sa WebTv. Comme c'est du javascript, j'ai pensé que c'était du JSON et ça y ressemble très fortement.
    Un exemple de réponse de ce moteur :
    throw 'allowScriptTagRemoting is false.';
    //#DWR-INSERT
    //#DWR-REPLY
    dwr.engine._remoteHandleCallback('0','0',{authorized:true,authorizedInFullscreen:true,channelAuthorized:true,orangeOnlyAuthorized:true});
    J'ai d'ailleurs vaguement survolé la source de ce moteur, histoire de trouver comment cette réponse est parsée mais je n'ai rien trouvé.

    Sinon, je m'en suis sorti sans passer par le module JSON, puisque ma chaîne n'est pas vraiment du JSON, par l'absence de quote :

    La chaine est du type dwr.engine._remoteHandleCallback('0','0',{authorized:true,authorizedInFullscreen:true,channelAuthorized:true,orangeOnlyAuthorized:true}); maintenant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def pseudo_JSON_decode(self, string) :
        pattern = r"dwr.engine._remoteHandleCallback\([^,]*,[^,]*,{([^)]*)}\)"
        match_obj = re.search(pattern, string)
        json_obj = match_obj.group(1)
     
        dic = {}
        for json_val in json_obj.split(',') :
            value = json_val.split(':')
            dic[value[0]] = value[1]
     
        return dic
    Donc c'est un peu ce que eyquem proposait.

    NB: J'ai même pas pu tenir compte de vos réponses puisque je n'ai même pas reçu un seul mail m'informant qu'il y avait eu une réponse dans ce Thread. Pourtant, je « suis » la discussion. Ça n'a pas dû passer l'antispam. Du coup : désolé

    Mais merci !

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Tu peux remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        dic = {}
        for json_val in json_obj.split(',') :
            value = json_val.split(':')
            dic[value[0]] = value[1]
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        dic = {}
        for json_val in json_obj.split(',') :
            value = json_val.split(':')
            dic.update([value])
    et donc par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        dic = {}
        for json_val in json_obj.split(',') :
            dic.update([json_val.split(':')])


    Encore un petit coup, et on tombe sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        dic = {}
        dic.update([json_val.split(':') for json_val in json_obj.split(',')])


    Et à ce moment là il est clair que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dic = dict([json_val.split(':') for json_val in json_obj.split(',')])



    et j’irais jusqu’à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def pseudo_JSON_decode(self, string) :
        pattern = r"dwr.engine._remoteHandleCallback\([^,]*,[^,]*,{([^)]*)}\)"
        match_obj = re.search(pattern, string)
     
        return dict([json_val.split(':') for json_val in match_obj.group(1).split(',')])

  9. #9
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2003
    Messages : 20
    Par défaut
    Et ça apporte quelque chose en terme d'execution ? Parce que je trouve que ça rend le code moins lisible, quand même.

    Ça prend ptet un chouilla moins de mémoire ?

    Merci

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

    Je comprends mieux, mais côté idée... A part faire sale, je sèche un peu.

    Ce que vous (semblez) récupérez est un objet JavaScript depuis un .js qui est un script comme un script Python peut l'être.

    La forme '{ "blabla":true,' est un string... sa représentation sérialisée que l'on peut echanger et qui est JSON elle.
    On passe de JS a JSON avec JSON.stringify...
    Et pour la réciproque, on fait eval ou mieux JSON.parse.

    - W
    PS: Dans votre transformation, n'oubliez pas 'true' => True
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut
    Rapidement, je me poserais la question: est ce que la chaine "{authorized:true, authorizedInFullscreen:true, channelAuthorized:true, orangeOnlyAuthorized:true}" est du JSON?
    Enfin, dans la pratique, vous entrez cela dans JSONLint qui vous dira cela...
    Bon, il n'est pas content le bougre

    Un truc JSON devrait être plutot de la forme "authorized":true, ...
    Donc, si nous disions cela en Pythonn ca donnerait:
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import json
    json_string = '''{
        "authorized": true,
        "authorizedInFullscreen": true,
        "channelAuthorized": true,
        "orangeOnlyAuthorized": true
    }'''
    print json.loads(json_string)

    Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ python ex_json.py 
    {u'orangeOnlyAuthorized': True, u'channelAuthorized': True, u'authorized': True, u'authorizedInFullscreen': True}
    i.e, nous avons bien transformé du JSON dans un dict Python

    Question: qui vous a vendu ces chaines de caractères pour du JSON?
    - 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. Parser une chaine de caractère
    Par Nasky dans le forum C++
    Réponses: 7
    Dernier message: 04/12/2006, 19h37
  2. Parser une chaine de doubles
    Par Ange44 dans le forum C++
    Réponses: 9
    Dernier message: 28/06/2006, 13h12
  3. Réponses: 9
    Dernier message: 30/11/2005, 18h18
  4. Parser une chaine
    Par TieumB dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/01/2005, 11h20
  5. Parser une chaine en shell script
    Par Gogoye dans le forum Linux
    Réponses: 10
    Dernier message: 19/07/2004, 17h49

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