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 :

récupérer une partie de ligne d'un fichier texte [Python 3.X]


Sujet :

Python

  1. #1
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Mars 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2022
    Messages : 10
    Par défaut récupérer une partie de ligne d'un fichier texte
    Bonjour,
    J'ai besoin de récupérer une partie de chaque ligne d'un fichier texte. La partie de ligne qui m'intéresse se trouve entre 2 mots (après frets et avant fingers) qui sont présents sur chaque ligne du texte.
    J'aimerais pouvoir la récupérer mais je n'y parviens pas.

    {define: A7 frets 0 1 0 0 fingers 0 0 0 0}
    {define: A71 frets 0 4 5 4 fingers 0 0 0 0}
    {define: A72 frets 6 4 3 0 fingers 0 0 0 0}
    {define: A73 frets 6 7 0 0 fingers 0 0 0 0}
    {define: A7u frets 0 9 9 7 fingers 0 0 0 0}
    {define: A7u1 frets 9 7 9 0 fingers 0 0 0 0}
    {define: A7a frets 2 4 3 4 fingers 0 0 0 0}
    {define: A7a1 frets 6 7 5 7 fingers 0 0 0 0}
    {define: A7a2 frets 9 9 9 10 fingers 0 0 0 0}

    J'ai fini par y arriver en découpant les lignes

    Merci d'avance pour votre aide

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

    Citation Envoyé par a1fr3d13 Voir le message
    J'aimerais pouvoir la récupérer mais je n'y parviens pas.
    On ne se déplace pas alors si vous ne racontez pas comment vous avez imaginé vous y prendre et le code que vous avez essayé pour faire çà pas facile de savoir sur quoi vous butez.
    note: une solution avancée pour faire ça est de passer par les expressions régulières.

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

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Bonjour,

    avec une expression régulière, c'est tout à fait faisable et sans soucis, si vous êtes sûr que vos deux mots sont systématiquement présents sur chaque ligne.

    Sont-ce vraiment des mots ou bien des caractères du genre point-virgule ou autre qui font office de motifs de recherche pour récupérer ce qu'il y a entre eux ?

  4. #4
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Mars 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2022
    Messages : 10
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    On ne se déplace pas alors si vous ne racontez pas comment vous avez imaginé vous y prendre et le code que vous avez essayé pour faire çà pas facile de savoir sur quoi vous butez.
    note: une solution avancée pour faire ça est de passer par les expressions régulières.

    - W
    Merci, j'ai modifié le texte de ma demande, je regarde les expression régulières de plus près

  5. #5
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Mars 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2022
    Messages : 10
    Par défaut
    Citation Envoyé par Arioch Voir le message
    Bonjour,

    avec une expression régulière, c'est tout à fait faisable et sans soucis, si vous êtes sûr que vos deux mots sont systématiquement présents sur chaque ligne.

    Sont-ce vraiment des mots ou bien des caractères du genre point-virgule ou autre qui font office de motifs de recherche pour récupérer ce qu'il y a entre eux ?
    Merci, j'ai modifié le texte de ma demande, je regarde les expression régulières de plus près

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par a1fr3d13 Voir le message
    Merci, j'ai modifié le texte de ma demande, je regarde les expression régulières de plus près
    Et vous avez essayé quoi jusqu'ici?

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

  7. #7
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Mars 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2022
    Messages : 10
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Et vous avez essayé quoi jusqu'ici?

    - W
    J'ai réussi:
    split puis j'ai récupéré les éléments qui m'intéressaient mais je pense qu'il doit y avoir plus simple

  8. #8
    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
    Une idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ch = "{define: A7 frets 0 1 0 0 fingers 0 0 0 0}"
     
    start = "frets "
    end = " fingers"
     
    search1 = ch[ch.find(start):ch.find(end)+len(end)]
    print(search1)
     
    search2 = ch[ch.find(start)+len(start):ch.find(end)]
    print(search2)

  9. #9
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 219
    Par défaut
    Hello,
    en utilisant les expressions régulières :
    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
     
    import re
    chaineTest = """{define: A7 frets 0 1 0 0 fingers 0 0 0 0}
    {define: A71 frets 0 4 5 4 fingers 0 0 0 0}
    {define: A72 frets 6 4 3 0 fingers 0 0 0 0}
    {define: A73 frets 6 7 0 0 fingers 0 0 0 0}
    {define: A7u frets 0 9 9 7 fingers 0 0 0 0}
    {define: A7u1 frets 9 7 9 0 fingers 0 0 0 0}
    {define: A7a frets 2 4 3 4 fingers 0 0 0 0}
    {define: A7a1 frets 6 7 5 7 fingers 0 0 0 0}
    {define: A7a2 frets 9 9 9 10 fingers 0 0 0 0}"""
    p = re.compile('frets (.+) fingers')
    capture = p.findall(chaineTest)
    print(capture)
    #par ligne
    lignes = chaineTest.split("\n")
    for l in lignes:
        print(p.findall(l))
    Résultat :
    ['0 1 0 0', '0 4 5 4', '6 4 3 0', '6 7 0 0', '0 9 9 7', '9 7 9 0', '2 4 3 4', '6 7 5 7', '9 9 9 10']
    ['0 1 0 0']
    ['0 4 5 4']
    ['6 4 3 0']
    ['6 7 0 0']
    ['0 9 9 7']
    ['9 7 9 0']
    ['2 4 3 4']
    ['6 7 5 7']
    ['9 9 9 10']
    Ami calmant, J.P

  10. #10
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Mars 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2022
    Messages : 10
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Citation Envoyé par jurassic pork Voir le message
    merci

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par a1fr3d13 Voir le message
    split puis j'ai récupéré les éléments qui m'intéressaient mais je pense qu'il doit y avoir plus simple
    Déjà ça c'est une solution assez simple à mettre en oeuvre. Ensuite la méthode de marco056 basée sur la position des mots clefs est elle-aussi assez simple à implémenter.

    Sinon les expressions régulières déjà évoquées permettent d'impliquer des méta-caractères pour décrire ce qu'on cherche selon un langage dit "de motif"
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import re
    ch = "{define: A7 frets 0 1 0 0 fingers 0 0 0 0-}"
     
    start = "frets"
    end = "fingers"
    x=re.sub(
    	r"^.{1,}%s (.{1,}) %s.{1,}$" % (start, end),
    	r"\1",
    	ch,
    )
    print(x)
    Le motif
    • Toute ligne commençant (^) par n'importe quel caractère (.) répété de 1 à n fois ({1,}) suivi par un espace puis par la string "frets"
    • à partir de là, j'ouvre une mémoire (la parenthèse ouvrante) dans laquelle je cherche des caractères que je stocke. Cette mémoire étant la première de l'expression, elle sera numéroté 1 (pour après)
    • ces caractères mémorisés (la parenthèse fermante) doivent être suivis par un espace et par la string "fingers" qui doit ensuite continuer par des caractères jusqu'à la fin de la ligne ($)

    Ce motif s'il est trouvé, il est alors remplacé par ce qui se trouve dans la mémoire 1 (les caractères entre "start" et "fingers" donc). Au final on n'a que ces caractères.

    Bref les re c'est assez puissant (c'est d'ailleurs fait pour ça).
    A noter la possibilité de remplacer {1,} signifiant "répété de 1 à un nombre illimité de fois" par un simple + => r"^.+%s (.+) %s.+$" % (start, end) (plus lisible, moins lisible, chacun son avis mais moi je n'aime pas).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    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
    Pour les avoir tous :
    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
    chaineTest = """{define: A7 frets 0 1 0 0 fingers 0 0 0 0}
    {define: A71 frets 0 4 5 4 fingers 0 0 0 0}
    {define: A72 frets 6 4 3 0 fingers 0 0 0 0}
    {define: A73 frets 6 7 0 0 fingers 0 0 0 0}
    {define: A7u frets 0 9 9 7 fingers 0 0 0 0}
    {define: A7u1 frets 9 7 9 0 fingers 0 0 0 0}
    {define: A7a frets 2 4 3 4 fingers 0 0 0 0}
    {define: A7a1 frets 6 7 5 7 fingers 0 0 0 0}
    {define: A7a2 frets 9 9 9 10 fingers 0 0 0 0}"""
     
    start = "frets "
    end = " fingers"
     
    chaine_splitee = chaineTest.split("}\n{")
     
    search3 = [el[el.find(start)+len(start):el.find(end)] for el in chaine_splitee]
    print(search3)
    Les expressions régulières sont super intéressantes mais nécessitent un usage régulier : perso, j'ai déjà étudié cela 2 ou 3 fois, mais 6 mois après, sans usage, j'ai tout oublié

  13. #13
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Mars 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2022
    Messages : 10
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Déjà ça c'est une solution assez simple à mettre en oeuvre. Ensuite la méthode de marco056 basée sur la position des mots clefs est elle-aussi assez simple à implémenter.

    Sinon les expressions régulières déjà évoquées permettent d'impliquer des méta-caractères pour décrire ce qu'on cherche selon un langage dit "de motif"
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import re
    ch = "{define: A7 frets 0 1 0 0 fingers 0 0 0 0-}"
     
    start = "frets"
    end = "fingers"
    x=re.sub(
    	r"^.{1,}%s (.{1,}) %s.{1,}$" % (start, end),
    	r"\1",
    	ch,
    )
    print(x)
    Le motif
    • Toute ligne commençant (^) par n'importe quel caractère (.) répété de 1 à n fois ({1,}) suivi par un espace puis par la string "frets"
    • à partir de là, j'ouvre une mémoire (la parenthèse ouvrante) dans laquelle je cherche des caractères que je stocke. Cette mémoire étant la première de l'expression, elle sera numéroté 1 (pour après)
    • ces caractères mémorisés (la parenthèse fermante) doivent être suivis par un espace et par la string "fingers" qui doit ensuite continuer par des caractères jusqu'à la fin de la ligne ($)

    Ce motif s'il est trouvé, il est alors remplacé par ce qui se trouve dans la mémoire 1 (les caractères entre "start" et "fingers" donc). Au final on n'a que ces caractères.

    Bref les re c'est assez puissant (c'est d'ailleurs fait pour ça).
    A noter la possibilité de remplacer {1,} signifiant "répété de 1 à un nombre illimité de fois" par un simple + => r"^.+%s (.+) %s.+$" % (start, end) (plus lisible, moins lisible, chacun son avis mais moi je n'aime pas).

    Merci beaucoup pour toutes ces aides

  14. #14
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Mars 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2022
    Messages : 10
    Par défaut
    Merci à vous tous

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

Discussions similaires

  1. Récupérer une partie de données d'un fichier texte
    Par sarah8590 dans le forum Langage
    Réponses: 4
    Dernier message: 08/10/2014, 11h40
  2. Récupérer une partie du mot d'un fichier
    Par user2000 dans le forum Android
    Réponses: 1
    Dernier message: 13/04/2011, 17h32
  3. Récupérer une partie d'un nom de fichier
    Par ben_harper dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 25/06/2008, 07h19
  4. Réponses: 4
    Dernier message: 27/09/2007, 15h05
  5. [VBA]Récupérer une partie du chemin d'un fichier
    Par poivre dans le forum VBA Access
    Réponses: 1
    Dernier message: 12/04/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