-2

如何使用 pyfits、astropy.io.fits 或其他一些 python 库将单行添加到大型拟合文件中的二进制表?

该文件用作日志,因此每秒将添加一行,最终文件大小将达到千兆字节,因此读取所有文件并将其写回或将数据副本保存在内存中并将其写入文件每秒钟实际上是不可能的。到目前为止,使用 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')

我想在“索引”列中添加一些新值,即在二进制表中再添加一行。

4

1 回答 1

0

解决方案这是 cfitsio 库的一项简单任务(方法 fit_insert_row(...)),所以我使用基于它的 python 模块:https ://github.com/esheldon/fitsio

这是使用fitsio的解决方案。要创建新的配合文件,可以执行以下操作:

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 回答