-2

pyfits、astropy.io.fits、または他のpythonライブラリを使用して、大きなfitsファイル内のバイナリテーブルに単一の行を追加するにはどうすればよいですか?

このファイルはログとして使用されるため、毎秒 1 行が追加され、最終的にファイルのサイズがギガバイトに達するため、すべてのファイルを読み取って書き戻すか、データのコピーをメモリに保持してファイルに書き込みます毎秒は実際には不可能です。これまでの pyfits または astropy.io.fits では、すべてをメモリに読み込んで新しい行を追加し、それを書き戻すことしかできませんでした。

例。次のようなファイルを作成します。

import numpy, pyfits
data = numpy.array([1.0])
col = pyfits.Column(name='index', format='E', array=data)
cols = pyfits.ColDefs([col])
tbhdu = pyfits.BinTableHDU.from_columns(cols)
tbhdu.writeto('test.fits')

そして、列「インデックス」に新しい値を追加したい、つまりバイナリテーブルにもう1行追加したい。

4

1 に答える 1

0

解決策これは cfitsio ライブラリ (fits_insert_row(...) メソッド) の簡単なタスクなので、それに基づく python モジュールを使用します: https://github.com/esheldon/fitsio

そして、これがfitioを使用したソリューションです。新しいはめあいファイルを作成するには、次のようにします。

import fitsio, numpy
from fitsio import FITS,FITSHDR

fits = FITS('test.fits','rw')
data = numpy.zeros(1, dtype=[('index','i4')])
data[0]['index'] = 1
fits.write(data)
fits.close()

行を追加するには:

fits = FITS('test.fits','rw')
#you can actually use the same already opened fits file, 
#to flush the changes you just need: fits.reopen()
 data = numpy.zeros(1, dtype=[('index','i4')])
 data[0]['index'] = 2
 fits[1].append(data)
 fits.close()

ご協力ありがとうございました。

于 2017-11-02T01:09:53.173 に答える