Pyfits или astropy.io.fits добавляют строку в двоичную таблицу в файле соответствия

Как добавить одну строку в двоичную таблицу внутри файла с большими размерами, используя 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')

И я хочу добавить новое значение в столбец "индекс", то есть добавить еще одну строку в двоичную таблицу.

1 ответ

Решение

Решение Это тривиальная задача для библиотеки cfitsio (метод fits_insert_row(...)), поэтому я использую основанный на ней модуль python: https://github.com/esheldon/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()

Спасибо за помощь.

Другие вопросы по тегам