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 :

Cherche une méthode ou fonction permettant de reformater un string


Sujet :

Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 2
    Par défaut Cherche une méthode ou fonction permettant de reformater un string
    Hello,

    J'espère qu'il n'y a pas déjà un thread à ce sujet

    En fait, je dois écrire un programme qui se connecte à un webservice et enregistre dans MySQL les valeurs retournées par l'API. Mon principal problème pour l'instant est que je ne sais pas comment reformater et parcourir le "string" (normalement du XML) que l'API me renvoie.

    '<?xml version="1.0" encoding="utf-8"?>\n<sstats>\n\n<ss> <c_name>Premier Test</c_name> <c_id>140</c_id> <primary_group>CCC_14330906</primary_group> <is>0</is> <cs>2</cs> <lds>0</lds> <sr>0</sr> <ns></ns> <c>0</c> <epc>0</epc></ss>\n\n</sstats>\n\n'

    Est ce que je dois reformater le "string" en remplaçant les "\n" par des vrais retour-chariots ou bien c'est possible de le parcourir en le laissant comme ca.

    Si vous avez des idées, bout de codes, liens ou recommendations, je suis preneur.

    Merci beaucoup

  2. #2
    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
    Bienvenue wouzou,

    - C'est quoi des «vrais retour-chariots» ?

    - Bien sûr que c'est possible de parcourir la chaine en la laissant comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ch = '<?xml version="1.0" encoding="utf-8"?>\n<sstats>\n\n<ss> <c_name>Premier Test</c_name> <c_id>140</c_id> <primary_group>CCC_14330906</primary_group> <is>0</is> <cs>2</cs> <lds>0</lds> <sr>0</sr> <ns></ns> <c>0</c> <epc>0</epc></ss>\n\n</sstats>\n\n'
    for caractere in ch:
        pass
    Ce programme ne produit rien mais il fait bien une petite promenade le long de la chaine.

    Ceci pour dire que tant que ce qui doit être fait et obtenu sur la chaine n'est pas défini, la question de savoir si on travaille sur la chaine elle-même ou sur un autre objet issu de la chaine n'a pas de sens.
    À mon sens.


    - Mais pour commencer à répondre à ta question:

    Tu peux obtenir une liste à partir de ta chaine,
    soit par ch.splitlines() qui enlève les '\n'
    soit par ch.splitlines(True) qui les conserve.

    Mais pour ma part, je suis peu à peu venu à l'idée que quand on peut traiter une chaine directement en tant que chaine, sans passer par une transformation en liste ou autre chose, c'est informatiquement plus naturel et plus rapide.
    On peut le faire
    soit exclusivement avec des méthodes de chaine,
    soit en recourant aux regular expressions qui ne sont pas toujours moins rapides que les premières,
    soit en mélangeant les deux.
    Avec Python, de toutes façons il y a toujours une solution, et en plus c'est fastoche !

    Dis nous donc ce que tu veux faire à partir de ta chaine, et nous pourrons te fournir de plus amples indications. Pour ma part, je chercherai en premier des solutions basées sur un parcours de la chaine telle quelle.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 2
    Par défaut
    Merci pour ta réponse eyquem.

    En fait, j'aimerais utiliser un parser XML et parcourir le résultat en faisant :

    Tant que Noeud {
    Lire prochain noeud
    Générer une requête SQL de type INSERT
    Exécuter la requête
    }

    Ca serait le plus pratique pour moi mais le python est tout nouveau pour moi et donc je ne sais pas quelle librairie utiliser et comment le faire.

  4. #4
    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
    Je n'utilise pas de parsers, c'est trop compliqué pour moi. Je fais mes propres bidouilles.
    Ce qui fait que je ne sais pas comment se présente un résultat de parser XML. C'est une liste ? Ça comporte quelles données ?

    La deuxième chose c'est que je ne comprends pas bien
    Tant que Noeud {
    Lire prochain noeud
    Générer une requête SQL de type INSERT
    Exécuter la requête
    }
    Ça ressemble à du C ou du C++, bien que je ne connaisse rien à ces langages.
    Qu'appelles-tu Noeud ? Ça a à voir avec les fins de lignes ?

    J'arriverais mieux à te répondre si je savais ce que tu veux obtenir à partir de ta chaine.
    Tu veux en extraire les données nécessaires à la constitution de ta requête INSERT ?
    Sinon il faudra que des renforts prennent le relais.

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Si tu veux lire du XML, tu peux utiliser ElementTree qui te permettra de transformer ton code XML en un arbre.

  6. #6
    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
    Voilà le renfort. Ouf

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2008
    Messages : 76
    Par défaut
    Sinon, tu peux utiliser le module xml.dom et xml.minidom pour reconstruire ta structure xml selon le Document Object Model.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # -*- coding:latin-1 -*-
     
    from xml.dom import minidom
     
    docuXML = """<?xml version="1.0" encoding="utf-8"?><sstats><ss> <c_name>Premier Test</c_name> <c_id>140</c_id> <primary_group>CCC_14330906</primary_group> <is>0</is> <cs>2</cs> <lds>0</lds> <sr>0</sr> <ns></ns> <c>0</c> <epc>0</epc></ss></sstats>"""
     
    data = minidom.parseString(docuXML)
     
    print data.getElementsByTagName('c_name')[0].firstChild.nodeValue
    Pour bien te former regarde les cours et tutoriels pour apprendre Python et la FAQ Python.

  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
    J'aurais dû taper 'nœud' dans google avant de poser une question idiote. Enfin bon....
    J'ai trouvé des explications sur un site.

    Je comprends donc mieux le problème et je propose ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # -*- coding:latin-1 -*-
    t ='<?xml version="1.0" encoding="utf-8"?>\n<sstats>\
    \n\n<ss> <c_name>Premier Test</c_name> <c_id>140</c_id> <prim\
    ary_group>CCC_14330906</primary_group> <is>0</is> <cs>2</cs>\
    <lds>0</lds> <sr>0</sr> <ns></ns> <c>0</c> <epc>0</epc></ss>\n\n</sstats>\n\n'
     
    for x,y in re.findall(r'(?<=<)(.+?>)([^<.]+?)</\1',t):
        print ('<'+x).rjust(17)+'   :  \t',y
    et ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # -*- coding:latin-1 -*-
    t ='<?xml version="1.0" encoding="utf-8"?>\n<sstats>\
    \n\n<ss> <c_name>Premier Test</c_name> <c_id>140</c_id> <prim\
    ary_group>CCC_14330906</primary_group> <is>0</is> <cs>2</cs>\
    <lds>0</lds> <sr>0</sr> <ns></ns> <c>0</c> <epc>0</epc></ss>\n\n</sstats>\n\n'
     
    import re
    for u,v in re.findall(r'(?<=<)(.+?>)(.+?)</\1',t):
        print '\n* Les noeuds enfants de <'+u,'  de texte :'
        print [v],'\n* sont les suivants:\n'
        for x,y in re.findall(r'(?<=<)(.+?>)([^<.]+?)</\1',t):
            print ('<'+x).rjust(17)+'   :  \t',y
    qui suffisent peut être à répondre de façon assez simple à ton problème, sans recourir à minidom.
    L'avantage de findall() à mon sens est que cette fonction traite le string en une seule passe, sans avoir besoin de le transformer auparavant.
    Mais bon, il faut recourir au module re aussi....

    Il est sûr que si les besoins sont plus importants, le recours à minidom s'impose.

  9. #9
    Membre chevronné
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Par défaut
    Bonjour,
    Avec etree :
    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
    from xml.etree.ElementTree import parse
    import StringIO
     
    maString='<?xml version="1.0" encoding="utf-8"?>\n<sstats>\n\n<ss> <c_name>Premier Test</c_name> <c_id>140</c_id> <primary_group>CCC_14330906</primary_group> <is>0</is> <cs>2</cs> <lds>0</lds> <sr>0</sr> <ns></ns> <c>0</c> <epc>0</epc></ss>\n\n</sstats>'
    docXML=StringIO.StringIO("".join(maString.split('\\n')))
    tree = parse(docXML)
     
    for elem in tree.getiterator():
        print elem
     
    def getChildren(parent):
        for child in parent.getchildren():
            print parent,child
            getChildren(child)
     
    root=tree.getroot()
    getChildren(root)

Discussions similaires

  1. cherche une méthode
    Par philguio dans le forum Windows Forms
    Réponses: 1
    Dernier message: 08/03/2009, 19h33
  2. [Wiki] Cherche une classe pour fonctions de base d'un wiki
    Par Delphy113 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 11/06/2008, 18h06
  3. je cherche une méthode
    Par ulysse031 dans le forum Langage
    Réponses: 30
    Dernier message: 22/02/2007, 11h44
  4. je cherche une méthode
    Par ulysse031 dans le forum Langage
    Réponses: 10
    Dernier message: 05/02/2007, 14h48
  5. Je cherche une méthode de collision
    Par ptitbonum dans le forum Physique
    Réponses: 5
    Dernier message: 21/09/2004, 14h20

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