如何使用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
相关产品推荐
相关产品推荐

