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 :

recherche chaine entre 2 tags dans un fichier [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut recherche chaine entre 2 tags dans un fichier
    Bonsoir,
    Je souhaite parcourir différents répertoires et récupérer ce qu'il y a entre 2 tags, par exemple ici "\ben" et "\een".
    J'ai tenté qqchose avec find mais la méthode find s'arrête à la première occurrence trouvée, ce qui ne fait pas mon affaire car il peut y en avoir plusieurs dans un même fichier.
    Pourriez-vous me donner une piste ? Il doit exister une méthode simple que je n'ai pas en tête...
    Voici mon code :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #! /usr/bin/env python3
    #-*- coding: utf-8 -*-
     
    import os
    import os.path
    import fnmatch
     
    # Liste des répertoires source
    rep_source=[]
    rep_source.append('/media/marco3/Données 1,9To/Documents_D/Colles/')
     
     
    # liste des types de fichiers
    type_fichier = ['*.tex']
     
     
    def rech_bnf(data):
        result=(False,"")
        beginTag = "\\ben"
        endTag   = "\\een"
     
        beginPos = data.find(beginTag)
        if beginPos == -1:
            result=(False,"")
        else:
            beginPos = data.find(beginTag)
            endPos = data.find(endTag)
            result = (True,str(data[beginPos:endPos+4]))
    #        print(result)
        return result
     
    cpt=0 # compteur fichiers supprimés
     
    nom_destin = "/home/marco3/Bureau/destinat.tex"
    destination = open(nom_destin,'w')
     
    for repertoire in rep_source:
        for root, repertoires, fichiers in os.walk(repertoire):
            # Parcours récursif des types
            for chaque_type in type_fichier:
                # Parcours récursif des répertoires
                for fichier in fnmatch.filter(fichiers, chaque_type):
    #                print(fichier)
                    f = open(os.path.join(root, fichier), 'r').read()
    #                print(f)
                    extrait = ""
                    if rech_bnf(f)[0] == True:
                        extrait = rech_bnf(f)[1]
                        destination.write(extrait)
                        destination.write("\n \n")
    #                    print(extrait)
                    # incrémente le compteur de fichiers ouverts
                    cpt+=1
    destination.close()
     
    print(cpt, ' fichiers ouvert(s)')

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

    Citation Envoyé par marco056 Voir le message
    Pourriez-vous me donner une piste ? Il doit exister une méthode simple que je n'ai pas en tête...
    Penser à ouvrir la documentation de str.find (ou de taper help(str.find)) à la console) pour y trouver qu'elle accepte deux arguments optionnels permettant de donner index de début et de fin où çà doit chercher.

    Bon après, il y a les expressions régulières mais c'est plus compliqué.

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

  3. #3
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Penser à ouvrir la documentation de str.find (ou de taper help(str.find)) à la console) pour y trouver qu'elle accepte deux arguments optionnels permettant de donner index de début et de fin où çà doit chercher.

    Bon après, il y a les expressions régulières mais c'est plus compliqué.

    - W
    Merci, oui, effectivement, j'avais vu cela mais oublié. Reste à mettre cela en place...

  4. #4
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Bon, j'ai avancé mais j'ai cette fois-ci un problème dans ma fonction clean :
    il me reste des "\bnf}{\begin{figurehere}}" dans mon texte final.
    Je sais que c'est un autre problème mais je ne vais pas ouvrir un autre fil alors que c'est peut-être lié...
    Voici mon code :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #-*- coding: utf-8 -*-
     
    import os
    import os.path
    import fnmatch
     
    # Liste des répertoires source
    rep_source=[]
     
    rep_source.append('/media/marco3/Données 1,9To/Documents_D/Colles/')
     
    # liste des types de fichiers
    type_fichier = ['*.tex']
     
    def rech_bnf(data):
        txt_result = "\n"
        result=(False,txt_result)
        beginTag = "\\bnf"
        endTag   = "\\enf"
     
        beginPos = data.find(beginTag)
        if beginPos == -1:
            result=(False,txt_result)
        else:
            while beginPos != - 1:
                beginPos = data.find(beginTag)
                endPos = data.find(endTag)
                txt_result = txt_result + data[beginPos:endPos+4]
                result = (True, txt_result)
                data = data[endPos+4:]
                print(data)
        return result
     
    def clean(data):
        net = []
        net.append("\\bnf}{\\begin{figurehere}}")
        net.append("\\newcommand{\\enf")
        for el in net:
            data_net = data.replace(el, "")
        return data_net
     
    cpt=0
     
    nom_destin = "/home/marco3/Bureau/destinat.tex"
    destination = open(nom_destin,'w')
     
    for repertoire in rep_source:
        for root, repertoires, fichiers in os.walk(repertoire):
            # Parcours récursif des types
            for chaque_type in type_fichier:
                # Parcours récursif des répertoires
                for fichier in fnmatch.filter(fichiers, chaque_type):
    #                print(fichier)
                    f = open(os.path.join(root, fichier), 'r').read()
    #                print(f)
                    extrait = ""
                    if rech_bnf(f)[0] == True:
                        extrait = rech_bnf(f)[1]
                        extrait_net = clean(extrait)
                        print(extrait_net)
                        destination.write(extrait_net)
                        destination.write("\n \n")
    #                    print(extrait)
                    # incrémente le compteur de fichiers ouverts
                    cpt+=1
    destination.close()
     
    print(cpt, ' fichiers ouvert(s)')

  5. #5
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Finalement, je suis passé par replace.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Rechercher et remplacer une chaine à un endroit précis dans un fichier
    Par david2109 dans le forum Shell et commandes POSIX
    Réponses: 17
    Dernier message: 26/08/2013, 22h35
  2. Rechercher valeur entre 2 balises dans un fichier XML
    Par sachadee dans le forum FAQs Windows
    Réponses: 0
    Dernier message: 08/02/2013, 02h13
  3. Réponses: 10
    Dernier message: 07/07/2011, 13h19
  4. [Batch] Rechercher et renommer une chaine de caractère complexe dans un fichier texte
    Par mrcanardwc dans le forum Scripts/Batch
    Réponses: 11
    Dernier message: 24/06/2011, 13h02
  5. Réponses: 14
    Dernier message: 12/12/2007, 17h08

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