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 :

Comment supprimer des occurrences dans un fichier


Sujet :

Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Comment supprimer des occurrences dans un fichier
    Bonjour,

    Je dois nettoyer un fichier pour en garder quelques informations. Mon code es le suivant:

    #Création d'une liste. Les éléments de la liste doivent être supprimés
    chaines= ['<Root>',
    '<Article>',
    '<Guide level="1">',
    '<level="2">',
    '<level="3">',
    '<level="4">',
    '<Titre>',
    '</Titre>',
    '</Paragraphe>',
    '<Paragraphe>',
    '<Gras>',
    '</Gras>']
    # Ouverture du fichier
    fichier = open('C:/FRA/Imprimable.xml', 'r')

    # Parcours du fichier source pour supprimer les chaînes contenues dans ma liste
    for line in fichier:
    for chaine in chaines:
    if chaine in line:
    fichier.remove(chaine)
    fichier.close()

    Mon problème se situe au niveau de "fichier.remove(chaine)" (je pense). Au lieu de supprimer que les éléments du texte contenu dans ma liste, le programme me vide l'intégralité du fichier.
    Qu'est que j'ai mal défini dans mon programme.
    L'objectif est de nettoyer un fichier xml et ne garder que le texte pour ensuite pouvoir compter le nombre de mots restant dans le fichier.
    Merci de votre compréhension.

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Avec replace() ce sera plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    fichier = open('C:/FRA/Imprimable.xml', 'r')
    txt = fichier.read()
    for chaine in chaines:
        txt.replace(chaine, '')

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Nouveau code après modificaion
    Voici mon nouveau code en prenant en compte vos suggestions:

    chaines= ['<Root>',
    '<Article>',
    '<Article_Guide level="1">',
    '<Article_Guide level="2">',
    '<Article_Guide level="3">',
    '<Article_Guide level="4">',
    '<Titre>',
    '</Titre>',
    '</Paragraphe>',
    '<Paragraphe>',
    '<Gras>',
    '</Gras>']
    fichier = open('C:/FRA/Imprimable.xml', 'r')
    txt = fichier.read()
    for chaine in chaines:
    txt.replace(chaine, '')
    fichier.close()

    Le programme ne plante pas mais ne fait rien non plus. Manque t-il encore quelque chose à votre avis.

    Merci

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Oui mais, c'est le texte txt qui est changé par le fichier. Celui-ci, de toutes façons est ouvert en lecture pas en écriture.

    Fais un print avant et un autre après pour voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    txt = fichier.read()
    print txt
    for chaine in chaines:
        txt.replace(chaine, '')
    print txt

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    J'ai changé un peu mon code en ouvrant un fichier destination pour écriture qui doit recevoir le texte modifié.
    Ce que je n'arrive pas à comprendre, c'est qu'au lieu de récupérer dans ce nouveau fichier mon texte de départ nettoyé de tous les éléments de ma liste "chaines", j'ai l'impression que toutes les lignes de fichiers de départ sont multipliés par autant d'éléments qu'il y a dans ma liste dans le fichier destination.
    Non seulement mon texte n'est pas nettoyé mais il devient beaucoup plus volumineux. Par contre ça semble fonctionner si j'ai un seul élément dans la liste.
    La création de liste est elle la meilleure façon pour aborder ce problème?


    chaines= ['<Root>',
    '<Article>',
    '<Article_Guide level="1">',
    '<Article_Guide level="2">',
    '<Article_Guide level="3">',
    '<Article_Guide level="4">',
    '<Titre>',
    '</Titre>',
    '</Paragraphe>',
    '<Paragraphe>',
    '<Gras>',
    '</Gras>']
    fichier=open('C:/FRA/Imprimable.xml', 'r')
    fichierD=open('C:/FRA/Imprimable2.xml', 'w')
    txt = fichier.read()
    for chaine in chaines:
    ts=txt.replace(chaine, '')
    fichierD.write(ts)
    fichier.close()
    fichierD.close()

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Il y a des solutions bien plus propre pour modifier, construire ou parser un fichier XML comme par exemple lxml
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    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 la balise "code", c'est quand même mieux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    txt = fichier.read()
    for chaine in chaines:
         ts=txt.replace(chaine, '')
    le "str" étant immutable, txt n'est jamais modifié.
    Le contenu de "ts" à la sortie sera txt.replace('</Gras>', '') txt étant ce qui a été lu.

    Votre fichier étant un document XML, "virer" les balises (récupérer le text) pourrait être fait avec la bibliothèque adhoc: pas besoin de connaître les balises!

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

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    L'objectif ici c'est tout simplement de virer toutes les balises et ne garder que le texte. Je veux juste pouvoir compter le nombre de mots contenu dans mes fichiers sans les balises pour des besoins statistiques. La structure xml du fichier ne m'intéresse pas.

  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,

    Citation Envoyé par zeng49 Voir le message
    L'objectif ici c'est tout simplement de virer toutes les balises et ne garder que le texte. Je veux juste pouvoir compter le nombre de mots contenu dans mes fichiers sans les balises pour des besoins statistiques. La structure xml du fichier ne m'intéresse pas.
    Je pense avoir compris ce que vous vouliez faire: le "quoi".
    Ma question porte sur le "comment".
    Un document XML ayant une structure hiérarchique: on peut parcourir ses éléments (nœuds) et en extraire le "texte" sans en connaître "tags"/"balises".
    Dit autrement, pour récupérer le "text", on peut coder cela ainsi:

    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
    import xml.etree.ElementTree as et
     
    def g_text(node):
     
        for e in node.iter():
            if e.text:
                text = e.text.strip()
                if text:
                    yield text
            g_text(e)
     
    with open('C:/FRA/Imprimable.xml', 'r') as f:        
         tree = et.XML(f.read())
         text = ' '.join(list(g_text(tree)))
    print (text)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/08/2008, 15h25
  2. Réponses: 1
    Dernier message: 28/01/2006, 12h36
  3. Réponses: 3
    Dernier message: 27/06/2005, 16h24
  4. [D6] Comment remplacer des chaînes dans un fichier ?
    Par fabien25 dans le forum Langage
    Réponses: 4
    Dernier message: 15/06/2005, 13h37
  5. Comment changer des mots dans un fichier?
    Par ptitbonum dans le forum Linux
    Réponses: 5
    Dernier message: 07/04/2004, 23h42

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