0

我正在尝试使用新的数据列更新 FITS 文件。我的文件有一个主 HDU 和两个其他 HDU,每个 HDU 都包含一个表。

由于向已经存在的 FITS 文件的表中添加新列是一件痛苦的事情(无法解决,请参见此处此处),因此我改变了主意,并尝试专注于使用修改后的表创建新文件。

这意味着我必须从原始文件(主 HDU、其他 HDU 等)中复制所有其余部分。有没有标准的方法来做到这一点?或者,什么是最好的(最快的?)方法,可能避免“手动”一个一个地复制每个元素?

4

1 回答 1

0

关于添加新列的主题,您看过这个文档吗?这是创建新表并添加新列的最直接方法。这必然涉及创建一个新的二进制表 HDU,因为它描述了不同的数据。

或者您是否查看过 Astropy 表格界面?它支持读取和写入 FITS 表。见这里。它基本上以相同的方式工作,但要付出更多努力来隐藏细节。这是 PyFITS/astropy.io.fits 接口逐渐被取代的接口,因为它实际上提供了一个很好的表接口。

在现有 FITS 文件中添加新 HDU 或替换现有 HDU 只需打开该文件并更新HDUList数据结构(其工作方式类似于普通 Python 列表)并将更新HDUList后的内容写入新文件。

一个完整的例子可能类似于:

try:
    from astropy.io import fits
except ImportError:
    import pyfits as fits

with fits.open('path/to/file.fits') as hdul:
    table_hdu = hdul[1]  # If the table is the first extension HDU
    new_column = fits.Column(name='NEWCOL', format='D', array=np.zeros(len(table_hdu.data)))
    new_columns = fits.ColDefs([new_column])
    new_table_hdu = fits.new_table(table_hdu.columns + new_columns)

    # Replace the original table HDU with the new one
    hdul[1] = new_table_hdu
    hdul.writeto('path/to/new_file.fits')

大致类似的东西应该可以工作。一旦新的 Table 界面完全集成,这将在 Astropy 中变得更容易,但现在这就是它所涉及的内容。可以这么说,没有理由“手动”做任何事情。

于 2014-07-01T21:58:41.083 回答