如何完整复制FITS文件表头,修改数据后保存为新FITS文件?
解决FITS文件修改数据并完整保留原表头的问题
我懂你的需求——修改FITS文件里的数据,但要完完整整保留原始表头,最后导出成新文件对吧?你的示例代码方向是对的,大概率是卡在了如何正确传递表头或者处理多HDU文件的环节,下面给你两种场景的解决方案:
单HDU文件(最常见场景)
如果你的FITS文件只有一个主HDU(没有扩展表),用你开头的思路就能搞定,关键是写入时要把读取到的header_old明确传给writeto方法,还要加上overwrite=True避免文件已存在时报错:
from astropy.io import fits # 1. 读取原文件的数据和完整表头 data_old, header_old = fits.getdata("input_file.fits", header=True) # 2. 这里替换成你的数据处理逻辑,比如修改数据 data_new = data_old * 1.5 # 举个简单的数值调整例子 # 3. 写入新文件,传入原表头 fits.writeto('output_file.fits', data_new, header=header_old, overwrite=True)
多HDU文件(含扩展表/多个数据块)
如果你的FITS文件包含多个HDU(比如带扩展表头、多张图像),fits.getdata只会读取第一个HDU的内容,这时候就需要遍历整个HDU列表,逐个复制表头并处理数据:
from astropy.io import fits with fits.open("input_file.fits") as hdul_old: # 创建一个空的新HDU列表 hdul_new = fits.HDUList() for hdu in hdul_old: # 复制当前HDU的表头(避免修改原表头) new_header = hdu.header.copy() # 判断是否为数据型HDU(主HDU或图像HDU),处理数据 if isinstance(hdu, (fits.PrimaryHDU, fits.ImageHDU)): # 替换成你的数据处理逻辑 new_data = hdu.data + 10 # 示例:给所有像素加10 new_hdu = fits.ImageHDU(data=new_data, header=new_header) else: # 非数据型HDU(比如表头HDU)直接复制 new_hdu = hdu.copy() hdul_new.append(new_hdu) # 写入新文件 hdul_new.writeto('output_file.fits', overwrite=True)
几个关键注意点
- 一定要确保写入时传入
header参数,否则writeto会生成默认表头,丢失原文件的所有元数据 - 用
header.copy()是为了隔离原表头和新表头,避免处理数据时意外修改原文件的表头内容 - 如果你的数据处理需要保留原HDU的结构(比如扩展表的顺序、类型),第二种多HDU的处理方式更稳妥
内容的提问来源于stack exchange,提问作者NeStack




