仅在“如果”语句为true时运行。

时间:2018-08-02 11:57:57

标签: python fits

所以我有一个问题,就像我正在阅读fits文件,然后使用fits头中的信息来定义与原始fits文件相关的其他文件一样。但是对于某些fits文件,其他文件(blaze_file,bis_file,ccf_table)不可用。因此,我的代码给出了一个非常明显的错误,即没有这样的文件或目录enter image description here

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 个答案:

答案 0 :(得分:1)

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. 在生成器函数中创建一个循环,该循环产生一个拟合文件(或不包含任何内容)的“有趣信息”,并在其上运行另一个循环以实际处理数据。

如果我仍然缺少一些要点或不够详细,请告诉我。

答案 1 :(得分:0)

由于您必须阅读fits文件才能知道其他相关文件的名称,因此您无法避免先阅读fit文件。您唯一可以做的就是在尝试读取依赖文件之前测试它们的存在,如果没有,则跳过循环的其余部分(使用continue)。

答案 2 :(得分:0)

编辑此行

e2ds_hdu = fits.open(filename)

并替换为

e2ds_hdu = fits.open(os.path.join(PATH, filename))