繁体   English   中英

Pyfits 或 astropy.io.fits 将行添加到 fits 文件中的二进制表

[英]Pyfits or astropy.io.fits add row to binary table in fits file

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

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

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

解决方案这是 cfitsio 库的一项微不足道的任务(方法 fits_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()

感谢您的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM