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

时间:2017-07-19 14:42:27

标签: python for-loop fits

我有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')

或类似的东西。我是否必须进行for循环,从0到199?

谢谢

3 个答案:

答案 0 :(得分:2)

您可能正在尝试记住list comprehension这是一种简洁易读的for循环方式。

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

(文件路径因可读性而缩短)

如果您发现自己想要在list循环中初始化空.append()然后for,请考虑"list comprehension"在一行中执行此操作。或"generator expression",这是一个密切相关的语法,但是一个懒惰地评估(这将允许你处理“深度优先”的事情,而表面出现以广度优先,但我怀疑在你的情况下有任何真正的优势)。

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

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

由于(来自评论)似乎打开fits文件会产生大量开销,您可能只希望一次打开一个。{1}}文件。因此,您应该有效地“深度优先”运作,在完成下一个文件之前,使用一个文件完全完成您的业务。 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

答案 1 :(得分:0)

你可以通过for循环很容易地做到这一点:

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

答案 2 :(得分:0)

使用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

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

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