You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pickle保存和加载FITS文件表头信息?解决加载失败问题

如何使用Pickle保存和加载FITS文件表头信息?解决加载失败问题

你遇到的加载失败问题其实很常见,核心原因是FITS表头转成字典时,有些条目并不是原生Python类型(比如astropy自定义的注释集合、numpy数值类型等),直接用pickle序列化后,加载时容易因为类型不兼容或者依赖缺失报错。下面给你两种靠谱的解决办法,按需选择:

方法一:转成纯原生Python类型的字典保存

如果只需要保存表头的键值对数据,不需要保留astropy表头的专属功能,那可以把所有值都转换成str、int、float这类原生Python类型,确保序列化和反序列化完全兼容:

import astropy.io.fits as fits
import pickle
import os

cwd = os.getcwd()
fits_path = os.path.join(cwd, 'hmi.M_45s.20200101_020130_TAI.2.magnetogram.fits')
path = os.path.join(cwd, 'demo.pkl')

hdul = fits.open(fits_path)
hdul.verify('silentfix')
hdr = hdul[1].header

# 清洗表头,转成纯原生Python字典
clean_hdr = {}
for key, value in hdr.items():
    # 处理COMMENT这类可能是列表/特殊注释集合的条目
    if isinstance(value, (list, fits.header._HeaderCommentaryCards)):
        clean_hdr[key] = str(value)
    else:
        # 把numpy数值转成Python原生数值(比如np.int64转成int)
        if hasattr(value, 'item'):
            clean_hdr[key] = value.item()
        else:
            clean_hdr[key] = value

hdul.close()

# 保存pickle文件
with open(path, 'wb') as f:
    pickle.dump(clean_hdr, f)

# 测试加载
with open(path, 'rb') as f:
    hdr_loaded = pickle.load(f)

# 验证结果
print("加载后的表头键值对:")
for k, v in hdr_loaded.items():
    print(f"{k}: {v} (类型:{type(v).__name__})")

方法二:直接保存astropy Header对象(更推荐)

如果后续还需要使用表头的astropy专属功能(比如添加新卡片、格式验证等),直接序列化整个Header对象更靠谱——astropy的Header本身支持pickle,加载后能直接当作原类型使用:

import astropy.io.fits as fits
import pickle
import os

cwd = os.getcwd()
fits_path = os.path.join(cwd, 'hmi.M_45s.20200101_020130_TAI.2.magnetogram.fits')
path = os.path.join(cwd, 'demo_header.pkl')

hdul = fits.open(fits_path)
hdul.verify('silentfix')
# 复制表头,避免和原HDU对象关联导致序列化问题
hdr = hdul[1].header.copy()
hdul.close()

# 直接保存Header对象
with open(path, 'wb') as f:
    pickle.dump(hdr, f)

# 加载测试
with open(path, 'rb') as f:
    loaded_hdr = pickle.load(f)

# 加载后是完整的Header对象,可以直接使用
print("加载后的完整表头:")
print(loaded_hdr)

为什么你的原代码会失败?

你只处理了COMMENT字段,但表头里可能还有其他非原生类型的条目(比如numpy的整数/浮点数、astropy自定义的卡片类型),这些类型在pickle后,加载时如果环境中astropy版本不一致,或者缺少相关依赖,就会触发错误。上面的两种方法都彻底解决了这个问题。

小提示

  • 用方法一时,确保所有值都转成原生类型,避免依赖第三方库的特殊类型。
  • 用方法二时,尽量保证保存和加载的Python、astropy版本一致,避免版本兼容问题。

备注:内容来源于stack exchange,提问作者jipparchus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 08:23:10