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 :

Extraction de données depuis un fichier texte lorsque les informations ne sont pas sur la meme ligne [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 18
    Par défaut Extraction de données depuis un fichier texte lorsque les informations ne sont pas sur la meme ligne
    Bonjour

    J'ai un fichier texte dont je souhaiterai extraire des données

    Ci dessous vous avez un extrait de mon fichier texte In.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    NAME=TITI1A   01
    NAME=TITI2A 01
    Test
    NAME=TITI3A   01
    NAME=TITI4AU  01
    Je cherche à ce que mon script dès qu'il trouve "Test" me renvoi les informations de la linge précédente
    Dans notre cas précis NAME=TITI2A.

    Voici ce que j'ai commencé ... mais ca ne me revoie pas TITI2A mais Test..

    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
     
    # le but de ce script est d'extraire la liste des traitements impactés
     
    FileI = '/home/bruno/Bureau/In.txt'
    FileO = '/home/bruno/Bureau/Out.txt'
     
    numLineT = 0
    numLineO = 0 
     
    longeur_FileI=len(FileI)    #Nombre de caractère de la ligne
    print(longeur_FileI)        #Imprimons le Nombre de caractere de la ligne
     
    #Ouverture du fichier en entré en lecture afin d'avoir son contenu
    f1 = open(FileI, 'r')
    f1.closed
    if True :
        print('le fichier' + FileI + ' est ouvert')
     
    # Ouverture du fichier en sortie en écriture afin d'avoir son contenu d'écraser
    f2 = open(FileO, 'w')
    f2.closed
    if True :
        print('le fichier' + FileO + ' est ouvert')
     
    # Pour boucler à travers chaque ligne
    # Avec une boucle For
    for line in f1.readlines():
        print('premier boucle for' + line)
        numLineT +=1
        print('numLineT = ' + str(numLineT))
        if 'Test' in line :
            print('seconde boucle for de test' + line)
            numLineO = numLineT-1
            print('numLineO = ' + str(numLineO))
            f1.readline()
            print(line)
            f2.write(line)
     
    # Fermeture du fichier en entré en lecture afin d'avoir son contenu
    f1.close()
    f1.closed
    if True :
        print('le fichier' + FileI + ' est fermé')
    # Ouverture du fichier en sorti afin d'avoir son contenu d'ecraser son contenu
    f2.close()
    f2.closed
    if True :
        print('le fichier' + FileO + ' est fermé')

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans la lecture des lignes de "In.txt", il suffit de sauvegarder chaque ligne pour les lignes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with open("In.txt", "r") as fs:
        prec = ""
        for ligne in fs:
            if ligne.startswith("Test"):
                print(prec)
            prec = ligne
    Ce qui affiche bien:

    NAME=TITI2A 01

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 18
    Par défaut
    Merci beaucoup, je valide que ça fonctionne bien comme quoi .. vu le nombre de ligne que j'avais codé... j'étais bien loin de la solution

    Encore merci beaucoup pour votre aide

    Excellente journée

    Cordialement

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 18
    Par défaut
    Je viens de réaliser que j'avais des cas ou j'ai deux fois la ligne à tester l'une sous l'autre et dans ce cas j'ai la ligne TEST qui est marqué dans mon compte rendu.

    Donc en entrée j'ai ce type de cas

    NAME=TITI2A 01
    Test
    Test

    Qui me retourne

    NAME=TITI2A 01
    Test

    J'ai essayé d'intégré une boucle mais ça ne donne pas le resultat voulu

    Est ce qu'il y aurai un moyen de contourner le probleme ?

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par Bruno LAURENT Voir le message
    Est ce qu'il y aurai un moyen de contourner le probleme ?
    Ajoutez une condition pour vérifier que la ligne précédente ne contient pas "Test" avant de l'imprimer...

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

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 : 4 062
    Par défaut
    Pour y placer une coroutine

    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
    import io
     
    def deco(f):
        def wrap(arg):
            res = f(arg)
            next(res)
            return res
        return wrap
     
     
    @deco
    def coroutine(pattern):
        prev_line = ''
        while True:
            line = yield
            if line == pattern:
                print(prev_line)
            prev_line = line
     
     
     
     
    s = io.StringIO('''NAME=TITI1A   01
    NAME=TITI2A 01
    Test
    NAME=TITI3A   01
    Test
    NAME=TITI4AU  01''')
     
     
    c = coroutine('Test')
    for line in s:
        c.send(line.rstrip())
    Le décorateur pour éviter le next dans le programme principal.
    C'est plus long, c'est sûr ! C'est moins efficace, je sais pas et j'ai la flemme de tester...

    P.S : Après test, ma solution est 2x plus rapide, malgré être 100x plus compliqué. Elle a l'avantage d'être utile dans le cas de très nombreuses lignes dans un fichier.

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

Discussions similaires

  1. Extraction de données d'un fichier texte
    Par boobz dans le forum Langage
    Réponses: 1
    Dernier message: 30/03/2008, 11h40
  2. Réponses: 4
    Dernier message: 05/02/2008, 11h08
  3. chargement de données depuis un fichier texte
    Par mohamida dans le forum Administration
    Réponses: 1
    Dernier message: 07/01/2007, 17h57
  4. Extraction de données dans un fichier texte en VB6 !
    Par rockroa dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/06/2006, 16h00
  5. Perl: Extraction de données d'un fichier texte ?
    Par fifto dans le forum Langage
    Réponses: 1
    Dernier message: 27/03/2006, 16h01

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