You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何完整复制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

火山引擎 最新活动