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()
Спасибо за помощь.