通过一行加载多个拟合文件
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
不要像其他答案那样同时打开每个文件——这可能会产生巨大的开销,而且您可能不需要对每个文件中的某些数据进行平均(或者即使您确实需要同时访问多个同时文件,您应该只将相关部分读入内存并关闭文件)。
你具体想做什么?很可能已经有一个图书馆可以提供帮助。
我有 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
不要像其他答案那样同时打开每个文件——这可能会产生巨大的开销,而且您可能不需要对每个文件中的某些数据进行平均(或者即使您确实需要同时访问多个同时文件,您应该只将相关部分读入内存并关闭文件)。
你具体想做什么?很可能已经有一个图书馆可以提供帮助。