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 :

Lire un fichier texte par bloc de lignes


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de dodineau
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 100
    Par défaut Lire un fichier texte par bloc de lignes
    Bonjour,
    J'ai un programme qui crée un fichier texte de plein de lignes (en multiple de 5).
    Je voudrais donc pouvoir relire ce fichier 5 lignes par 5 lignes.

    Voici la partie de mon code qui ne lit pas comme je voudrais.

    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
     
    source = open('temp_lecture.txt', 'w')
     
    source.write('aa\n')
    source.write('bb\n')
    source.write('cc\n')
    source.write('dd\n')
    source.write('ee\n')
    source.write('ff\n')
    source.write('gg\n')
    source.write('hh\n')
    source.write('ii\n')
    source.write('jj\n')
    source.write('kk\n')
    source.write('ll\n')
    source.write('mm\n')
    source.write('nn\n')
    source.write('suivant\n')
    source.close()
     
    source = open('temp_lecture.txt', 'r')
    for i in source:
        l1=source.readline()
        l1=l1[:len(l1)-1]
        print(l1)
     
        l2=source.readline()
        l2=l2[:len(l2)-1]
        print(l2)
     
        l3 = source.readline()
        l3 = l3[:len(l3)-1]
        print(l3)
     
        l4=source.readline()   
        l4 = l4[:len(l4)-1]
        print(l4)
     
     
        l5=source.readline()
        print(l5)
     
        #Traitement des 5 lignes
     
    source.close()
    Déjà ce code ne lit pas la 1ere ligne et ensuite j'ai un décalage d'une ligne à chaque lecture d'un bloc de 5.

    Merci pour votre aide.
    A+

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

    Il faudrait réfléchir un peu à ce que vous faites plutôt que d'écrire n'importe quoi et venir ici râler "çà ne marche pas".

    Relisez votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    source = open('temp_lecture.txt', 'r')
    for i in source:
        l1=source.readline()
    soit vous lisez vos lignes via for i in source et dans le corps de la boucle la ligne est associée à la variable i. Soit vous faites une boucle while True et vous lisez une ou plusieurs lignes dans le corps de la boucle.

    A vous de choisir en fonction de ce que vous voulez faire et écrire un code qui "cohérent" par rapport à ce choix.

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

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 868
    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 868
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par dodineau Voir le message
    Je voudrais donc pouvoir relire ce fichier 5 lignes par 5 lignes.
    Je ne comprends pas ce point. Admettons que tu lises 5 lignes d'un coup, que veux-tu en faire ensuite ? Les afficher ? Les stocker ? Dans ce cas, autant les afficher ou les stocker une par une...

    Mis à part ce détail, tu peux t'orienter vers la fonction source.readlines() qui te lit tout le fichier et te renvoie un tableau de lignes. Une fois le tableau récupéré, les slices te permettront de le gérer 5 éléments par 5 éléments.
    Ou alors un enumerate(source, 1) qui te donnera chaque ligne précédée d'un nombre énuméré. Chaque fois que ce nombre atteint un multiple de 5 alors tu as tes 5 lignes.
    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]

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 327
    Par défaut
    bonjour,
    Un fichier est un itérateur, donc comme dit par wiztricks, pas la peine de lire en plus les lignes - Et avec les itérateurs tu as next() qui foit correspondre à ce que tu désires

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     for line in source:
        line = line.rstrip()
        for i in range(0, 4):
            line += " - " + next(source).rstrip()
        print(line) # ou yield
    ps: ajouter une gestion d'exception si le nombre de ligne n'est pas multiple de 5

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

    Pourquoi écrire 2 boucles imbriquées?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     for line in source:
        line = line.rstrip()
        for i in range(0, 4):
            line += " - " + next(source).rstrip()
        print(line) # ou yield
    le code suivant donne le même résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    lines = []
    for _ in range(5):
        lines.append(source.readline().rstrip())
    print(' - '.join(lines)
    Ici on fait le choix de fabriquer une liste de lignes (au moins) pour deux raisons:
    • pour avoir une suite de lignes plus facile à utiliser qu'une chaine de caractères à redécouper via une fin de ligne ou un séparateur de lignes,
    • parce qu'on pense qu'il est plus efficace d'ajouter un objet à une liste que de créer une nouvelle chaine de caractères par la concaténation de 2 autres (ce qui n'empêche pas de mettre toutes ces lignes dans une seule chaines de... histoire de l'afficher de façon plus lisible avec print).

    Et je préfère utiliser .readline() plutôt que "next" parce que si tant est qu'on ait à gérer un nombre de lignes restantes inférieur à 5, il sera plus simple d'ajouter une condition qu'un block try...except StopIteration.

    L'étape suivante est d'arriver à penser "fonction" i.e. donner un nom a cette opération, définir des arguments et l'objet retourné pour traduire "retourne les 5 lignes suivantes".

    - 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 728
    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 728
    Par défaut
    Bonjour,

    Une autre manière ICI qui fonctionne très bien,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from itertools import islice
     
    def next_line(f, n=1):
        return [line.strip() for line in islice(f, n)]
     
    with open("temp_lecture.txt", "r") as f:
        lines = next_line(f, n=5)
        while lines:
            print(lines)
            lines = next_line(f, n=5)
    Bonne continuation...

  7. #7
    Membre confirmé Avatar de dodineau
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 100
    Par défaut
    Bonjour et merci pour toutes ces réponses.
    Je veux lire par bloc de 5 lignes car je suis en train de réaliser un envoi de mails suivant une liste.
    Cette liste est composée de multiples de 5 lignes : expéditeur, destinataire, sujet, message, commentaires.
    Je lis donc 5 lignes du fichier et j'envoie le mail. Si le mail ne part pas j'envoie ces 5 lignes dans un nouveau fichier temporaire. Si le mail part je n'envoie rien et je recommence à lire les 5 lignes suivantes jusqu'à la fin.
    A la fin du traitement du fichier d'origine j'écrase le fichier origine par le fichier temporaire.

    Voici mon code, il n'est pas abouti mais il fonctionne comme je le désire.
    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
     
    #!/usr/bin/env python3
     
    import subprocess, os
    import sys
     
    if os.path.exists('outbox.txt')==False:
        print("Pas de fichier à traiter")
        sys.exit()
    #if
     
    subprocess.call('sudo rm mail_temp.txt', shell=True)
     
    source = open('outbox.txt', 'r')
    lines = 0
    for line in source:
        lines += 1
    source.close()
    nb_mail=int(lines/5)
     
    source = open('outbox.txt', 'r')
    ligne = source.readlines()
     
    for i in range(0, nb_mail):
        from_addr=ligne[i*5]
        from_addr=from_addr[:len(from_addr)-1]
     
        to_addr=ligne[i*5+1]
        to_addr=to_addr[:len(to_addr)-1]
     
        sujet = ligne[i*5+2]
        sujet = sujet[:len(sujet)-1]
     
        body=ligne[i*5+3]    
        body = body[:len(body)-1]
     
        comm=ligne[i*5+4]    
     
        envoi_mail() # variable retour qui indique si le mail est parti ou pas
     
        if retour!='ok':
            source_temp = open("mail_temp.txt", "a")
            source_temp.write(from_addr+'\n')
            source_temp.write(to_addr+'\n')
            source_temp.write(sujet+'\n')
            source_temp.write(body+'\n')
            source_temp.write(comm)
            source_temp.close()
     
    source.close()
    subprocess.call('sudo cp mail_temp.txt outbox.txt', shell=True)
    subprocess.call('sudo rm mail_temp.txt', shell=True)
    A vous lire...

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/03/2012, 13h09
  2. Tri fichier texte par bloc
    Par foubou dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 08/11/2008, 01h04
  3. lire un fichier texte par rapport à un symbole
    Par adeltimple dans le forum Langage
    Réponses: 3
    Dernier message: 27/05/2008, 00h14
  4. Réponses: 2
    Dernier message: 05/12/2005, 16h57

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