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