Je me permets de poster un message afin d'avoir vos avis et éventuellement un petit peu d'aide sur ce que je souhaite faire.
J'ai écrit un programme permettant de lire un fichier .fits que je donne en entrée, puis j'applique un tri selon quelques conditions, j'effectue un tracé et je détermine 2-3 choses.
Cela marche très bien pour le moment avec un seul fichier que je rentre "manuellement" dans mon code, mais voilà, j'ai en tout 180 fichiers que je souhaite traiter et tous les faire un par un à la main est clairement une perte de temps !
C'est pourquoi, j'aimerais que mon code lise ma liste de fichiers, que j'aurais au préalable rentré dans un fichier .txt.
Néanmoins, cela ne semble pas fonctionner pour des raisons qui me sont inconnues.
Voilà mon code actuel :
#!/usr/bin/python
# coding: utf-8
from astropy.io import fits
from astropy.table import Table
import numpy as np
import matplotlib.pyplot as plt
#########################################
# Fichier contenant la liste des champs #
#########################################
for c_file in open('liste_champs.txt', 'r'):
filename = c_file
reading = fits.open(filename) # 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]
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
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()
hdu = fits.BinTableHDU(data=tbdata_final)
hdu.writeto('{}_{}.fits'.format(filename, 'output')) # 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)
#reading.close()
Et mon fichier .txt se compose de la façon suivante (je n'ai mis que 2 éléments pour commencer sans perdre du temps, évidemment cela devrait fonctionner pareil avec 2 éléments comme 180) :
Enfin, l'erreur que j'obtiens est la suivante :
valentin@valentin-GE70-2PC:~/Desktop$ python program.py
/home/valentin/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')
Traceback (most recent call last):
File "program.py", line 17, in <module>
reading = fits.open(filename) # Ouverture du fichier à l'aide d'astropy
File "/home/valentin/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/astropy/io/fits/hdu/hdulist.py", line 138, in fitsopen
return HDUList.fromfile(name, mode, memmap, save_backup, cache, **kwargs)
File "/home/valentin/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/astropy/io/fits/hdu/hdulist.py", line 280, in fromfile
save_backup=save_backup, cache=cache, **kwargs)
File "/home/valentin/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/astropy/io/fits/hdu/hdulist.py", line 801, in _readfrom
ffo = _File(fileobj, mode=mode, memmap=memmap, cache=cache)
File "/home/valentin/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/astropy/io/fits/file.py", line 141, in __init__
self._open_filename(fileobj, mode, clobber)
File "/home/valentin/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/astropy/io/fits/file.py", line 493, in _open_filename
self._file = fileobj_open(self.name, PYFITS_MODES[mode])
File "/home/valentin/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/astropy/io/fits/util.py", line 415, in fileobj_open
return open(filename, mode)
IOError: [Errno 2] No such file or directory: 'Field17_combined_final_roughcal.fits\n'
valentin@valentin-GE70-2PC:~/Desktop$
Peut-être avez vous une idée du problème ou une façon autre de faire ?
Merci d'avance !
Rien ne se crée, rien ne se perd, tout se transforme ...
Prends le temps de regarder l'erreur que te renvoie python:
No such file or directory: 'Field17_combined_final_roughcal.fits\n'
As-tu un fichier qui porte le même nom? La réponse est non, car il y a un \n à la fin du nom recherché. C'est ce qu'on appelle un caractère de contrôle. Ces caractères sont "invisible" mais définissent tout de même des actions bien précise. C'est le cas du saut de ligne (ou retour chariot): \n, de la tabulation \t, ... Voici une petite liste trouvée sur le net.
Bref, dans ton fichier les deux chemins sont sur des lignes différentes (donc tu as utilisé un saut de ligne pour les séparer). Et bien qu'invisible à l'affichage, il existe dans la chaîne de caractère:
#Visible dans la chaîne
chn = "Hello\nWorld\n!!!"
#Invisible à l'affichage
print(chn)
Bref, il faut donc faire un pré-traitement avant d'essayer d'ouvrir ton fichier. Il faut utiliser la méthode strip des chaînes qui va retirer les caractères de contrôle (et les espaces) EN DÉBUT ET FIN DE CHAÎNE. Mais pas au milieu. Donc dans mon précédent exemple, aucun caractère ne sera supprimé (car il sont tous en milieu de chaîne). Mais dans l'exemple suivant ça sera le cas:
J'ai une liste initiale de 2 fichiers, néanmoins, après avoir traité le premier, il ne lis pas la seconde ligne :/
#!/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 #
#########################################
chn = open('/astromaster/home/jungbluth/Bureau/Stage/liste_champs.txt', 'r') # Ouverture de la liste des fichiers initiale
contenu = chn.readline().strip() # Lecture de chaque ligne et suppression des caractères invisibles
print contenu # Affichage de la liste corrigée
Save = open('/astromaster/home/jungbluth/Bureau/Stage/liste_champs_cor.txt','w') # Ecriture de la liste corrigée dans un fichier liste_champ_cor
Save.write(contenu)
chn.close() # Fermeture de la variable chn
Save.close() # Fermeture de la variable Save
for c_file in open('/astromaster/home/jungbluth/Bureau/Stage/liste_champs_cor.txt', 'r'): # Ouverture du fichier cor.txt et lecture ligne par ligne
filename = c_file
reading = fits.open(filename) # Ouverture du fichier .fits à 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]
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
# 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()
# plt.saveplot('Figure 1')
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)
#reading.close()
- Edité par Andromedae93 4 mars 2016 à 15:26:52
Rien ne se crée, rien ne se perd, tout se transforme ...
Est-ce que le nombre de tes fichiers est voué à devenir (très) grand ou est-ce qu'il va rester dans les ordres de grandeur de la centaine ou du millier de fichier? Si tu es certain que tu n'auras pas à traiter des centaines de millier de fichiers (ou des millions :p) alors tu peux obtenir une liste des fichiers très facilement, je te donne un exemple de la méthode que j'ai en tête:
# Lecture des chemins pour les fichiers
with open("liste_champs.txt", 'r') as f:
fichier_entier = f.read()
files = fichier_entier.split("\n")
# Les deux lignes du dessus peuvent être remplacées par:
# files = f.read().split()
# Pas besoin de fermer le fichier, with s'en occupe à notre place
# Puis après tu fais ton traitement sur tous les fichiers:
for fichier in files:
with open(fichier, 'r'):
# Je traite
# Pas besoin de fermer le fichier
Maintenant pour ton problème, ça vient du fait que tu n'utilise pas la bonne méthode readline() ne va lire qu'une seule ligne dans le fichier, c'est pour ça que tu n'as qu'un seul fichier qui est traité! Fait une boucle pour être certain de traiter toutes les lignes contenues dans le fichier
#!/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
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()
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)
Cela fonctionne, il prend mon premier fichier, a fait le traitement, puis le second ... Plus qu'à voir comment enregistrer l'image à chaque fois qu'il l'a plot !
Merci à vous
Rien ne se crée, rien ne se perd, tout se transforme ...
Je n'arrive pas, sans faire d'erreurs, à ce qu'il m'enregistre mon graph avec un nom faisant référence au fichier qui est entrain d'être lu. Je sais que je dois faire comme à la ligne 64, mais impossible, en regardant la syntaxe de plt.savefig() de le trouver
Rien ne se crée, rien ne se perd, tout se transforme ...
Ouvrir une liste de fichiers avec Python
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Je n'arrive pas, sans faire d'erreurs, à ce qu'il m'enregistre mon graph avec un nom faisant référence au fichier qui est entrain d'être lu.