通过一行加载多个拟合文件

Loading multiple fits files through one line

我有 200 个拟合文件需要加载并平均以创建地图。但是,我想知道是否有一种方法可以在一行而不是 200 "fits.open" 行中完成所有这些工作。我在哪里看到过,但我想不起来了。

文件名为 Coadd000_5.fits、Coadd001_5.fits、Coadd002_5.fits、Coadd003_5.fits ... Coadd199_5.fits.

所以它必须类似于

hdulist2 = fits.open('/Users/alibinesh/Desktop/Data/actpolS2Lensing/actPolS2LensProducts/realKappaCoadd' + xyz + '_5.fit')

或类似的东西。我是否必须从 0 到 199 做一个 for 循环?

谢谢

您可以使用 for 循环轻松完成此操作:

hdulist2 = [fits.open('/Users/alibinesh/Desktop/Data/actpolS2Lensing/actPolS2LensProducts/realKappaCoadd%03d_5.fit' % i) for i in range(200)]

您可能试图记住 list comprehension,这是执行 for 循环的简洁、可读的方式。

mylist = [ deal_with( 'realKappaCoadd%03d_5.fit' % i ) for i in range(200) ]

(为了便于阅读缩短了文件路径)

任何时候你发现自己想要在 for 循环中初始化一个空的 list 然后 .append() 到它,想想 "list comprehension" to do it in one line. Or "generator expression",这是一个紧密的 -相关的语法,但是一个懒惰地评估的语法(这将允许你处理事情 "depth-first" 而表面上 出现 去广度优先,但我怀疑你的那个有任何真正的优势例)。

您可能还会发现迭代 glob 的输出很有用,它会找到与特定模式匹配的所有文件名:

import glob
list_of_filenames = sorted( glob.glob( 'realKappaCoadd*_5.fit' ) )
mylist = [ deal_with( filename ) for filename in list_of_filenames ]

因为(从评论中)似乎打开一个 fits 文件需要很多开销,所以您可能只想一次打开一个。因此,您应该高效地运作 "depth-first",用一个文件完全完成您的业务,然后再继续下一个。 IMO 最易读的方法是将一个文件的所有必要步骤按顺序放在 deal_with 函数中:

def deal_with(single_filename):
    file_handle = fits.open(single_filename)
    result = do_whatever_processing(file_handle)
    # ...
    # if necessary, explicitly close the file here
    return result

使用 for 循环:

dirname = '<path_to_files>'
average = 0
for filename in glob.glob(os.path.join(dirname, 'Coadd*_5.fits')):
    with fits.open(filename) as hdul:
        # Update 'average', whatever that means in this specific case

不要像其他答案那样同时打开每个文件——这可能会产生巨大的开销,而且您可能不需要对每个文件中的某些数据进行平均(或者即使您确实需要同时访问多个同时文件,您应该只将相关部分读入内存并关闭文件)。

你具体想做什么?很可能已经有一个图书馆可以提供帮助。