2016-04-20 5 views
0

У меня вопрос о моем скрипте. Я пишу код, который автоматически зацикливается на списке входных файлов. Этот список представляет собой текстовый файл так:Открыть второй файл в цикле

E: \ New_Fields \ Field230_traitement_1.fits

E: \ New_Fields \ Field235_traitement_1.fits

E: \ New_Fields \ Field214_traitement_1.fits

...

Мой сценарий читает этот файл и обрабатывает каждый файл в списке:

with open("C:\Users\Valentin\Desktop\Stage M2\liste_traiteXY.txt", "r") as f : 

    fichier_entier = f.read() 
    files = fichier_entier.split("\n") 

for fichier in files : 

    with open(fichier, 'r') : 

       outname = filename.replace('dereddenedXY.fits', 'Distribution_etoiles.png') 
       outname2 = filename.replace('dereddenedXY.fits', 'Carte_densite_nonlisse.png') 
       outname3 = filename.replace('dereddenedXY.fits', 'Carte_densite_lisse.png') 
       outname6 = filename.replace('dereddenedXY.fits', 'Histogramme2D_heatmap.png') 
       outname7 = filename.replace('dereddenedXY.fits', 'Masque_brut.png') 
       outname8 = filename.replace('dereddenedXY.fits', 'Masque_convolue.png') 
       outname10 = filename.replace('dereddenedXY.fits', 'SN_map.png') 
       outname11 = filename.replace('dereddenedXY.fits', 'Histogramme_SN_map.png') 
       outname12 = filename.replace('dereddenedXY.fits', 'SN_map_final.png') 
       outname15 = filename.replace('dereddenedXY.fits', 'resume.png') 

     print "Fichier traité\n : " + fichier 
     reading = fits.open(fichier)   # Ouverture du fichier à l'aide d'astropy 

     tbdata = reading[1].data    # Lecture des données fits  

# PROCESS 

Но, в процессе, мне нужно, чтобы открыть новый входной файл, в котором путь дается следующим образом:

файла = 'E: \ New_Fields \ Field169_mask.fits'

Я не хочу составлять список файлов маски, потому что порядок не совпадает с первым списком. Мой вопрос в том, как я могу открыть маску, соответствующую файлу обработки?

Например, первый входной файл: Field230_traitement_1.fits, поэтому я хочу загрузить в цикл файл: Field230_mask.fits. Затем сделать то же самое с файлом Field235 и т.д ...

Надеюсь быть ясно :)

Спасибо!

ответ

1

Вы можете легко проверить, совпадают ли первая часть этих двух файлов.

file1 = 'E:\New_Fields\Field230_traitement_1.fits' 
file2 = 'E:\New_Fields\Field169_mask.fits' 

if file1.split('\')[-1].split('_')[0] == file2.split('\')[-1].split('_')[0]: 
    print('the files are related') 

В этом случае имена различаются, поэтому тело оператора if не будет выполнено.

Здесь лучший способ перебрать все файлы в папке с помощью glob.

import glob 

associatedFiles = {} 
for fileName in glob.glob('E:\\New_Fields\\*.*'): 
    fileID = fileName.split('\\')[-1].split('_')[0] 
    if fileID not in associatedFiles: 
     associatedFiles[fileID] = [fileName] 
    else: 
     associatedFiles[fileID].append(fileName) 

associatedFiles представляет собой словарь, имеющий общую часть имени файла, как ключ и список связанных файлов в качестве значения.

P.S. Я нахожусь на машине Unix, и мне нужно использовать '\\' вместо '\'. Я не уверен, что в Windows это то же самое, если что-то пойдет не так, попробуйте использовать '\'.

+0

И как можно связать хороший файл 2 (маска) с файлом 1 (traitingment)? Это означает, что автоматически берется 'Field230_mask.fits', если это' Field230_traitement_1.fits', принимает 'Field158_mask.fits', если это' Field158_traitement_1.fits' и т. Д. ... – Deadpool

+0

Если имена предсказуемы, проблем нет, в вашем случае имя '' FieldXXX '+' _ '+' traitement_1'' или '+ 'mask''. Итак, используя split(), вы можете извлечь '' FieldXXX''. После этого файл маски будет '' FieldXXX '+' _ '+' mask'', и файл traitingment будет '' FieldXXX '+' _ '+' traitement_1'' –

+0

Хорошо спасибо вашему ответу! Я попробую вашу идею, и я вернусь, если у меня возникнут проблемы;) Я задаю вопрос так же решен до момента;) – Deadpool

Смежные вопросы