通过一个lin加载多个fits文件

2024-06-16 10:53:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有200个fits文件,我需要加载和平均出来创建一个地图。不过,我想知道的是,如果我能做到这一点适合。打开“台词。我在什么地方见过,但我记不起在哪儿了。在

文件名为Coadd000_5.fits、Coadd001_5.fits、Coadd002_5.fits、Coadd003_5.fits。。。Coadd199 U 5.配合。在

所以它必须与

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

或者类似的东西。从0到199,我需要做一个for循环吗?在

谢谢你


Tags: 文件文件名地方地图openusersfits台词
3条回答

您可能试图记住list comprehension,这是一种简洁易读的for循环的方法。在

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

(文件路径缩短以提高可读性)

每当您发现自己想要初始化一个空的list,然后在for循环中将其.append()初始化为它,请考虑"list comprehension"在一行中完成。或者是"generator expression",这是一个密切相关的语法,但它的计算是懒惰的(这将允许您处理事物“深度优先”,而表面上似乎似乎去广度优先,但我怀疑这对您的情况是否有任何真正的好处)。在

您可能还发现迭代glob的输出非常有用,它将查找与某个模式匹配的所有文件名:

^{pr2}$

由于(从注释中)似乎打开fits文件需要大量的开销,您可能一次只需要打开一个文件。因此,您应该高效地“深度优先”操作,在继续下一个文件之前,用一个文件完成您的业务。在我看来,最易读的方法是将一个文件的所有必要步骤按顺序放入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循环可以很容易地完成此操作:

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

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

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

你到底想做什么?很可能已经有一个图书馆可以帮上忙。在

相关问题 更多 >