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 à travers un fichier avec readlines()


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 43
    Par défaut Recherche à travers un fichier avec readlines()
    Bonsoir,

    Je suis un peu embêté.
    J'essais de faire quelque chose, mais n'y parviens pas.

    Je veux parcourir un répertoire, en lister les .txt, en choisir un, en lire les lignes (jusque là ça va).
    Ensuite j'ai besoin de vérifier la présence ou non d'une chaine et de faire une action pour chaque.
    J'ai écris le début du code, et mis en français en commentaire à la fin mon trou noir


    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 os
    import glob
     
    input("Appuyer sur entrer pour lister les fichiers")
    maliste = glob.glob("C:\\Users\\Esope\\Desktop\\*.txt")
    #nombre_fichiers = (len(maliste))
     
    valider = True
    while valider :
        for i in maliste:
            print(i)
            choisir = input("choisir ce fichier ?")
            if not choisir == "":
                fichier = i
                print("le fichier choisi est %s" %(i))
                valider = False
                break                
     
    print("boucle terminée")
     
    #lire le fichier ligne par ligne
    lignes = fichier.readlines()
     
    for chaque_ligne in lignes:
     
    #    si "1" existe
    #    print("1=oui")
    #    si "1" n'existe pas
    #    print("1=non")
    #    si "2" existe
    #    print("2=oui")
    #    si "2" n'existe pas
    #    print("2=non")

    Mon fichier texte se présente sous la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1=1,4,9,14,17,20,23
    2=1,6,7,12,13,22
    3=2,3,11,12,13,15,18,21,24
    4=10,11,12,14,17,20,23
    5=1,13,16,19,22

    Par exemple pour la première ligne, je veux faire une action pour le "1" qui est présent, et le "2" qui est absent entraine aussi une action. Et le point particulier, je dois commencer la recherche après le "=".
    Je dois vérifier la présence de 1 à 24 donc le coup des "if" c'est pas bon du tout ça m'en ferait 48. Je cherche donc à faire autrement mais ça ne vient pas, étant débutant.

    Pour la boucle qui devra passer à la ligne suivante ça je pourrais me débrouiller c'est pas compliqué.

    Merci d'avance

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tu peux aussi le faire dans une boucle avec une fonction qui sera exécutée si le nombre est présent et une autre dans le cas contraire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for l in lines:
        numbs = l.split('=')[1]
        for i in range(1, 25):
            if str(i) in numbs:
                do_something_with_number(i)
            else:
                do_something_without_number(i)
    Remarque, tu dois ouvrir ton fichier pour le lire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    objf = open(filename, 'r')
    lines = objf.readlines()
    .....
    .....
    objf.close()
    ou, mieux encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    with open(filename, 'r') as objf:
        for line in objf:
            # Le reste du code est au minimum indenté ici
            ....
            ....
    # Pas de close()

  3. #3
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 43
    Par défaut
    Super, un grand merci à toi, c'est exactement ce que je voulais faire.
    Il y a juste un petit problème dans le résultat, je m'explique.

    Quand il recherche le "i" dans le "numbs", il ne regarde pas le nombre entre les virgule mais juste le chiffre.
    Donc quand il en est à i = 4, il le trouve dans le "numbs" : 1 = 1,2,3,10,14,20
    Il ne faut pas qu'il le trouve dans ce cas là car 14 est différent de 4.
    Peut être peut on se servir des "," qui séparent les nombres mais je ne vois pas comment non plus car il n'y en a pas avant le 1 ni après le dernier nombre

    J'ai utilisé le premier code que tu m'a donné après avoir ouvert le fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for l in lines:
        numbs = l.split('=')[1]
        for i in range(1, 25):
            if str(i) in numbs:
                do_something_with_number(i)
            else:
                do_something_without_number(i)

    De même Est-ce qu'il est possible de lire le fichier entre deux balises seulement ?

    Car réellement mon fichier ressemble à ça et tout ce qu'il y a avant "[DEBUT]" y compris [DEBUT] et tout ce qu'il y a après [FIN] y compris [FIN] ne m'intéresse pas :

    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
     
    code
    code
    code
    [DEBUT]
    1=1,4,9,14,17,20,23
    2=1,6,7,12,13,22
    3=2,3,11,12,13,15,18,21,24
    4=10,11,12,14,17,20,23
    5=1,13,16,19,22
    [FIN]
    code
    code
    code
    code

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Pour les détails d'exécution je te recommande de prendre l'habitude de tester dans un terminal.

    donc on teste pour voir ce que ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Python 3.2.3 (default, Jun 18 2015, 21:46:42) 
    [GCC 4.6.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> l = "3=2,3,11,12,13,15,18,21,24"
    >>> nums = l.split('=')[1].split(',')
    >>> nums
    ['2', '3', '11', '12', '13', '15', '18', '21', '24']
    >>> str(1) in nums
    False
    >>>
    Pour lire uniquement entre des balises connues de manière certaine tu peux te limiter aux index de celles-ci.

    readlines() retourne une liste de lignes donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    begin = lines.index('[DEBUT]') 
    end = lines.index('[FIN]')
     
    for line in lines[begin+1:end]:
        ....
    on appelle cela du slicing (tranchage).

  5. #5
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 43
    Par défaut
    T'es trop fort merci.
    ça marche bien pour le découpage des lignes. Je n'ai pas encore cette gymnastique ça va venir :-)

    Pour le slicing ça ne fonctionne pas pour le moment, il me dit que l'index recherché n'est pas dans la liste, alors que quand je fais un "print" de lines je le vois bien dans la liste.
    Bref, e vais chercher j'ai dû mal écrire ou je ne sais quoi. Je reviens quand j'ai trouvé ^^

  6. #6
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 43
    Par défaut
    J'ai trouvé !

    Tout bête, étant donnée que dans mon fichier, après le "[DEBUT]" la suite va à la ligne (idem pour "[FIN]"), il fallait faire la recherche en incluant le retour à la ligne "\n"

    donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begin = lines.index('[DEBUT]\n') 
    end = lines.index('[FIN]\n')
     
    for line in lines[begin+1:end]:
    Merci encore !

Discussions similaires

  1. Aide pour une gestion d'un fichier d'adresse
    Par Shtrakeur dans le forum Général Python
    Réponses: 3
    Dernier message: 29/10/2011, 10h19
  2. Aide pour une recherche
    Par bremer dans le forum Requêtes
    Réponses: 5
    Dernier message: 25/03/2008, 10h02
  3. Réponses: 7
    Dernier message: 18/11/2007, 11h38
  4. Réponses: 15
    Dernier message: 26/03/2006, 12h10
  5. Réponses: 2
    Dernier message: 02/03/2006, 11h57

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