Python 通过一行加载多个fits文件
我有200个拟合文件,我需要加载和平均出来创建一个地图。然而,我想知道是否有一种方法可以在一行而不是200个“fits.open”行中完成这一切。我在什么地方见过它,但我记不起在哪里了 文件名为Coadd000_5.fits、Coadd001_5.fits、Coadd002_5.fits、Coadd003_5.fits。。。Coad199_5.5适合 所以它必须类似于Python 通过一行加载多个fits文件,python,for-loop,fits,Python,For Loop,Fits,我有200个拟合文件,我需要加载和平均出来创建一个地图。然而,我想知道是否有一种方法可以在一行而不是200个“fits.open”行中完成这一切。我在什么地方见过它,但我记不起在哪里了 文件名为Coadd000_5.fits、Coadd001_5.fits、Coadd002_5.fits、Coadd003_5.fits。。。Coad199_5.5适合 所以它必须类似于 hdulist2 = fits.open('/Users/alibinesh/Desktop/Data/actpolS2Lens
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)]
使用for循环可以非常轻松地完成此操作:
hdulist2 = [fits.open('/Users/alibinesh/Desktop/Data/actpolS2Lensing/actPolS2LensProducts/realKappaCoadd%03d_5.fit' % i) for i in range(200)]
您可能正在试图记住,这是一种简洁易读的方法,可以执行
for
循环
mylist = [ deal_with( 'realKappaCoadd%03d_5.fit' % i ) for i in range(200) ]
(为了便于阅读,缩短了文件路径)
每当您发现自己想要初始化一个空的列表
,然后在for
循环中向其添加。或者,这是一个密切相关的语法,但它的计算是惰性的(这将允许您处理“深度优先”的事情,而表面上看起来是广度优先,但我怀疑在您的情况下这有什么真正的优势)
您还可能会发现迭代glob
的输出非常有用,它将查找与特定模式匹配的所有文件名:
import glob
list_of_filenames = sorted( glob.glob( 'realKappaCoadd*_5.fit' ) )
mylist = [ deal_with( filename ) for filename in list_of_filenames ]
由于(从评论中)打开一个fits
文件似乎需要很大的开销,您可能一次只需要打开一个文件。因此,您应该高效地“深度优先”运作,在进入下一个文件之前,完全用一个文件完成您的业务。我认为最具可读性的方法是将一个文件的所有必要步骤按顺序放入deal\u 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
循环
mylist = [ deal_with( 'realKappaCoadd%03d_5.fit' % i ) for i in range(200) ]
(为了便于阅读,缩短了文件路径)
每当您发现自己想要初始化一个空的列表
,然后在for
循环中向其添加。或者,这是一个密切相关的语法,但它的计算是惰性的(这将允许您处理“深度优先”的事情,而表面上看起来是广度优先,但我怀疑在您的情况下这有什么真正的优势)
您还可能会发现迭代glob
的输出非常有用,它将查找与特定模式匹配的所有文件名:
import glob
list_of_filenames = sorted( glob.glob( 'realKappaCoadd*_5.fit' ) )
mylist = [ deal_with( filename ) for filename in list_of_filenames ]
由于(从评论中)打开一个fits
文件似乎需要很大的开销,您可能一次只需要打开一个文件。因此,您应该高效地“深度优先”运作,在进入下一个文件之前,完全用一个文件完成您的业务。我认为最具可读性的方法是将一个文件的所有必要步骤按顺序放入deal\u 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
对
循环使用:
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
dirname=''
平均值=0
对于glob.glob(os.path.join(dirname,'Coadd*_5.fits')中的文件名:
使用fits.open(文件名)作为hdul:
#更新“平均值”,无论在这种特定情况下是什么意思
不要像其他答案中那样同时打开每个文件——这可能会产生很大的开销,并且可能不需要对每个文件中的一些数据进行平均(或者即使您确实需要同时访问多个同时文件,也应该将相关部分读入内存并关闭文件)
你具体想做什么?可能已经有一个库可以提供帮助。使用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
dirname=''
平均值=0
对于glob.glob(os.path.join(dirname,'Coadd*_5.fits')中的文件名:
使用fits.open(文件名)作为hdul:
#更新“平均值”,无论在这种特定情况下是什么意思
不要像其他答案中那样同时打开每个文件——这可能会产生很大的开销,并且可能不需要对每个文件中的一些数据进行平均(或者即使您确实需要同时访问多个同时文件,也应该将相关部分读入内存并关闭文件)
你具体想做什么?可能已经有一个库可以提供帮助。for循环有什么问题?我觉得这是最简单、最干净的方法。是的,可能会使用循环。如果编写一个函数,为每个数字i生成第i个文件的文件名,然后编写另一个函数对给定文件名进行适当处理,则可以在范围(200)上循环。这只是一个高层次的建议;有很多方法可以做到这一点。for循环有什么问题?我觉得这是最简单、最干净的方法。是的,可能会使用循环。如果编写一个函数,为每个数字i生成第i个文件的文件名,然后编写另一个函数对给定文件名进行适当处理,则可以在范围(200)上循环。这只是一个高层次的建议;有很多方法可以做到这一点。str(i)
无法获取序列号前导为零的文件。我应该用列表来理解。ThanksIt完全可以使用多行for
循环,而不是列表理解(尽管我很确定OP试图记住后者),这取决于您觉得哪个更可读。我只是想指出一个完全不相关的字符串格式问题(这可能发生在任何一种循环方法中)。是的,我知道这是有效的,只是通过列表理解看起来更好。而且您对格式的评论也是有效的,它确实需要%03d”
str(i)
将无法获取序列号前导零为true的文件。我应该用列表来理解。ThanksIt完全可以使用多行for
循环而不是列表理解(尽管我很确定OP试图记住后者)