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 :

Ecriture dans un fichier [Python 3.X]


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 26
    Points
    26
    Par défaut Ecriture dans un fichier
    Bonjour,

    Pour continuer mon apprentissage Python, j'ai répondu à cet exercice:
    Chercher dans tous les fichiers d'un dossier donné ceux qui contiennent des lignes commençant par un mot donné et écrire dans un fichier rapport la liste des fichiers répondant au critère.
    Le rapport sera présenté de la façon suivante :

    Date :
    Dossier :

    fichier1
    ligne du fichier1 commençant par le mot cherché
    ligne suivante du fichier1 commençant par le mot cherché
    ...
    dernière ligne du fichier1 commençant par le mot cherché

    fichier2
    ligne du fichier2 commençant par le mot cherché
    ligne suivante du fichier2 commençant par le mot cherché
    ...
    dernière ligne du fichier2 commençant par le mot cherché

    etc...


    Voilà le programme:
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    # Date : 25 Novembre 2016
    # Programme : TRAITEMENT DE FICHIERS DANS UN DOSSIER
    # Enoncé : Ecrire un programme qui génère un rapport des fichiers qui commencent par le mot saisie par l'utilisateur
     
    # imports
    import os
    import time
     
    # Début du programme
    print("=== TRAITEMENT DE FICHIERS DANS UN DOSSIER ===\n\n")
     
    # L'utilisateur saisi le chemin du dossier qui contient les fichiers
    CheminDossier = str(input("Entrer le chemin du dossier à traiter: "))
     
    # L'utilisateur saisi le nom du rapport
    NomFichierRapport = str(input("Choisir le nom du fichier rapport: "))
     
    # ListeDesFichiers contient le nom.extension des fichiers
    ListeDesFichiers = os.listdir(CheminDossier)
     
    # L'utilisateur saisi le mot à chercher
    MotCle = str(input("Entrer le mot: "))
    print("")
     
    # Creation fichier rapport
    CheminCompletRapport = (CheminDossier+os.sep+NomFichierRapport+".txt")
    Rapport=open(CheminCompletRapport,'w')
     
    Rapport.write("Date: ") # On écrit la date du jour
    Rapport.write(time.strftime('%d/%m/%y %H:%M',time.localtime()))
    Rapport.write("\n")
    Rapport.write("Dossier: ") # On écrit le Chemin du dossier concerné
    Rapport.write(CheminDossier)
    Rapport.write("\n\n")
     
    # Pour chaque fichier dans la liste
    for fichier in ListeDesFichiers:
            CheminCompletFichier = (CheminDossier+os.sep+fichier) # Chemin du fichier
            # Si c'est un fichier
            if os.path.isfile(CheminCompletFichier):
                    Lignes = open(CheminCompletFichier, 'r') # On ouvre en lecture le fichier
                    Rapport.write("Fichier: ")
                    Rapport.write(fichier)
                    Rapport.write("\n")
     
                    # Pour chaque ligne du fichier
                    for L in Lignes:
                            # Si la ligne commence par le Mot défini par l'utilisateur
                            if L.startswith(MotCle):
                                    # On écrit la ligne et le fichier concerné dans le rapport
     
                                    Rapport.write(L)
                    Lignes.close()
                    Rapport.write("\n")
    Rapport.close()
     
    # Affichage du fichier Rapport
    Rapport=open(CheminCompletRapport,'r')
    ContenuRapport = Rapport.read()
    print(ContenuRapport)
    Rapport.close()
    Le programme fonctionne mais je ne trouve pas de solution pour supprimer l'écriture dans le rapport des fichiers qui ne contiennent pas le mot "toto" par exemple.

    Si je les rajoutes dans la boucle for, je vais avoir le nom du fichier écrit plusieurs fois...
    Si je les met en dehors de la boucle (comme actuellement), j'ai tous les fichiers qui sont écrit dans le rapport, même ceux qui ne contiennent pas le mot...


    Avez-vous une piste pour corriger ce problème ?

    Merci d'avance !!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par algerino77 Voir le message
    Avez-vous une piste pour corriger ce problème ?
    Vu votre style de programmation, définir un booleen "ecrire_en_tete" qui contrôle l'écriture du nom du fichier avant la première ligne qui commence par... Si on trouve d'autres lignes, ecrire_en_tete sera alors False.

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

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Points : 446
    Points
    446
    Par défaut
    Bonjour,

    Pour un code "plus propre", il faudrait répartir les différentes fonctionnalités... dans des fonctions et un bon réflexe est de toujours vérifier les entrées surtout si elles sont fournies par une saisie utilisateur. Vérifier par exemple que le dossier fourni existe bien.

    Pour ton pb, et comme l'indiquait wiztricks, il te faut écrie le nom du fichier lors que tu écris "la première ligne qui commence par". Ca donnerait quelque chose comme ça:
    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
     
            # Si c'est un fichier
            if os.path.isfile(CheminCompletFichier):
                    Lignes = open(CheminCompletFichier, 'r') # On ouvre en lecture le fichier
                    ecrire_en_tete = True
     
                    # Pour chaque ligne du fichier
                    for L in Lignes:
                            # Si la ligne commence par le Mot défini par l'utilisateur
                            if L.startswith(MotCle):
                                    # On écrit la ligne et le fichier concerné dans le rapport
                                    if ecrire_en_tete:
                                            Rapport.write("Fichier: ")
                                            Rapport.write(fichier)
                                            Rapport.write("\n")
                                            ecrire_en_tete = False
                                     Rapport.write(L)
    Il est agréable d'avoir le choix. La difficulté est alors de faire le bon (ou le moins pire).

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 26
    Points
    26
    Par défaut
    Bonjour à vous deux !

    Merci pour vos indications, j'ai réussi à corriger mon problème grâce aux booléen

    Pour la vérification du dossier, ça fonctionne aussi, j'ai utilisé cette méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # L'utilisateur saisi le chemin du dossier qui contient les fichiers
    CheminDossier = str(input("Entrer le chemin du dossier à traiter: "))
    while not os.path.isdir(CheminDossier):
            print("Entrer le chemin d'un dossier !!")
            CheminDossier = str(input("Entrer le chemin du dossier à traiter: "))
    Merci encore et bonne continuation !

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

Discussions similaires

  1. probleme d'ecriture dans un fichier texte
    Par azrael88370 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/01/2005, 17h33
  2. Script shell - écriture dans un fichier
    Par Leishmaniose dans le forum Linux
    Réponses: 6
    Dernier message: 13/12/2004, 22h48
  3. Probleme d'ecriture dans un fichier en mode Text
    Par bbozet dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/01/2004, 13h46
  4. [LG]ecriture dans un fichier binaire
    Par jsaviola dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2003, 17h30
  5. Réponses: 2
    Dernier message: 26/09/2003, 14h51

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