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 :

Traitement basique sur fichier xml avec python


Sujet :

Python

  1. #1
    Membre du Club
    Inscrit en
    Mai 2013
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 86
    Points : 42
    Points
    42
    Par défaut Traitement basique sur fichier xml avec python
    bonjour

    novice je recherche des informations suivantes.

    je dispose d'un fichier xml pour lequel je souhaite changer certaines valeurs

    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
    <GeneratedReport>	   
    <Interval Start="2013/09/17 00:00:00.000" End="2013/09/24 23:59:59.000">	   
    <toto Valeur="valeur1"/>	   
    <toto Valeur="valeur2"/>	   
    <toto Valeur="valeur3"/>	   
    <toto Valeur="valeur1"/>	   
    <toto Valeur="valeur2"/>	   
    <toto Valeur="valeur3"/>
    <toto Valeur="valeur1"/>	   
    <toto Valeur="valeur2"/>	   
    <toto Valeur="valeur3"/>
    <toto Valeur="valeur1"/>	   
    <toto Valeur="valeur2"/>	   
    <toto Valeur="valeur3"/>	   
    </Interval>	   
    </GeneratedReport>

    Je souhaite modifier les termes valeur1 par nombre1 valeur2 par nombre2 et ainsi de suite


    j ai réalisé ce petit script afin de remplacer uniquement le terme "valeur1" mais cela ne fonctionne pas .

    En toute vraissemblance , il s'agit de la ligne chaine.replace("valeur1","nombre1") qui doit être erronée ou mal appropriée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
    chaine = "valeur1" # Texte à rechercher
     
    fichier = open("essai.xml","r")
    for ligne in fichier:
        if chaine in ligne:
            print ligne
    chaine.replace("valeur1","nombre1")
    fichier.close()

    par avance merci

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 180
    Points : 321
    Points
    321
    Par défaut Lire la documentation ne fait pas de tort
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chaine = chaine.replace(ancien,nouveau,compteur)
    La méthode replace retourne une copie de l'objet chaine dans lequel toute les occurrences de ancien sont replacées par nouveau

    Rappel : En Python, les chaînes sont pas mutables, donc il n'y a aucune opération de transformation effectuée sur place.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2013
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 86
    Points : 42
    Points
    42
    Par défaut
    re


    je viens de modifier dans mon code comme conseillé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
    chaine = "valeur1" # Texte à rechercher
     
    fichier = open("essai.xml","r")
    for ligne in fichier:
        if chaine in ligne:
            print ligne
    chaine = chaine.replace("valeur1","nombre1)
    fichier.close()

    mai lorsque je l essaie je ne constate aucune modification au sein du fichier

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par raphael75015 Voir le message
    re


    je viens de modifier dans mon code comme conseillé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
    chaine = "valeur1" # Texte à rechercher
     
    fichier = open("essai.xml","r")
    for ligne in fichier:
        if chaine in ligne:
            print ligne
    chaine = chaine.replace("valeur1","nombre1)
    fichier.close()

    mai lorsque je l essaie je ne constate aucune modification au sein du fichier
    Bonjour,

    essayez ceci :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    # on ouvre le fichier en contexte with
    with open("essai.xml", "r+") as fichier:
     
        # on récupère la liste de toutes les lignes
        data = fichier.readlines()
     
        # on fusionne toutes les lignes en une seule str()
        data = "".join(data)
     
        # on remplace la valeur partout
        data = data.replace("valeur1", "nombre1")
     
        # on remet la tête de lecture au début
        fichier.seek(0)
     
        # on réécrit le fichier
        fichier.write(data)
     
        # inutile de refermer le fichier
        # cela se fait automatiquement
        # avec le contexte with
     
    # end with
    puis lisez la doc :

    https://docs.python.org/2.7/library/functions.html#open

    https://docs.python.org/2.7/library/...n-file-objects

    @+.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2013
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 86
    Points : 42
    Points
    42
    Par défaut
    bonjour

    je vous remercie pour votre réponse cela correspond à mon souhait

    Je vais m'atteler à la lecture des documents que vous me préconisez

    cordialement

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par raphael75015 Voir le message
    bonjour

    je vous remercie pour votre réponse cela correspond à mon souhait

    Je vais m'atteler à la lecture des documents que vous me préconisez

    cordialement
    Merci de cliquer sur si votre problème a trouvé réponse.

    @+.

  7. #7
    Membre du Club
    Inscrit en
    Mai 2013
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 86
    Points : 42
    Points
    42
    Par défaut
    Rebonjour


    comme je vous le signalais hier le script qui m'a été donné hier fonctionne correctement.
    Cependant je viens de constater que le problème est un peu plus complexe puisque je ne dois pas modifier toutes les valeurs mais seulement certaines.

    mon fichier à traiter ayant changé
    comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <GeneratedReport>	   
    <Interval Start="2013/09/17 00:00:00.000" End="2013/09/24 23:59:59.000">	   
    <toto nom = "nom10" Valeur="valeur1"/>	   
    <toto nom = "nom20" Valeur="valeur2"/>	   
    <toto nom = "nom30" Valeur="valeur2"/>
    <toto nom = "nom11" Valeur="valeur1"/>	   
    <toto nom = "nom22" Valeur="valeur2"/>	   
    <toto nom = "nom11" Valeur="valeur2"/>	   
    </Interval>	   
    </GeneratedReport>
    En effet, il s'agirait de modifier les termes valeur uniquement pour les valeurs de nom ( nom10, nom11 .. soit tous ceux commençant par nom1*) afin d obtenir le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <GeneratedReport>	   
    <Interval Start="2013/09/17 00:00:00.000" End="2013/09/24 23:59:59.000">	   
    <toto nom = "nom10" Valeur="nombre1"/>	   
    <toto nom = "nom20" Valeur="valeur2"/>	   
    <toto nom = "nom30" Valeur="valeur2"/>
    <toto nom = "nom11" Valeur="nombre1"/>	   
    <toto nom = "nom22" Valeur="valeur2"/>	   
    <toto nom = "nom11" Valeur="nombre2"/>	   
    </Interval>	   
    </GeneratedReport>

    Je ne vois pas comment insérer cette condition dans le script

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par raphael75015 Voir le message
    Rebonjour


    comme je vous le signalais hier le script qui m'a été donné hier fonctionne correctement.
    Cependant je viens de constater que le problème est un peu plus complexe puisque je ne dois pas modifier toutes les valeurs mais seulement certaines.

    mon fichier à traiter ayant changé
    comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <GeneratedReport>	   
    <Interval Start="2013/09/17 00:00:00.000" End="2013/09/24 23:59:59.000">	   
    <toto nom = "nom10" Valeur="valeur1"/>	   
    <toto nom = "nom20" Valeur="valeur2"/>	   
    <toto nom = "nom30" Valeur="valeur2"/>
    <toto nom = "nom11" Valeur="valeur1"/>	   
    <toto nom = "nom22" Valeur="valeur2"/>	   
    <toto nom = "nom11" Valeur="valeur2"/>	   
    </Interval>	   
    </GeneratedReport>
    En effet, il s'agirait de modifier les termes valeur uniquement pour les valeurs de nom ( nom10, nom11 .. soit tous ceux commençant par nom1*) afin d obtenir le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <GeneratedReport>	   
    <Interval Start="2013/09/17 00:00:00.000" End="2013/09/24 23:59:59.000">	   
    <toto nom = "nom10" Valeur="nombre1"/>	   
    <toto nom = "nom20" Valeur="valeur2"/>	   
    <toto nom = "nom30" Valeur="valeur2"/>
    <toto nom = "nom11" Valeur="nombre1"/>	   
    <toto nom = "nom22" Valeur="valeur2"/>	   
    <toto nom = "nom11" Valeur="nombre2"/>	   
    </Interval>	   
    </GeneratedReport>

    Je ne vois pas comment insérer cette condition dans le script
    Bonjour,

    Vous avez plusieurs façons de faire :

    * "à la brutale" => vous faites appel aux expressions régulières avec import re et vous faites un re.sub() à la place du data.replace()

    voir documentation expressions régulières : https://docs.python.org/2.7/library/re.html

    * ligne à ligne => vous parcourez chaque ligne du fichier et vous cherchez la condition if "nom1" in ligne_data: ...

    exemple :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    # on ouvre le fichier en contexte with
    with open("essai.xml", "r+") as fichier:
     
        # on récupère la liste de toutes les lignes
        data = fichier.readlines()
     
        # on parcourt ligne à ligne
        for (index, ligne) in enumerate(data):
     
            # on cherche telle clé précisément
            if "nom1" in ligne:
     
                # on remplace la valeur dans la ligne seulement
                data[index] = ligne.replace("valeur1", "nombre1")
     
            # end if
     
        # end for
     
        # on fusionne toutes les lignes en une seule str()
        data = "".join(data)
     
        # on remet la tête de lecture au début
        fichier.seek(0)
     
        # on réécrit le fichier
        fichier.write(data)
     
        # inutile de refermer le fichier
        # cela se fait automatiquement
        # avec le contexte with
     
    # end with
    doc enumerate() : https://docs.python.org/2.7/library/...html#enumerate

    @+.

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

    Avec un fichier XML vous ne pouvez pas faire d'hypothèses sur ce que contient la ligne.
    Un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <GeneratedReport>	   
    <Interval Start="2013/09/17 00:00:00.000" End="2013/09/24 23:59:59.000">	   
    <toto 
    nom = "nom11" 
    Valeur="valeur1"/> <toto nom = "nom22" Valeur="valeur2"/>	   
    <toto nom = "nom11" Valeur="valeur2"/>	   
    </Interval>
    sera valide!

    Comme des librairies qui "parsent" ce genre de fichier existent déjà, pas la peine d'essayer de coder cela vous même.
    Il faut prendre le temps d'apprendre à les utiliser soit en lisant la documentation soit en regardant les tutos qui vous montrent en général les cas d'utilisation les plus fréquents.

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

  10. #10
    Membre du Club
    Inscrit en
    Mai 2013
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 86
    Points : 42
    Points
    42
    Par défaut
    bonjour et merci de votre aide


    je vais tester cela

  11. #11
    Membre du Club
    Inscrit en
    Mai 2013
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 86
    Points : 42
    Points
    42
    Par défaut
    Un autre soucis se présente à moi

    en réalité il s'agit de modifier plusieurs valeurs lors l'on a sur la ligne le terme nom1.

    J'ai modifié le code comme suit






    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    # on ouvre le fichier en contexte with
    with open("essai.xml", "r+") as fichier:
     
        # on récupère la liste de toutes les lignes
        data = fichier.readlines()
     
        # on parcourt ligne à ligne
        for (index, ligne) in enumerate(data):
     
            # on cherche telle clé précisément
            if "nom1" in ligne:
     
                # on remplace la valeur dans la ligne seulement
                data[index] = ligne.replace("valeur1", "nombre1")
                data[index] = ligne.replace("valeur2", "nombre2")
                data[index] = ligne.replace("valeur3", "nombre3")
            # end if
     
        # end for
     
        # on fusionne toutes les lignes en une seule str()
        data = "".join(data)
     
        # on remet la tête de lecture au début
        fichier.seek(0)
     
        # on réécrit le fichier
        fichier.write(data)
     
        # inutile de refermer le fichier
        # cela se fait automatiquement
        # avec le contexte with
     
    # end with



    Or seule la ligne de commande data[index] = ligne.replace("valeur3", "nombre3") est exécutée


    N'est on pas en mesure de mettre plusieurs ligne de se type dan une boucle if ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par raphael75015 Voir le message
    Un autre soucis se présente à moi
    Or seule la ligne de commande data[index] = ligne.replace("valeur3", "nombre3") est exécutée
    N'est on pas en mesure de mettre plusieurs ligne de se type dan une boucle if ?
    Bonjour,

    c'est normal que vous n'ayez que la 3ème ligne qui soit exécutée : data[index] et ligne ne pointent pas sur la même chaîne de caractères en mémoire.

    chaque fois que vous faites data[index] = ligne.replace("old", "new") vous modifiez data[index] mais PAS ligne, qui elle, reste inchangée.

    autrement dit, lorsque vous faites :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                # on remplace la valeur dans la ligne seulement
                data[index] = ligne.replace("valeur1", "nombre1") # data[index] = "nombre1" si match et ligne reste inchangée
                data[index] = ligne.replace("valeur2", "nombre2") # data[index] = "nombre2" si match et ligne reste inchangée
                data[index] = ligne.replace("valeur3", "nombre3") # data[index] = "nombre3" si match et ligne reste inchangée
    pour faire des modifications successives, vous devriez plutôt écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                # on remplace la valeur dans la ligne seulement
                data[index] = ligne.replace("valeur1", "nombre1") # data[index] = "nombre1" si match et ligne reste inchangée
                data[index] = data[index].replace("valeur2", "nombre2") # data[index] = "nombre2" si match
                data[index] = data[index].replace("valeur3", "nombre3") # data[index] = "nombre3" si match
    et si on a un gros poil dans la main, on peut aussi écrire ça comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                # on remplace la valeur dans la ligne seulement
                data[index] = ligne.replace("valeur1", "nombre1").replace("valeur2", "nombre2").replace("valeur3", "nombre3")
    du fait que chaque méthode str.replace() retourne elle-même un objet str(), ça reste jouable.

    mais bon, toutes ces façons de faire sont - comme le dit wiztricks - spéculatives et particulièrement aléatoires, je vous les donne pour que vous vous familiarisiez avec les boucles et le brassage des chaînes de caractères dans un fichier XML généré automatiquement et formaté de manière rigide, mais normalement on devrait toujours traiter les données XML via une librairie du type xml.etree.ElementTree - voir doc : https://docs.python.org/2.7/library/...ementtree.html

    si vous voulez vraiment traiter un fichier XML de manière rigoureuse, c'est par xml.etree.ElementTree que vous devrez passer (après avoir attentivement étudié la doc, évidemment).

    c'est moins intuitif que de bidouiller, mais c'est plus juste.

    @+.

Discussions similaires

  1. Lecture dun fichier xml avec python
    Par merlinerick dans le forum Interfaçage autre langage
    Réponses: 6
    Dernier message: 29/07/2009, 13h49
  2. 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
  3. Lire un fichier XML avec Python
    Par eyquem dans le forum Général Python
    Réponses: 2
    Dernier message: 19/12/2007, 13h54
  4. Gérer un fichier XML avec Python
    Par ffets dans le forum Général Python
    Réponses: 25
    Dernier message: 31/10/2007, 14h47
  5. Java et XML : Traitement d'un fichier XML avec JAVA
    Par nice dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 18/05/2006, 21h24

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