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 :

Boucler un code sur une liste de fichiers


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 44
    Points : 12
    Points
    12
    Par défaut Boucler un code sur une liste de fichiers
    Bonjour à toutes et à tous,

    Je viens demander un peu d'aide ici car depuis 2 jours je bloque sur l'execution de mon code concernant l'omportation d'une liste de fichiers.
    Lorsque je procède de manière standard, avec un seul fichier, tout fonctionne parfaitement. Néanmoins, ayant 180 fichiers de données à traiter, j'aimerais automatiser la tâche. C'est-à-dire que le script importe le premier fichier, fasse tout ce qui est demandé, en ressort un fichier de sortie, puis passe au fichier suivant et ainsi de suite ..

    Je possède un répertoire "Fields" comprenant mes fichiers au format .fits

    Voici mon 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
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #!/usr/bin/python
    # coding: utf-8
     
    from astropy.io import fits
    import numpy as np
    import matplotlib.pyplot as plt
    import os
     
    indir = '/home/valentin/Desktop/Fields'
     
    for root, dirs, filenames in os.walk(indir) :
     
        for f in filenames :
     
            reading = fits.open(filenames)          # Ouverture du fichier à l'aide d'astropy
     
            tbdata = filenames[1].data               # Lecture des données fits
     
     
            #######################################################
            # Application du tri en fonction de divers paramètres #
            #######################################################
     
        mask1 = tbdata['CHI'] < 1.0                                  # Création d'un masque pour la condition CHI
        tbdata_temp1 = tbdata[mask1]
     
        mask2 = tbdata_temp1['PROB'] > 0.01                          # Création d'un second masque sur la condition PROB
        tbdata_temp2 = tbdata_temp1[mask2]
     
        mask3 = tbdata_temp2['SHARP'] > -0.4                         # Création d'un 3e masque sur la condition SHARP (1/2)
        tbdata_temp3 = tbdata_temp2[mask3]
     
        mask4 = tbdata_temp3['SHARP'] < 0.1                          # Création d'un 4e masque sur la condition SHARP (2/2)
        tbdata_final = tbdata_temp3[mask4]
     
        print tbdata_final                                       # Affichage de la table après toutes les conditions
     
     
        hdu = fits.BinTableHDU(data=tbdata_final)
        hdu.writeto('{}_{}'.format(filename, 'traité'))                      # Ecriture du résultat obtenu dans un nouveau fichier fits
     
     
            #################################################
            # Détermination des valeurs extremales du champ #
            #################################################
     
        RA_max = np.max(tbdata['RA'])
        RA_min = np.min(tbdata['RA'])
        print "RA_max vaut :     " + str(RA_max)
        print "RA_min vaut :     " + str(RA_min)
     
        DEC_max = np.max(tbdata['DEC'])
        DEC_min = np.min(tbdata['DEC'])
        print "DEC_max vaut :   " + str(DEC_max)
        print "DEC_min vaut :   " + str(DEC_min)
     
            #########################################
            # Calcul de la valeur centrale du champ #
            #########################################
     
        RA_central = (RA_max + RA_min)/2.
        DEC_central = (DEC_max + DEC_min)/2.
     
        print "RA_central vaut : " + str(RA_central)
        print "DEC_central vaut : " + str(DEC_central)
     
            #######################################
            # Traçage diagramme Couleur-Magnitude #
            #######################################
     
     
        plt.plot(tbdata_final['G'] - tbdata_final['R'], tbdata_final['G'], '.')
        plt.title('Diagramme Couleur-Magnitude')
        plt.xlabel('(g-r)')
        plt.ylabel('g')
        plt.xlim(-2,2)
        plt.ylim(15,26)
        plt.gca().invert_yaxis()
        plt.show()
     
        #reading.close()
    Je n'arrive pas à faire la liaison entre la première partie concernant l'importation des fichiers, et le code en lui-même :/

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

    Citation Envoyé par Andromedae Voir le message
    C'est-à-dire que le script importe le premier fichier, fasse tout ce qui est demandé, en ressort un fichier de sortie, puis passe au fichier suivant et ainsi de suite ..
    Vous pouvez commencer par écrire une fonction "traitement_fichier" qui recevra fichier ou contenu en paramètre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def  traitement_fichier(tbdata):
           ... le traitement...
    Puis faire une boucle qui récupérera le fichier suivant à traiter pour le passer à la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    indir = '/home/valentin/Desktop/Fields'
    for root, dirs, filenames in os.walk(indir) :
        for f in filenames :
            reading = fits.open(filenames)          # Ouverture du fichier à l'aide d'astropy
            tbdata = filenames[1].data               # Lecture des données fits
            traitement_fichier(tbdata)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 44
    Points : 12
    Points
    12
    Par défaut
    Je te remercie pour ta réponse wiztricks.
    Je viens seulement de la voir, et entre temps, j'ai codé ceci qui fonctionne plutôt bien pour le moment :

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
     
    #!/usr/bin/python
    # coding: utf-8
     
    from astropy.io import fits
    import numpy as np
    import matplotlib.pyplot as plt
     
     
                #########################################
                # Fichier contenant la liste des champs #
                #########################################
     
     
    with open("liste_champs.txt", "r") as f :
     
        fichier_entier = f.read()
        files = fichier_entier.split("\n")
     
    for fichier in files :
     
        with open(fichier, 'r') :
     
            reading = fits.open(fichier)          # Ouverture du fichier à l'aide d'astropy
     
            tbdata = reading[1].data               # Lecture des données fits
     
     
            #######################################################
                # Application du tri en fonction de divers paramètres #
                #######################################################
     
            mask1 = tbdata['CHI'] < 1.0      # Création d'un masque pour la condition CHI
            tbdata_temp1 = tbdata[mask1]
     
            print "Tri effectué sur CHI"
     
            mask2 = tbdata_temp1['PROB'] > 0.01  # Création d'un second masque sur la condition PROB
            tbdata_temp2 = tbdata_temp1[mask2]
     
            print "Tri effectué sur PROB"
     
            mask3 = tbdata_temp2['SHARP'] > -0.4     # Création d'un 3e masque sur la condition SHARP (1/2)
            tbdata_temp3 = tbdata_temp2[mask3]
     
            mask4 = tbdata_temp3['SHARP'] < 0.1  # Création d'un 4e masque sur la condition SHARP (2/2)
            tbdata_final = tbdata_temp3[mask4]
     
            print "Création de la nouvelle table finale"
        #print tbdata_final         # Affichage de la table après toutes les conditions
     
            fig = plt.figure()
            plt.plot(tbdata_final['G'] - tbdata_final['R'], tbdata_final['G'], '.')
            plt.title('Diagramme Couleur-Magnitude')
            plt.xlabel('(g-r)')
            plt.ylabel('g')
            plt.xlim(-2,2)
            plt.ylim(15,26)
            plt.gca().invert_yaxis()
            fig.savefig("graph du fichier en cours")
     
            print "Création du Diagramme"
     
            hdu = fits.BinTableHDU(data=tbdata_final)
            hdu.writeto('{}_{}'.format(fichier, 'traité'))      # Ecriture du résultat obtenu dans un nouveau fichier fits
     
            print "Ecriture du nouveau fichier traité"
     
                #################################################
                # Détermination des valeurs extremales du champ #
                #################################################
     
        RA_max = np.max(tbdata['RA'])
        RA_min = np.min(tbdata['RA'])
        print "RA_max vaut :     " + str(RA_max)
        print "RA_min vaut :     " + str(RA_min)
     
        DEC_max = np.max(tbdata['DEC'])
        DEC_min = np.min(tbdata['DEC'])
        print "DEC_max vaut :   " + str(DEC_max)
        print "DEC_min vaut :   " + str(DEC_min)
     
                #########################################
                # Calcul de la valeur centrale du champ #
                #########################################
     
        RA_central = (RA_max + RA_min)/2.
        DEC_central = (DEC_max + DEC_min)/2.
     
        print "RA_central vaut : " + str(RA_central)
        print "DEC_central vaut : " + str(DEC_central)
    Peut-être y verrais tu quelques améliorations ?

    EDIT : j'aurais quand même une question, comment puis-je faire pour que le nom du graphique sauvegardé corresponde au nom du fichier qui est en cours de traitement ?

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

    Citation Envoyé par Andromedae Voir le message
    EDIT : j'aurais quand même une question, comment puis-je faire pour que le nom du graphique sauvegardé corresponde au nom du fichier qui est en cours de traitement ?
    Si vous avez compris le code que vous avez posté, tout est dans les lignes 61 et 66.

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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 44
    Points : 12
    Points
    12
    Par défaut
    Bien sûr que je l'ai compris (écrire un code que l'on ne comprend pas c'est pas mon but), je pensais reprendre la commande ligne 66, j'avais fait quelques essais mais sans réussite

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 44
    Points : 12
    Points
    12
    Par défaut
    Bon, j'ai tenté plusieurs choses mais toujours en me basant sur une syntaxe assez proche de ce que j'ai écrit avec ma commande hdu.writeto qui me permettait de créer un nouveau .fits à partir du "format" et "filename" du fits qui était en cours de lecture.

    Néanmoins, j'ai l'impression que la syntaxe que je dois écrire dans plt.savefig() diffère.
    Si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plt.savefig('graph.png')
    je vais voir mon graph résultant enregistré sous la dénomination que j'ai donné.

    J'imagine que le résultat escompté reprend '{}_{}' permettant d'avoir le nom du fichier en cours de lecture. Mais je ne parviens pas à ce qu'il corresponde indépendemment à chaque fichier.

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

    Citation Envoyé par Andromedae Voir le message
    Bon, j'ai tenté plusieurs choses mais toujours en me basant sur une syntaxe assez proche de ce que j'ai écrit avec ma commande hdu.writeto qui me permettait de créer un nouveau .fits à partir du "format" et "filename" du fits qui était en cours de lecture.
    Avant de tenter quoi que ce soit, il faut arriver à comprendre ce que vous faites.
    Construire un nom de fichier, c'est fabriquer une nouvelle chaîne de caractères à partir d'autres variables.

    Revoir les chaines de caractères et "format" dans votre tutoriel Python préféré...
    Écrire un petit bout de code où vous construisez des chaines de caractères utilisables comme nom de fichier pour plt.savefig à partir de votre liste de noms de fichiers (et après avoir lu la documentation de plt.savefig pour voir ce que çà attend).

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

Discussions similaires

  1. [XL-2003] Réalisation d'un sous total par code sur une liste
    Par will-1981 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/05/2010, 16h37
  2. Boucler sur une liste passée en paramètre
    Par samalairbien dans le forum iReport
    Réponses: 0
    Dernier message: 30/11/2009, 16h12
  3. transfert SFTP - boucle sur une liste de fichiers
    Par Nick56 dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 18/12/2008, 09h25
  4. Copie de fichiers sur une liste de PC
    Par azerty987654 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 27/11/2008, 13h10
  5. liens sur une liste de fichiers
    Par marlet dans le forum Linux
    Réponses: 7
    Dernier message: 25/09/2008, 11h11

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