Python 复制文件HDU和数据

Python 复制文件HDU和数据,python,pyfits,Python,Pyfits,我正在尝试使用新的数据列更新FITS文件。我的文件有一个主HDU和两个其他HDU,每个HDU包括一个表 由于向已有的FITS文件的表中添加新列是一件痛苦的事情(无法解决,请参见和),因此我改变了主意,尝试使用修改过的表创建一个新文件 这意味着我必须复制原始文件(主HDU、其他HDU等)中的所有其余部分。有没有标准的方法可以做到这一点?或者,最好(最快)的方法是什么,可能避免“手工”一个接一个地复制每个元素?关于添加新列的主题,您看到了吗?这是创建添加了新列的新表的最直接的方法。这必然涉及到创建一

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

由于向已有的FITS文件的表中添加新列是一件痛苦的事情(无法解决,请参见和),因此我改变了主意,尝试使用修改过的表创建一个新文件


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

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

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

添加新的HDU或替换现有FITS文件中的现有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中,一旦新的表接口完全集成,这将变得更容易,但目前这正是它所涉及的。可以说,没有理由“手工”做任何事情