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 :

Gérer un fichier XML avec Python


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut Gérer un fichier XML avec Python
    Bonjour à tous,

    Je suis un petit nouveau sur ce forum et surtout un débutant en python!

    Bref ce qui m'amène ici c'est une demande d'un petit coup de main pour gérer des fichiers xml avec python.

    En fait je vous explique. En entrée de mon programme pytohn j'ai un fichier XML et un fichier XLS (excel). Dans le fichier XML il y a des infos sur des variables seuil (leur nom, leur valeur initiale, la version de soft dont elles sont issues...). Dans le fichier excel j'ai plusieurs colonnes parmi lesquelles je dois scrutter pour chaque seuil: le nom, la date à laquelle la valeur a été fixé, un champs de commentaire et une justification.

    Le but est donc d'aller lire dans mon fichier excel les champs qui m'intéressent et mettre en forme mes variables comme ça m'arrange (ça j'ai trouvé comment faire).
    Ensuite pour chaque variable seuil il me faut rajouter dans le xml les infos issues d'excel.

    En faisant une manip à la main je connais les lignes que j'ai a rajouter dans mon fichier XML. Mais pour les 3000 variables à faire un programme sera bien plus à même de le faire!!

    Au départ je pensais ouvrir en fichier texte le XML et aller y trouver les emplacement qui vont bien pour rajouter des blocs de xml généré "en dur" dans mon programme mais ça ne me paraît pas très clean comme méthode et l'algo de recherche est assez conséquent car il faut insérer le texte au bon endroit sans rien toucher.

    Mes recherches m'ont conduit vers une API dom ou sax (?), si je en me trompe, qui apparemment possèdent des fonctions pour gérer la hiérarchie d'un fichier XML. J'ai cru y comprendre qu'il me faut alors trouver l'endroit d'insertion et y créer un "fils" via un addchild?

    Est ce que quelqu'un aurait déjà fait ce genre de programme et aurait des exemple de script à me montrer car les seules infos que j'ai trouvé sur le net c'est créer un xml à partir de zéro ce qui est simple mais n'est pas mon cas !

    Merci pour votre aide.

    ffets

  2. #2
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Bonjour et bienvenue sur ce forum

    Pour le xml, python inclus à partir de la version 2.5, la librairie ElementTree, très performante dans sa version en C, cElementTree (cf le benchmark).


    Bonne lecture et à bientôt.
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  3. #3
    Membre habitué Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Points : 131
    Points
    131
    Par défaut
    je crois que beautiful soup gere le xml aussi.
    ca vaut le coup d'aller jeter un coup d'oeil.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Bonjour à tous,

    Tout d'abord merci pour les pistes.
    Cependant je ne comprends pas vraiment ce que je lis. En effet à chaque fois on parle de plug-ins à installer ou de choses comme ça mais je cherche juste comment utiliser une bibliothèque python moi. Alors peut être que je ne suis pas doué je ne sais pas mais ça me paraît bien obscure. Le peu de développement que j'ai déjà fait en python consistait à trouver les bons modules pour avoir les bonnes fonctions.

    Je me suis décidé à installer le "package" elementtree mais toutes les fonctions ne sont pas dedans (par exemple la fonction parse est introuvable).
    Et le problème c'est que je fonctionne avec python 2.5 sur mon poste et cElementTree ne fonctionne qu'avec 2.4.

    J'ai aussi trifouillé Beautiful Soup et cherché sur le net pour son usage mais je crois comprendre que c'est surtout réservé à la lecture de l'HTML.

    Et comme dans ce que j'ai lu ça paraît bien plus dur d'ajouter des caractéristiques à un xml que d'en créer un. Pourtant je croyais que ce format était maintenable par la suite.

    Merci d'éclairer ma lanterne.

    ffets

  5. #5
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Vu sur le site de effbot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import elementtree.ElementTree as ET
    >>> import cElementTree as ET
    >>> import lxml.etree as ET
    >>> import xml.etree.ElementTree as ET # Python 2.5
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par pacificator Voir le message
    Vu sur le site de effbot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import elementtree.ElementTree as ET
    >>> import cElementTree as ET
    >>> import lxml.etree as ET
    >>> import xml.etree.ElementTree as ET # Python 2.5
    Je suis d'accord avec ces phrases. Mais il est aussi écrit ceci :
    "To install from source, simply unpack the distribution archive, change to the distribution directory, and run the setup.py script as follows:"
    Le problème est que quand je vais dans la section download il n'y a aucun zip ou exe dispo pour python 2.5.

    Pacificator je te sens énervé dans ta réponse. Il ne s'agit pas de mauvaise volonté de ma part ou de flemme. J'essaie simplement de comprendre l'installation et l'utilisation de cette bibliothèque. C'est pas évident. Je suis électronicien de formation plutôt qu'infomaticien. Par exemple je en comprends pas à quoi servent les variables avec des "__" devant et derrières ni comment fonctionnent les classes il me faut donc les éviter dans la mesure du possible.

    -->
    Je corrige mon post. J'ai trouvé comment installer le module "elementtree".
    J'arrive à faire import elementtree donc je pense qu'il est bien pris en compte.

    Il me faut maintenant plancher sur son usage.


    Voilà

    merci pour l'aide. Je continue mes investigations.

    ffets

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    En fait l'installation de elementtree que j'ai faite ne doit pas être correcte car je ne sais pas où faire cette ligne. J'ai essayé dans PythonWin en faisant ceci :

    >>> import os
    >>> os.chdir('C:\\Python25\\Lib\\elementtree-1.2.7-20070827-preview')
    >>> os.getcwd()
    'C:\\Python25\\Lib\\elementtree-1.2.7-20070827-preview'
    >>> python setup.py install
    Traceback ( File "<interactive input>", line 1
    python setup.py install
    $ python setup.py install


    Cependant cela ne fonctionne pas.

    Et je en peux pas non plus faire ces commandes là :

    $ python
    >>> import elementtree.ElementTree as ET
    >>> import cElementTree as ET
    >>> import lxml.etree as ET
    >>> import xml.etree.ElementTree as ET # Python 2.5

    Je ne suis pas doué j'ai l'impression.

    Merci

    ffets

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Il y a déjà un parser XML SAL et DOM dans Python, pas la peine d'installer un module externe :
    - http://docs.python.org/lib/module-xml.dom.html
    - http://docs.python.org/lib/module-xml.dom.minidom.html pour l'utilisation
    - http://docs.python.org/lib/module-xml.sax.html
    - http://docs.python.org/lib/module-xm...ementTree.html

    edit : je n'avais pas encore vu etree, dommage qu'il n'y ait pas d'exemple dans la doc...

  9. #9
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Citation Envoyé par ffets Voir le message
    Pacificator je te sens énervé dans ta réponse
    Pas du tout, pas du tout, je suis en stage donc un peu pressé pour repondre, voilà tout. Desolé de t'avoir donné cette impression.

    ElementTree est integré de base dans python depuis la 2.5, donc rien à installer
    Ca devrait fonctionner en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import xml.etree.ElementTree as ET
    Pour les exemples, voir le site de effbot.

    Je retourne à mes cahiers

    A bientôt
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par pacificator Voir le message
    Pas du tout, pas du tout, je suis en stage donc un peu pressé pour repondre, voilà tout. Desolé de t'avoir donné cette impression.
    Au temps pour moi il y a eu malentendu. Merci Pacificator et Miles pour votre coup de main.

    Oui en effet il y a déjà des choses d'installer avec python 2.5 mais sur le site de effbot ils parlaient de package donc ça m'a induit en erreur. Pas grave, les import fonctionnent maintenant.

    Je lis les infos ici : http://docs.python.org/lib/elementtree-functions.html

    Il est vrai que des exemples auraient amélioré ma compréhension.
    Je vais chercher.

    Mais juste une question il n'y a que moi qui me prends la tête à vouloir rajouter des bouts de xml à un fichier xml déjà existant? Si non, quelle méthode à été la votre?


    Merci en tout cas, j'explore la doc python

    ffets

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Personnellement, j'ai utilisé le parser SAX et DOM à quelques occasions, jamais celui-ci parce que je ne le connaissais pas

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Miles Voir le message
    Personnellement, j'ai utilisé le parser SAX et DOM à quelques occasions, jamais celui-ci parce que je ne le connaissais pas
    Dans l'espoir que je comprenne ton code pourrais-tu me le transmettre stp?
    Car sans exemple je galère vraiment trop avec xml.etree.ElementTree. Je ne comprends rien à ce que je fais. Quand les fonctions ne crient pas sur moi avec des messages d'erreurs tout rouges je ne comprends pas ce qui m'est renvoyé. Donc comme il faut quand même que j'avance car je fais pour mon travail en entreprise je vais sois essayer de comprendre et réutiliser ton code si tu le veux bien soit sinon traiter mon xml comme un fichier texte quelconque...

    Merci

    ffets

  13. #13
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Malheureusement, je ne peux pas te le donner Pas avant quelques mois.

    Tout d'abord, il faut que tu décides quel est le parsuer que tu vas utiliser :
    - DOM si tu dois parcourir plusieurs fois ton XML et que celui-ci n'est pas trop gros
    - SAX s'il est gros, qu'une passe suffit et que tu n'a pas beosin de tous les noeuds
    - etree si ??? je laisse qqn qui le connais répondre à cette question.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Miles Voir le message
    - DOM si tu dois parcourir plusieurs fois ton XML et que celui-ci n'est pas trop gros
    --> Le problème c'est qu'avec une trentaine de lignes par calibration et 3000 calibrations ça fait un gros fichier au final donc dom semble out.


    Citation Envoyé par Miles Voir le message
    - SAX s'il est gros, qu'une passe suffit et que tu n'a pas beosin de tous les noeuds
    --> J'ignore combien de passe il me faudra faire.


    Citation Envoyé par Miles Voir le message
    - etree si ??? je laisse qqn qui le connais répondre à cette question.
    --> Je ne comprends pas grand chose à cette API donc par défaut j'élimine aussi !!


    En tout cas merci. Je pense que je vais partir sur mon traitement de fichier comme si c'était un fichier texte et que je vais venir ajouter des balises en dur dans le fichier. Le tout c'est de pas se tromper d'endroit. Ca sera moins propre que de passer par la voie royale de définir les enfants, les parents et tout mais bon j'ai pas le niveau.

    Merci en tout cas

    ffets

  15. #15
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tu as beosin de faire quoi avec ce fichier XML ?

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Miles Voir le message
    Tu as beosin de faire quoi avec ce fichier XML ?
    En fait les collègues ont des jeux de calibrations (c'est à dire des nopms de variables pour lesquelles on définit une valeur initiale, une date à laquelle on décide e la valeur, une version de soft donnée, une justification, ...).
    Le truc c'est que remplir tout ceci dans le logiciel c'est long car ça fait plein de clics et que quand tu change de soft les valeurs peuvent changer et il faut alors tout refaire pour les calibrations qui changent.
    Donc pour gagner du temps un fichier XML est généré avec toutes calibrations de dedans et puis ensuite les infos susceptibles de changer sont mises dans un fichier Excel (comme la date, les commentaires,...).

    Donc moi je prends le fichier XML de base et je dois y ajouter des champs que j'ai lu dans le fichier Excel.

    Donc en gros je pars d'un fichier XML existant et je veux y ajouter des champs dedans. Je connais tous les champs à rajouter et leur syntaxe et de quoi ils dépendent (leurs parents en xml) mais juste je galère pour les insérer au bon endroit.

    C'est comme qui dirait un carnet d'adresse dans lequel tu t'aperçois que tu rajouterai bien l'âge de chaque personne dedans sauf que dans mon cas y a bien plus de niveau de profondeur pour aller mettre les infos.

    J'spère que j'ai été un peu plus clair c'est pas simple à expliquer.

    merci pour votre aide.

    ffets

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Si tu dois ajouter des choses dans ton XML avec un parseur SAX, tu devras écrire à la main ton fichier XML quoiqu'il arrive. Il te faudra une variable dans laquelle tu stockes tes données.
    Avec un parseur DOM, il sera capable de reconstruire le XML tout seul.

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Miles Voir le message
    Si tu dois ajouter des choses dans ton XML avec un parseur SAX, tu devras écrire à la main ton fichier XML quoiqu'il arrive. Il te faudra une variable dans laquelle tu stockes tes données.
    Avec un parseur DOM, il sera capable de reconstruire le XML tout seul.
    ok merci ça ça m'avance beaucoup Miles car au moins je sais que sax ne répond pas à mon besoin.

    Quitte à devoir stocker le xml dans une vairable je vais prendre l'option que je voulais faire depuis le début parcourir mon fichier en lecture jusqu'à un point qui m'intéresse et copier le bout de lecture dans un fichier, ajouter le code que j'ai à rajouter à la suite puis relire et remettre à la suite la lecture du xml et remettre du code xml géénré, etc jusqu'à ne plus rien avoir à rajouter et avoir lu tout le xml.

    Merci bien,

    Je pense que d'autres questions viendront par la suite du fait de mon algorithme de calcul de texte et tout ça.

    Merci en tout cas j'ai progressé un peu dans mes investigations aujourd'hui.
    @+

    ffets

  19. #19
    Membre habitué Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Points : 131
    Points
    131
    Par défaut
    je ne voudrais pas t'embrouiller encore plus, mais je persiste a croire que beautiful soup repond a tes besoins.

    tu devrais juste faire l'essai de charger un xml, le modifier et le sauver pour voir si ca marche.
    ca devrait te prendre 10 min.

    ca s'installe seulement en rajoutant un fichier, la doc est assez claire.

    http://www.crummy.com/software/Beaut...mentation.html

  20. #20
    Membre averti
    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
    Points : 388
    Points
    388
    Par défaut
    Bonjour,
    Je ne manipules pas beaucoup de xml, mais elementTree me parait assez simple.
    Un fichier test.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <infos>
    <variables>
    <a name="var1" value="1" />
    <b name="var2" value="2" />
    <c name="var3" value="3" />
    </variables>
    </infos>
    Exemple tout simple :
    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
    from xml.etree.ElementTree import (Element,parse,SubElement,dump)
     
    fichier="test.xml"
    tree = parse(fichier)
    root = tree.getroot()
    print root
     
    variables = root.find("variables")
    for v in variables :
        print v
    variables.append(Element("d", {"name":"var4", "value":"4"}))
    #une autre façon de faire
    e=SubElement(variables,"e")
    e.set("name","var5")
    a=variables.find("a")
    a .set("auteur","toto")
    tree.write(fichier)
    dump(tree)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Traitement basique sur fichier xml avec python
    Par raphael75015 dans le forum Général Python
    Réponses: 11
    Dernier message: 22/05/2014, 15h44
  2. Lecture dun fichier xml avec python
    Par merlinerick dans le forum Interfaçage autre langage
    Réponses: 6
    Dernier message: 29/07/2009, 13h49
  3. pickler un fichier XML avec python
    Par Gldev_comp dans le forum Général Python
    Réponses: 1
    Dernier message: 10/07/2008, 05h31
  4. Lire un fichier XML avec Python
    Par eyquem dans le forum Général Python
    Réponses: 2
    Dernier message: 19/12/2007, 13h54
  5. Python probleme pour traitement fichier Xml avec l'API dom
    Par chenimitz dans le forum Général Python
    Réponses: 11
    Dernier message: 30/10/2007, 19h34

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