Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过一行加载多个fits文件_Python_For Loop_Fits - Fatal编程技术网

Python 通过一行加载多个fits文件

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

我有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/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试图记住后者)