2017-07-19 56 views
0

我有200個適合文件,我需要加載和平均出來創建一個地圖。但是,我想知道是否有辦法在一行中完成所有操作,而不是200「合適的打開」行。我在某處看到它,但我不記得在哪裏。通過一行加載多個適合文件

文件名爲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?

謝謝

+2

for循環出了什麼問題?我發現它是最簡單和最乾淨的方式。 – EsotericVoid

+0

是的,可能使用循環。如果您編寫一個函數,可以循環使用範圍(200),對於每個數字i,都會生成第i個文件的文件名,然後是另一個對給定文件名進行相應處理的函數。這只是一個高層次的建議;有很多方法可以做到這一點。 – anandsun

回答

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文件需要大量的開銷,你可能只想要一次打開一個。因此,您應該高效率地進行「深度優先」的操作,在進入下一個文件之前用一個文件徹底完成您的業務。 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 
+0

這個答案和另一個都給出了不好的建議w.r.t. FITS文件。 'fits.open(...)'可能會有很多開銷。相反,OP應該在循環中一次打開一個文件,並計算文件中數據的運行平均值。保持每個文件同時打開是沒有任何意義的。 – Iguananaut

+0

@Iguananaut可能是一個生成器表達式的好例子 - 請參閱編輯 – jez

+0

在所有應有的尊重,這在這裏沒有用。所有的OP需要知道的,似乎是如何編寫for循環。使用生成器表達式來循環某些FITS文件並對它們執行操作沒有任何優勢。我是astropy.io.fits圖書館的(前)維護者。 – Iguananaut

0

您可以循環做一個漂亮的容易:

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

'str(i)'不會得到序列號前導零的文件 – jez

+0

啊。我應該使用列表理解。謝謝 –

+0

使用多行'for'循環代替列表理解是完全有效的(儘管我非常肯定OP正在試圖記住後者),這取決於哪一個更容易理解。我只想指出完全不相關的字符串格式問題(可能會出現在循環方法中)。 – jez

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 

不要打開每個文件同時在其他答案中 - 這可能會產生大量開銷,並且可能不是您需要對每個文件中的某些數據進行平均的東西(或者即使您確實需要同時訪問多個同時發生的文件,也應該閱讀相關部分進入內存並關閉文件)。

你特別想做什麼?很有可能已經有一個圖書館可以提供幫助。