所以我有一个问题,就像我正在阅读fits文件,然后使用fits头中的信息来定义与原始fits文件相关的其他文件一样。但是对于某些fits文件,其他文件(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循环之前定义它们呢?然后使用类似的
那么有人可以帮我吗?
答案 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
。
现在可以从任何地方访问它们,而不仅仅是从给定的文件路径访问。
在尝试回答问题之前,我应该习惯于完整阅读问题。
我提到的问题 是一个问题,如果您不从所述目录之外的任何路径启动脚本。尽管如此,应用它会使您的代码更加一致。
但是,您真正的问题出在其他地方:您检查一个文件,然后在检查其内容之后,想要读取其名称取决于该第一个文件中的信息的文件。
有几种方法可以实现您的目标:
只需使用适当的测试来扩展循环即可。
伪代码:
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
将某些功能放入函数中(1的变体)
如果我仍然缺少一些要点或不够详细,请告诉我。
答案 1 :(得分:0)
由于您必须阅读fits文件才能知道其他相关文件的名称,因此您无法避免先阅读fit文件。您唯一可以做的就是在尝试读取依赖文件之前测试它们的存在,如果没有,则跳过循环的其余部分(使用continue
)。
答案 2 :(得分:0)
编辑此行
e2ds_hdu = fits.open(filename)
并替换为
e2ds_hdu = fits.open(os.path.join(PATH, filename))