2014-04-08 22 views
0

我有一個包含二進制表的60GB FITS文件。我想一次讀取(並處理)這個表一行/入口/行/塊*。使用pyfits一次讀取FITS二進制表格

(*我不能確定正確的命名)

我使用pyfits什麼,我想這樣做可以歸結爲簡單:

import pyfits 

hdulist = = pyfits.open("file.fits") 
# the binary table has to be in the 2nd extension 
# hence it is in hdulist[1] 

n_entries = hdulist[1].header['NAXIS2'] 

for i in xrange(n_entries): 
    entry = hdulist[1].data[i] # I am confused what happens at this step 

    # now do stuff with the values in entry 
    # ..... 

變量entry<class 'pyfits.fitsrec.FITS_record'>型和長度等於二進制表中的列數。然而,看起來發生的是二進制表的整個被讀入該行的內存中:entry = hdulist[1].data[i]

我已經查看了pyfits文檔,但我無法找到任何方法,似乎是通過表條目(或一次一小組條目)從表條目的二進制表擴展名中讀取數據。我不想從表中選擇某些條目,只是簡單地按順序掃描它們。

我想我的問題是:

0)的結果是什麼hdulist[1].data[i]一步發生了什麼?爲什麼一切都被讀入內存? (有沒有辦法解決這個問題?)

1)我錯過了什麼,pyfits能夠實際上做我想要的嗎?

2)那裏有另外一個python庫嗎?如果不是,我可以用不同的二進制(或其他壓縮/非ascii)格式(不是FITS)重新寫入數據,並找到一些其他的python庫或模塊做我想要的?

回答

0

pyfits目前缺少表格的行迭代器。如果數據列不需要從磁盤存儲格式轉換爲其「物理」值,那麼讀取表格就很快。但是,如果您嘗試閱讀這些專欄,它現在會爆炸。當表格界面正在被重寫時,我不會太反對它,但同時你可能想要嘗試一下fitits庫,它是CFITSIO周圍的Python包裝器,並提供高效的基於行的表格迭代。

+1

謝謝!我下載並安裝了[fitsio](https://pypi.python.org/pypi/fitsio/0.9.3) ,這確實做了我想要的。上面的代碼變爲: '進口fitsio' '文件名= 「file.fits」' 'H = fitsio.read_header(文件名,電話分機= 1)'' n_entries = H [ 「NAXIS2」]' 'fits = fitsio.FITS(filename,iter_row_buffer = 1000)' '我在xrange(n_entries):' 'entry = fits [1] [i] – alexabate