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 :

detecter une ligne a un seul mot dans un fichier txt


Sujet :

Python

  1. #1
    Membre habitué

    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations forums :
    Inscription : Mars 2005
    Messages : 110
    Points : 173
    Points
    173
    Par défaut detecter une ligne a un seul mot dans un fichier txt
    Bonjour à tous !!

    je suis entrain d'écrire un petit programme en python et je coince sur un truc , j'ai besoin d'extraire des donné numerique à partir d'un fichier texte, or mon fichier texte et structuré comme ceci :

    Exemple :
    234
    34 54
    23 56
    23 67
    12 87
    356
    23 56
    65 78
    45 66
    . etc

    donc j'ai une ligne qui contient un seul numero (on peut voir ça comme un seul mot), suivi de lignes qui eux contiennent plusieurs numero et rebelote jusqu'à la fin du fichier !!
    Donc je dois faire en sorte que mon programme detecte lorque un ligne ne contient qu'un seul numero (356) pour effectuer un traitement !!

    Je vous remercie de bien vouloir m'aider ,

    cordialement

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Méthode basique, en partant du principe que tes nombres sont séparés par un espace ou plus :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    fichier = open("nom_fichier.txt", "r")
    while 1:
        ligne = fichier.readline()
        if ligne == "":
            break
        if " " not in ligne:
            # ton traitement
     
    fichier.close()

    Néanmoins, si tu dois faire des opérations sur le nombre, tu devrais convertir la ligne (string) en entier (int). De plus, ce n'est pas parce que la ligne ne comprend aucun espace que les caractères sont forcément des nombres, tu devras alors t'assurer du contenu de la ligne par sécurité. Bref, encore des conditions supplémentaires à écrire...

    On peut donc faire quelque chose de bien plus élégant (et aussi beaucoup plus court), en remplaçant la boucle par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while 1:
        ligne = fichier.readline()
        if ligne == "":
            break
        if ligne[:-1].isidigit():
            nombre = int(ligne[:-1])
            # tu peux maintenant faire des opérations directement sur nombre !
    Le slice [:-1] permet de faire sauter le caractère de retour à la ligne.
    La méthode isdigit() retourne True si les caractères sont uniquement des chiffres (donc s'il y a un espace dans la ligne, c'est False).

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Le while 1 est un peu superflu je trouve
    En python >2.4 on peut faire directement (avec une suggestion utilisant les regex et récupérant le nombre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import re
     
    rx = re.compile(r'^\s*(\d+)\s*$') #correspond à un seul nombre (\d+) pouvant être précédé ou suivi de caractères d'espacement (\s*) et capture le nombre
    fichier = open("nom_fichier.txt", "r")
    for ligne in fichier:
        m = rx.match(ligne)
        if m is not None:
            nombre = int(m.group(1))
            #traitement du nombre

  4. #4
    Membre habitué

    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations forums :
    Inscription : Mars 2005
    Messages : 110
    Points : 173
    Points
    173
    Par défaut
    Bonjour à tous !!

    Merci pour vos réponse, ça m'a beaucoup aidé, mais je bloque toujours

    Mon problème est un peu plus complexe, car pour en revenir a l'exemple précédent, :
    Exemple :
    234 (N)
    34 54 (W,H)
    23 50 (X1,Y1)
    30 20 (X2,Y2)
    12 23 (S,T)
    356
    23 56
    65 78
    45 66
    1 4
    13 5
    0

    Je dois le traiter comme ceci : la premiere valeur (N=234) represente le nombre de 1 contient la matrice mat, cette dernière a W colone qui correspond a 34 et H lignes qui correspond a 54, ensuite (23,50) et (30,20) correspondent au coordonée des cese de ma matrice qui vont contenir un 1, et [S=12,T= 23] correspond a la largeur et la hauteur d'un petit tableau tab, arrivé a ce niveau de mon fichier texte, je dois faire un traitement en utilisant des fonctions que j'ai deja implémenté avec les variable que j'ai (N,W,H,S,T,mat,tab), ensuite refaire la meme chose avec ce qui reste du fichier texte jusqu'à arrivé a zero. (en utilisant les meme variable (N,W,H,S,T,mat,tab)

    Comme je suis vraiment debutant en python (a peine 10 jours) je suis un peu perdu, j'etudie les expression regulières pour voir si ça peut donner quelques choses, alors si quelqu'un a une idée, elle sera la bienvenue !!

    Cordialement

  5. #5
    Membre habitué

    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations forums :
    Inscription : Mars 2005
    Messages : 110
    Points : 173
    Points
    173
    Par défaut
    Re-bonjour,

    J'ai finalement réussi a faire ce petit programme qui a mon avis devrais marché, j'ai pas encoré fini de l'implémenter (le lien avec les autres fonctions) vous pouvez donnez votre avis :
    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
    from init import *
    from TestPrgPrin import *
     
    f = open('C:/Documents and Settings/Administrateur/Bureau/testpy.txt')
    while 1:
        t = f.readline()
        if t=="":
            Break
        else:
            N = int(t)
            t = f.readline()
            X = t.split()
            W = int(X[0])
            H = int(X[1])
            mat=init(W,H)
            for i in range(1, N+1):
                t = f.readline()
                X = t.split()
                x = int(X[0])
                y = int(X[1])
                mat[y][x]=1
            t = f.readline
            X = t.split()
            S = int(X[0])
            T = int(X[1])
    N.B : -init et TestPrgPrin sont deux fonctions que j'ai implémenté
    je vous explique comment ça marche : je commence par lire le premier numero qui est le nombre de x que j'ai dans ma matrice (représenté par des 1 biensur) ensuite le deux numero sur la ligne suivante sont le nombre de ligne et de colone de ma matrice, ensuite j'utilise la boucle for pour lire les coordonées des x, et pouvoir m'arreter quand j'attendrai la ligne qui contient la taille du deuxiemen tableau de mon programme, et rebelotte !!

    Je sais que c'est pas trés bien expliqué

    Cordialement

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Points : 99
    Points
    99
    Par défaut
    Mon Dieu... Mais pourquoi tout le monde ne jure-t-il que par des boucles infinies ?! C'est illogique, risqué, sale et moche !

    Excusez-moi de la crise, mais quand on programme, on est a priori capable d'analyser un cas et d'avoir un raisonnement logique, non ?

    Comme l'a indiqué oiffrig, un 'for ligne in fichier' fonctionne très bien, et est tout à fait adapté.

    Oubliez les 'while 1' parsemés de 'break', ça ne peut apporter que des ennuis, et c'est totalement injustifié !

  7. #7
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Hey, assez, j'ai rien demandé moi

    Je ne connaissais pas du tout cette propriété des objets fichiers : tous les exemples que j'ai vu pour traiter des fichiers textes ligne par ligne utilisaient une boucle infinie.
    Effectivement, le « for ligne in fichier » est plus concis et plus propre, je l'utiliserai dorénavant. Merci pour l'astuce.

  8. #8
    Membre habitué

    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations forums :
    Inscription : Mars 2005
    Messages : 110
    Points : 173
    Points
    173
    Par défaut
    Salut a tous !!

    Je suis d'accrod avec toi Vladislav mais dans mon cas j'ai besoin que la lecture du fichier s'arrete quand celle-ci rencontre un zero, ce qui fait que je suis obligé d'utilisé l'instruction Break !!!

    A part ça, vous pouvez me donnez votre avis sur le bout de code que j'ai déposé !!!

    Cordialement

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Qu'entends-tu par "un zéro" ?
    La boucle for s'arrête à la dernière ligne du fichier, de même que ta boucle while infinie, quel est le problème ?
    Tu veux t'arrêter à une ligne vide ? Dans ce cas il faut penser à enlever le retour à la ligne, lu par readline() ou par la boucle for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for ligne in fichier:
        if ligne.rstrip() == "":
            break
        #traitement de la ligne

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Points : 99
    Points
    99
    Par défaut
    Citation Envoyé par malikoo
    dans mon cas j'ai besoin que la lecture du fichier s'arrete quand celle-ci rencontre un zero, ce qui fait que je suis obligé d'utilisé l'instruction Break !!!
    Je reprend ton dernier 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
    from init import *
    from TestPrgPrin import *
     
    f = open('C:/Documents and Settings/Administrateur/Bureau/testpy.txt')
    t = f.readline()
    while not t == "":
        N = int(t)
        t = f.readline()
        X = t.split()
        W = int(X[0])
        H = int(X[1])
        mat=init(W,H)
        for i in range(1, N+1):
            t = f.readline()
            X = t.split()
            x = int(X[0])
            y = int(X[1])
            mat[y][x]=1
        X = t.split()
        S = int(X[0])
        T = int(X[1])
        t = f.readline()
    Pas de boucle infinie, et le même algorithme que toi. Les boucles infinies sont toujours injustifiées. Une preuve simple : les partisants des boucles infinies mettent le 'break' sous une condition. C'est ridicule : il suffit de mettre cette condition au niveau du contrôle de la boucle !

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/07/2010, 21h58
  2. Comment sauter une ligne lors de l'ecriture dans un fichier
    Par Harald dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 29/05/2009, 18h01
  3. [batch] Comment rechercher deux mots dans un fichier .txt ?
    Par koKoTis dans le forum FAQs Windows
    Réponses: 0
    Dernier message: 10/02/2009, 17h54
  4. récupérer un mot dans un fichier txt
    Par thedevil dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/05/2007, 14h59
  5. Remplaçer un mot dans un fichier Txt
    Par walid_kerkoub dans le forum Delphi
    Réponses: 5
    Dernier message: 06/03/2007, 11h37

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