复制FITS文件HDU和数据

0 投票
1 回答
1536 浏览
提问于 2025-04-18 11:32

我想更新一个FITS文件,添加一列新的数据。我的文件里有一个主HDU和两个其他的HDU,每个HDU里都有一个表格。

因为在已经存在的FITS文件里添加新列实在太麻烦了(几乎没法解决,具体可以看这里这里),所以我改变了主意,决定专注于创建一个新的文件,里面有修改过的表格。

这就意味着我需要把原文件里的其他部分(主HDU、其他HDU等等)都复制过来。请问有没有标准的方法可以做到这一点?或者,有没有什么更好的(更快的)办法,能避免一个一个手动复制每个元素?

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')

大致上这样的代码应该可以工作。一旦新的表接口在Astropy中完全整合,这会更简单,但目前就是这样。没有必要做任何“手动”的操作。

撰写回答