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

Calcul scientifique Python Discussion :

Tâche répétée sur fichiers dans répertoire


Sujet :

Calcul scientifique Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    mars 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Tâche répétée sur fichiers dans répertoire
    Bonjour à tous,
    J'ai un script que je souhaiterais répété sur une liste e fichiers.

    J'ai créé ma liste de fichiers en l'écrivant à la main, elle s'appelle Listfiles. Ces fichiers sont tous dans un répertoire \Files\2020\.
    Listfiles qui est une list.

    Je souhaiterais retirer des lignes dans tous les fichiers (celles commençant par "TOA5", "TS" et "") de tous ces fichiers de la façon suivante mais je ne sais pas quoi mettre comme attribut dans les fonctions open pour le prendre en compte. J'ai tenté avec + mais ça ne fonctionne pas. A moins que je doive utilser % ? Je suis un peu perdu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in listfiles:
        filename = listfiles[i]
        with open('\Files\2020_in\'+listfiles[i], "r") as input:
            with open('\Files\2020_out\'++listfiles[i]+'_out.dat', "w") as output:
                  for line in input:
                      if not line.startswith('"TOA5"') and not line.startswith('"TS"') and not line.startswith('""'):
                            output.write(line)"
    Si vous avez la solution, je suis preneur.

    De même, si je n'avais pas à écrire manuellement la liste des fichiers mais pouvoir les lire dans un dossier, ce serait bien. J'ai essayé hier la librairie glob mais impossible à y comprendre quelquechose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    import glob
    liste=glob.glob('C:\Users\*')
    Dans les exemples que j'ai vu sur iunternet, certains mettent des / au lieu de \, d'autres \\ au lieu de \, bref sans rien y comprendre sachant qu'en mettant \, c'est le vrai chemin et ça ne fonctionne pas alors qu'en mettant \\ ou /, ça fonctionne mais ce n'est plus un chemin puisque j'ai C:/Users/nomdesfichiers... ou C://Users//nomdesfichiers...

    Peut-être que glob est inadapté pour ce que je cherche à faire, à savoir récupérer une liste de fichier d'un répertoire, la mettre das une liste pour que je puisse enir travailler un à un sur chacun des fichiers de ce répertoire.
    Merci d'avance.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    17 674
    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 : 17 674
    Points : 30 504
    Points
    30 504
    Par défaut
    Salut,

    Si listfiles est une liste de chaines de caractères, for i in listfiles va récupérer dans la variable i les chaines de caractères successives.
    Et l'instruction filename = listfiles[i] va planter car une liste n'est pas un dictionnaire.

    Vous pourriez commencer par écrire: for filename in listfiles:.

    Je souhaiterais retirer des lignes dans tous les fichiers (celles commençant par "TOA5", "TS" et "")
    Peut être faudrait il déjà faire le boulot pour un fichier en fabriquant une fonction qui prenne en paramètre le nom du fichier d'entrée et le nom du fichier de sortie.

    Après vous calculer les noms en fonctions de ce qui sort de la liste et vous appelez la fonction à chaque itération.

    Pour ce qui est de '\', c'est dans les noms de fichier Windows alors de '/' est dans les noms de fichiers Linux. Problème '\' est un caractère d’échappement donc il faut le doubler ou utiliser des raw string (pour que le caractère ne soit pas interprété comme caractère d’échappement).

    Pour les détails, vous avez des tas de tutos à votre disposition.

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

  3. #3
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2013
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2013
    Messages : 1 460
    Points : 1 901
    Points
    1 901
    Par défaut
    Un exemple de programme qui liste les fichiers pdf de mon chemin (ici, un répertoire nommé tp-eleves, remplacer les ... et par défaut, ce sont les fichiers .tex) :
    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
    import os
     
    chemin = "/media/.../.../.../.../tp-eleves"
    ext = ".pdf"
     
    def recherche_titre_non_recursive(path, extension=".tex"):
        liste_fich = []
        """recherche un mot dans le nom des fichiers"""
        for root, directories, files in os.walk(path):  
            for file in files:
                if file.endswith(extension):
                    liste_fich.append(os.path.join(root,file))
            break
        return liste_fich
     
    print(recherche_titre_non_recursive(chemin,ext ))
    Pas d'aide par mp.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    mars 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Bonjour et merci pour ces conseils,

    Je n'arrive pas à trouver de tuto ou d'indication sur la manière d'aller chercher les fichiers dans un dossier situé deux crans au dessus.
    Eest-ce que je dois l'écrire

    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
    #annee considérée
    annee = 2020
    
    #Liste des fichiers
    listfiles = [str(annee)+"_fichier01_",
    str(annee)+"_fichier02_",
    str(annee)++"_fichier03_"]
    
    for filename in listfiles:
        with open('..\\Files\\2020_in\\'+filename+'.dat', "r") as input:
            with open('..\\Files\\2020_out\\'+filename+'_out.dat', "w") as output:
                  for line in input:
                      if not line.startswith('"TOA5"') and not line.startswith('"TS"') and not line.startswith('""'):
                            output.write(line)
    Autrechose aussi : mon if apparait rouge ! Je n'ai pas l'impression d'avoir oublié quelque-chose ou mal mis l'indentation !?!

    Citation Envoyé par wiztricks Voir le message
    Salut,

    Si listfiles est une liste de chaines de caractères, for i in listfiles va récupérer dans la variable i les chaines de caractères successives.
    Et l'instruction filename = listfiles[i] va planter car une liste n'est pas un dictionnaire.

    Vous pourriez commencer par écrire: for filename in listfiles:.



    Peut être faudrait il déjà faire le boulot pour un fichier en fabriquant une fonction qui prenne en paramètre le nom du fichier d'entrée et le nom du fichier de sortie.

    Après vous calculer les noms en fonctions de ce qui sort de la liste et vous appelez la fonction à chaque itération.

    Pour ce qui est de '\', c'est dans les noms de fichier Windows alors de '/' est dans les noms de fichiers Linux. Problème '\' est un caractère d’échappement donc il faut le doubler ou utiliser des raw string (pour que le caractère ne soit pas interprété comme caractère d’échappement).

    Pour les détails, vous avez des tas de tutos à votre disposition.

    - W

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    17 674
    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 : 17 674
    Points : 30 504
    Points
    30 504
    Par défaut
    Citation Envoyé par otemohu Voir le message
    Je n'arrive pas à trouver de tuto ou d'indication sur la manière d'aller chercher les fichiers dans un dossier situé deux crans au dessus. !?!
    L'organisation du système de fichier et comment on se "balade" dedans sont des fonctionnalités de l'environnement système.

    Python permet juste 'automatiser des activités que vous pourriez faire manuellement en lançant un terminal et en tapant des commandes. Difficile d'automatiser quelque chose si vous ne savez pas déjà le faire "manuellement".

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

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    mars 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    L'organisation du système de fichier et comment on se "balade" dedans sont des fonctionnalités de l'environnement système.

    Python permet juste 'automatiser des activités que vous pourriez faire manuellement en lançant un terminal et en tapant des commandes. Difficile d'automatiser quelque chose si vous ne savez pas déjà le faire "manuellement".

    - W
    Merci du conseil, ça m'aide beaucoup.
    Cordialement

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    17 674
    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 : 17 674
    Points : 30 504
    Points
    30 504
    Par défaut
    Citation Envoyé par otemohu Voir le message
    Merci du conseil, ça m'aide beaucoup.
    Programmer, c'est déjà comprendre ce qu'on écrit.
    Et pour comprendre, il faut avoir pris le temps d'apprendre.

    Pour çà il faut déjà avoir trouvé un tuto. (et le chercher au bon endroit ou avec les bons mots clefs).

    Pour rappel, votre question était:

    Citation Envoyé par otemohu Voir le message
    Je n'arrive pas à trouver de tuto ou d'indication sur la manière d'aller chercher les fichiers dans un dossier situé deux crans au dessus.
    Et ma réponse vous indique seulement que si vous ne cherchez pas au bon endroit, vous ne le trouverez pas.

    Après, votre souhait était peut être qu'on vous dépanne d'avoir a passer du temps à comprendre tout çà en écrivant le code à votre place... Ou qu'on vous raconte ce qui est déjà dans la plupart des tuto comme par exemple celui ci.

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

  8. #8
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2013
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2013
    Messages : 1 460
    Points : 1 901
    Points
    1 901
    Par défaut
    Citation Envoyé par otemohu Voir le message
    Bonjour et merci pour ces conseils,

    Je n'arrive pas à trouver de tuto ou d'indication sur la manière d'aller chercher les fichiers dans un dossier situé deux crans au dessus.

    Autrechose aussi : mon if apparait rouge ! Je n'ai pas l'impression d'avoir oublié quelque-chose ou mal mis l'indentation !?!
    Peut-être les conditions : and, or, sont parfois susceptibles...
    Pour les chemins relatifs, perso j'évite car si on déplace le programme, il ne fonctionne plus. Il vaut mieux travailler avec les chemins absolus et éventuellement les découper avec split.
    Pas d'aide par mp.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    mars 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Je parlais sérieusement. J'ai appliqué votre conseil et regardé petit à petit ce que chaque fonction faissait. J'ai donc avancé depuis ce matin, je suis dessus à temps complet (aves les enfants dans les pattes mais ça, c'est autres chose).
    J'ai donc réussi à faire ce que je souhaitais comme suit :
    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
     
    #annee considérée
    annee = 2020
     
    #dans le dossier ci-dessous, il faut d'abord créer deux dossiers : "annee_in" et "annee_out" et glisser les fichiers dans le dossier /Files/annee_in/
    workpath = 'C:/.../Files/'
     
    #retrait des lignes du header qui ne nous servent pas
    pathin=workpath+str(annee)+'_in/'
    pathout=workpath+str(annee)+'_out/'
    files=os.listdir(pathin)
    files_no_ext=[x.split('.')[0] for x in files]
     
    for filename in files_no_ext:
        with open(pathin+filename+'.dat', "r") as input:
            with open(pathout+filename+'_out.dat', "w") as output:
                  for line in input:
                      if not line.startswith('"TOA5"') and not line.startswith('"TS"') and not line.startswith('""'):
                            output.write(line)
    Maintenant, j'en suis à créer autant de dataframe qu'il y a de fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #lecture des fichiers nettoyés en dataframe
    files=os.listdir(pathout)
    for i in range(1,len(files)):
        dfs.append('df'+str(i))
     
    dfsdic = {}
    for df,file in zip(dfs,files):
        dfsdic[df]=pd.read_csv(pathout+file,sep=',',low_memory=False)
    Je peux accéder à mes dataframes en interrogeant dfsdic['df1'] ou dfsdic['df2'] etc...


    Citation Envoyé par wiztricks Voir le message
    Programmer, c'est déjà comprendre ce qu'on écrit.
    Et pour comprendre, il faut avoir pris le temps d'apprendre.

    Pour çà il faut déjà avoir trouvé un tuto. (et le chercher au bon endroit ou avec les bons mots clefs).

    Pour rappel, votre question était:



    Et ma réponse vous indique seulement que si vous ne cherchez pas au bon endroit, vous ne le trouverez pas.

    Après, votre souhait était peut être qu'on vous dépanne d'avoir a passer du temps à comprendre tout çà en écrivant le code à votre place... Ou qu'on vous raconte ce qui est déjà dans la plupart des tuto comme par exemple celui ci.

    - W

Discussions similaires

  1. [XL-2016] Boucle sur fichiers dans répertoire
    Par Eric_03 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/11/2019, 12h46
  2. Réponses: 3
    Dernier message: 06/05/2008, 14h32
  3. 10G-WORD Recherche de fichiers dans répertoire
    Par Marcel Chabot dans le forum Forms
    Réponses: 10
    Dernier message: 01/05/2008, 16h12
  4. [Configuration] Droits sur fichiers et répertoire
    Par npirard dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 09/08/2007, 11h39
  5. Droits création-écriture fichier dans répertoire
    Par BATiViR dans le forum Delphi
    Réponses: 7
    Dernier message: 02/07/2007, 13h27

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