Запускайте, только если утверждение "если" верно.

Итак, у меня есть вопрос, как будто я читаю файл подгонки, а затем я использую информацию из заголовка подгонки, чтобы определить другие файлы, которые связаны с исходным файлом подгонки. Но для некоторых файлов подгонки другие файлы (blaze_file, bis_file, ccf_table) недоступны. И из-за этого мой код выдает довольно очевидную ошибку, что Нет такого файла или каталога.

import pandas as pd
import sys, os
import numpy as np
from glob import glob
from astropy.io import fits

PATH = os.path.join("home", "Desktop", "2d_spectra")
for filename in os.listdir(PATH):
  if filename.endswith("_e2ds_A.fits"):
     e2ds_hdu = fits.open(filename)
     e2ds_header = e2ds_hdu[0].header

     date = e2ds_header['DATE-OBS']
     date2 = date = date[0:19]

     blaze_file = e2ds_header['HIERARCH ESO DRS BLAZE FILE']
     bis_file = glob('HARPS.' + date2 + '*_bis_G2_A.fits')
     ccf_table = glob('HARPS.' + date2 + '*_ccf_G2_A.tbl')
     if not all(file in os.listdir(PATH) for file in [blaze_file,bis_file,ccf_table]):
       continue

Так что я хочу сделать так, как я хочу, чтобы мой код запускался, только если все файлы доступны, в противном случае - нет. Но проблема в том, что я определяю другие файлы как переменные внутри цикла for, так как я использую информацию заголовка. Так как я могу определить их до цикла for???? а затем использовать что-то вроде

Так кто-нибудь может мне помочь из этого?

3 ответа

Имена файлов, возвращаемые os.listdir() всегда относительно пути, указанного там.

Чтобы их можно было использовать, они должны быть объединены с этим путем.

Пример:

PATH = os.path.join("home", "Desktop", "2d_spectra")

for filename in os.listdir(PATH):
  if filename.endswith("_e2ds_A.fits"):
     filepath = os.path.join(PATH, filename)
     e2ds_hdu = fits.open(filepath)
     …

Пусть имена файлов будут ['a', 'b', 'a_ed2ds_A.fits', 'b_ed2ds_A.fits'], Код теперь исключает два первых имени, а затем добавляет путь к файлу к оставшимся двум.

a_ed2ds_A.fits становится /home/Desktop/2d_spectra/a_ed2ds_A.fits а такжеb_ed2ds_A.fits становится /home/Desktop/2d_spectra/b_ed2ds_A.fits,

Теперь к ним можно получить доступ откуда угодно, а не только по заданному пути к файлу.


Я должен привыкнуть читать вопрос полностью, прежде чем пытаться на него ответить.

Проблема, о которой я упомянул, - это проблема, если вы не запускаете скрипт с любого пути за пределами указанного каталога. Тем не менее, его применение сделает ваш код намного более последовательным.

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

Есть несколько способов достичь вашей цели:

  1. Просто расширьте свой цикл соответствующими тестами.

    Псевдокод:

    for file in files:
        if file.endswith("fits"):
            open file
            read date from header
            create file names depending on date
            if all files exist:
                proceed
    

    или же

    for file in files:
        if file.endswith("fits"):
            open file
            read date from header
            create file names depending on date
            if not all files exist:
                continue # actual keyword, no pseudo code!
            proceed
    
  2. Положите некоторые функции в функции (вариант 1.)

  3. Создайте цикл в функции генератора, который выдает "интересную информацию" одного файла соответствия (или, в качестве альтернативы, ничего), и запустите другой цикл для их работы с данными.

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

Так как вам нужно прочитать файл соответствия, чтобы узнать другие имена зависимых файлов, вы не сможете сначала избежать чтения файла соответствия. Единственное, что вы можете сделать, это проверить наличие зависимых файлов, прежде чем пытаться их прочитать и пропустить оставшуюся часть цикла (используя continue) если не.

Редактировать эту строку

e2ds_hdu = fits.open(filename)

И заменить на

e2ds_hdu = fits.open(os.path.join(PATH, filename))
Другие вопросы по тегам