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 :

utiliser commande sur plusieurs .txt et tout regrouper [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2016
    Messages : 10
    Par défaut utiliser commande sur plusieurs .txt et tout regrouper
    Bonjour,
    Je suis nouveau sur ce forum donc je sais pas trop si je suis au bon endroit pour poser ma question. je m'en excuse d'avance si je me suis trompé.

    Voila j'ai réalisé une commande qui récupères les lignes que j'ai besoin dans un .txt source et je les copies dans un .txt destination. Maintenant j'aimerais pourvoir faire cette manipulation sur plusieurs .txt d'un même fichiers. Les .txt sont nommés de la façon suivante : 20151123-0.txt, 20151124-0.txt, 20151130-0.txt. ce sont des dates mais il n'y a pas tout les jours. ces fichiers sont dans un répertoire REP.
    pour faire simple réaliser la commande sur tout les .txt et rassemblé dans un .txt destination.
    J'ai fais pas mal de recherches et je n'ai pas trouvé de réponses donc je me permet de vous poser la question. Je suis assez débutant sur python donc je ne suis pas trop doué

    Je vous remercie d'avance

    Je vous met mon code de ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def filtre(source, destination):
        fs = open(source, 'r')
        fd = open(destination, 'a')
        txt = fs.readline()
     
        #les lignes a copiées dans le nouveau txt
        while txt:
            if txt.strip().startswith(("0","1","2","3","4","5","6","7","8","9")):
                fd.write(txt+'\n')
            txt = fs.readline()
        fs.close()
        fd.close()

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 156
    Par défaut
    Bonjour,

    Avec ce code, tu récupère la liste de tes fichier .txt dans le dossier ciblé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    import glob, os
    os.chdir("/mydir")
    for file in glob.glob("*.txt"):
        print(file)
    Ensuite tu stock tes fichiers dans une liste et tu fait une boucle sur cette liste de fichier et t’envoie le path de chaque fichier à ta fonction "filtre"
    normalement ça devrai remplir ton fichier de destination.

    Tu es nouveau en Python alors je t'embête pas avec ça, mais il est plus propre d'ouvrir un fichier avec un contexte manager. Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    >>> with open('workfile', 'r') as f:
    ...     read_data = f.read()
    >>> f.closed
    True
    ça ferme proprement ici "f" à la fin des traitements ou même en cas d'erreur.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2016
    Messages : 10
    Par défaut
    Bonjour,
    Merci pour cette réponse rapide. je vais regarder ce que ça donne

    De mon coté j'avais commencé à faire un une fonction pour calculer ne nombre de fichiers dans mon répertoire et ensuite faire une boucle autour.. Mais je viens de penser que ça ne marchera peut être pas...
    Voici mon code ou j'en suis au cas ou :
    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
    import os #module pour la gestion des fichiers
     
    def filtre(source, destination, chemin_rep):
        fs = open(source, 'r')
        fd = open(destination, 'a')
        txt = fs.readline()
        repertoire = os.path.basename(chemin_rep)
     
        #Permet de calculer le nombre de fichiers dans le repertoire
        for path, dirs, repertoire in os.walk(chemin_rep): 
            for filename in repertoire:
                NB_fichier= len(repertoire)
            print(NB_fichier)
     
        i=1
        while i< NB_fichier:
     
            #les lignes a copiées dans le nouveau txt
            while txt:
                if txt.strip().startswith(("0","1","2","3","4","5","6","7","8","9")):
                    fd.write(txt+'\n')
                txt = fs.readline()
        fs.close()
        fd.close()

    J'ai du mal a comprendre le contexte manager...
    en gros il faut mettre ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def filtre(source, destination, chemin_rep):
        with open(source, 'r')as fs:
        with open(destination, 'a')as fd:
            ......
        fs.closed
        fd.closed
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def filtre(source, destination, chemin_rep):
        fs = open(source, 'r')
        fd = open(destination, 'a')
            ......
        fs.close()
        fd.close()
    == ?

    En tout cas Merci

  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
    Salut,

    Il faut indenter après les lignes with et ne pas fermer les fichiers c'est python qui le fait

    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
     
    import os
     
    def filtre(source, destination, chemin_rep):
        with open(source, 'r') as fs:
            with open(destination, 'a') as fd:
                txt = fs.readline()
                repertoire = os.path.basename(chemin_rep)
                for path, dirs, repertoire in os.walk(chemin_rep): 
                    for filename in repertoire:
                        NB_fichier = len(repertoire)
                    print(NB_fichier)
     
                for i in range(NB_fichier):
                    while txt:
                        if txt.strip().startswith(("0","1","2","3","4","5","6","7","8","9")):
                            fd.write(txt+'\n')
                        txt = fs.readline()
    J'utilise des espaces pour les indentations.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2016
    Messages : 10
    Par défaut
    Bonjour,

    Voila ou j'en suis :
    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
    import os, glob #module pour la gestion des fichiers
     
    def filtre(source_txt, destination, chemin_rep):
        with open(source_txt, 'r') as fs:
            with open(destination, 'a') as fd:
     
                liste1=[] #liste1 pour stoker les noms des fichiers txt
                os.chdir(chemin_rep)
                for file in glob.glob("*.txt"):
                    liste1.append(file)
                print (liste1)
     
                    for i in liste1:
                        txt = i.readline()
                        #les lignes a copiées dans le nouveau txt
                        while txt:
                            if txt.strip().startswith(("0","1","2","3","4","5","6","7","8","9")):
                                fd.write(txt+'\n')
                            txt = i.readline()
    Par contre j'ai un souci. J'ai du mal a voir comment appliquer mon traitement des txt aux fichiers qui sont dans ma liste1. J'ai essayé de passer avec une boucle for i in liste... mais c'est un peu le flou dans ma tète ...

    Si jamais vous avez une idée je suis preneur
    Merci beaucoup

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2016
    Messages : 10
    Par défaut
    help ! je suis perdu ... j'arrive pas a faire marcher mon programme..

    Voici le 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
    23
    import os, glob #module pour la gestion des fichiers
     
    def filtre(source_txt, destination, chemin_rep):
            with open(destination, 'a') as fd:
     
                liste1=[] #liste1 pour stoker les noms des fichiers txt
                os.chdir(chemin_rep)
                for file in glob.glob("*.txt"):
                    liste1.append(file)
                print (liste1)
                i= liste1[0]
     
                for i in liste1:
                    #pour le premier .txt de la liste1 ouvrir le fichier en indiquant le chemin ?
                    with open(chemin_rep/liste1[i],'r') as fs:
                        txt =fs.readline()
     
                        #les lignes a copiées dans le nouveau txt
                        while txt:
                            if txt.strip().startswith(("0","1","2","3","4","5","6","7","8","9")):
                                fd.write(txt+'\n')
                            txt = fs.readline()
                        i = liste1[i+1]

    Ca bug au niveau du "with open(chemin_rep/liste1[i],'r') as fs:"

    A ce niveau je pensais ouvrir le fichier correspondant entre le chemin et le txt qui est dans la liste... c'est peu être pas de cette façon qu'il faut faire..
    et ensuite a chaque fois incrémenter i pour changer de fichier dans la liste..

    Merci pour votre aide

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

Discussions similaires

  1. 1 commande sur plusieurs lignes
    Par fourchette dans le forum Scripts/Batch
    Réponses: 17
    Dernier message: 01/07/2010, 09h02
  2. Réponses: 1
    Dernier message: 27/11/2008, 11h41
  3. Réponses: 8
    Dernier message: 09/07/2008, 13h09
  4. Réponses: 4
    Dernier message: 03/12/2004, 11h18
  5. Réponses: 2
    Dernier message: 30/11/2004, 09h42

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