科学计算科研数据分析【免费下载链接】astropyAstronomy and astrophysics core library项目地址https://gitcode.com/gh_mirrors/as/astropy点击查看免费下载导读FITSFlexible Image Transport System是天文学界广泛使用的便携式文件标准用于存储图像和表格数据。本指南以 astropy.io.fits 包为核心系统讲解如何打开、读取、修改、创建 FITS 文件涵盖头文件Header操作、图像与表格数据访问、大文件与云存储文件的处理以及配套的便捷函数与命令行工具。读完本文你将掌握使用 astropy.io.fits 完成从读取一张 FITS 图像到构建多扩展 FITSMEF文件的完整实战能力。认识 astropy.io.fitsFITS 与包结构astropy.io.fits是 Astropy 中负责 FITS 文件读写的子包。FITS 文件由若干 HDUHeader Data Unit头数据单元组成每个 HDU 包含一个头文件header和通常一个数据数组或表格。文件内所有 HDU 由 HDUList 对象以类似 Pythonlist的方式组织。关于使用边界文档给出了两条重要建议如果只想读写单个表格的 FITS 格式推荐使用 Unified I/O 的Table.read/Table.write接口如QTable.read如果处理带物理单位的 CCD 图像数据如单位electron推荐使用 Unified Image Data 接口与CCDData类它可以从多扩展 FITS 文件中同时加载数据、不确定度uncertainty和掩码mask。本指南专注讲解直接用astropy.io.fits进行底层、灵活的文件操作。读取与更新现有 FITS 文件打开 FITS 文件加载包并打开一个已有的 FITS 文件 from astropy.io import fits fits_image_filename fits.util.get_testdata_filepath(test0.fits) hdul fits.open(fits_image_filename)fits.util.get_testdata_filepath()返回 Astropy 随包发布的测试数据路径处理自己的数据时直接用fits.open()传入相对或绝对路径字符串或 path-like 对象即可。open函数返回一个HDUList对象它是 HDU 对象的 list 式集合。索引规则上hdul[0]是主 HDUPrimaryHDUhdul[1]是第一个扩展 HDU依此类推。需要注意的是Astropy 遵循 Python 的零基索引HDU 与头卡片都是而 FITS 标准本身因源自 Fortran 采用一基索引。用HDUList.info()方法可以概览文件内容 hdul.info() Filename: ...test0.fits No. Name Ver Type Cards Dimensions Format 0 PRIMARY 1 PrimaryHDU 138 () 1 SCI 1 ImageHDU 61 (40, 40) int16 2 SCI 2 ImageHDU 61 (40, 40) int16 3 SCI 3 ImageHDU 61 (40, 40) int16 4 SCI 4 ImageHDU 61 (40, 40) int16使用完毕后调用hdul.close()关闭文件。更推荐的做法是用with上下文管理器这样即使发生异常文件也会被自动关闭 with fits.open(fits_image_filename) as hdul: ... hdul.info()在源码层面fitsopen()即fits.open的工厂函数定义于 hdu/hdulist.py默认模式为readonly。它还支持modeupdate、append、denywrite、ostream等模式。若以lazy_load_hdusFalse打开则所有头文件在 HDUList 关闭后仍可访问而数据是否可访问取决于是否被触碰过以及是否启用了内存映射。处理大文件内存映射open支持memmapTrue参数使每个 HDU 的数组数据通过 mmap 按需访问而非一次性读入内存这对无法整体装入物理内存的超大数组尤其有用。memmapTrue是默认值该默认值来自配置项astropy.io.fits.Conf.use_memmap见 astropy/io/fits/init.py。对较小的文件影响不大但顺序读取数组数据等操作可能带来少量额外开销。32 位系统上超过 23 GB 的数组无法 mmap此时物理内存通常也已告急64 位系统限制小得多。⚠️注意 mmap 的句柄行为以memmapTrue打开文件后一旦访问hdul[0].datammap 会打开该 FITS 文件的另一个句柄因此即使调用hdul.close()mmap 仍持有文件句柄数据仍可被访问。若想强制释放 mmap需等待HDUList对象超出作用域或手动执行del hdul[0].data前提是没有其他引用指向该数据数组。处理远程与云存储文件open还支持use_fsspec参数借助fsspec包打开远程与分布式存储后端上的文件例如 Amazon S3、Google Cloud Storage。以下示例直接从哈勃公开的 S3 桶中访问一张 213 MB 的存档图像并只提取一个 10×20 像素的局部切片 uri s3://stpubdata/hst/public/j8pu/j8pu0y010/j8pu0y010_drc.fits with fits.open(uri, use_fsspecTrue, fsspec_kwargs{anon: True}) as hdul: ... cutout hdul[1].section[10:20, 30:50]关键技巧在于使用ImageHDU.section属性而不是传统的.data。section属性返回一个 Section 对象对它切片时只从服务器传输需要的部分而不是下载整个数据数组。这能显著加速对位于慢速远程存储上大型 FITS 文件小规模子集的读取。use_fsspec在源码中的行为见 hdu/hdulist.py默认仅在路径以s3://或gs://开头时启用对其他前缀如http://需显式传use_fsspecTrue且该特性依赖可选包fsspec缺失时会抛出ModuleNotFoundError。fsspec_kwargs会透传给fsspec.open用于配置云存储凭据与缓存行为。无符号整数约定由于 FITS 源自 Fortran其格式本身不原生支持图像或表格中的无符号整数。通行约定是把无符号整数存为有符号整数并配一个shift指令即头文件中写BZERO 2 ** (BITPIX - 1)的关键字把有符号数整体平移为无符号数。例如写入无符号 32 位整数0时文件里实际存的是-32768头关键字为BZERO 32768。Astropy 默认识别并应用这一约定所有看起来应解释为无符号整数的数据图像与表格都适用会被自动转换。即使传uintFalseBZERO平移仍会生效只是返回的数组是float64类型若要完全禁用缩放/平移使用do_not_scale_image_dataTrue。对应的配置项enable_uint默认True定义在 astropy/io/fits/init.py其判定规则为数组满足BITPIX 0、BSCALE 1、BZERO 2**BITPIX时按无符号约定表示。处理压缩文件open可无缝打开经 gzip、bzip2、pkzip、lzma 或 Unix compressLZW压缩过的 FITS 文件例如.fits.gz。需要了解以下限制对于包含多个压缩文件的 Zip 文件只能访问第一个文件bzip2 与 lzma 不支持追加append或更新update访问模式LZW 压缩文件不支持任何写模式包括追加与更新。写文件时如writeto压缩方式根据文件名扩展名或被写入的既有文件的压缩方式自动判定。源码层面HDUList.writeto()的 docstring 明确支持 gzip、zip、bzip2、lzma 压缩算法压缩模式由扩展名.gz、.zip、.bz2、.xz决定也可直接传入gzip.GzipFile之类的压缩文件对象见 hdu/hdulist.py。处理非标准文件与验证当读取不符合 FITS 标准的文件时astropy.io.fits会尝试对不合规字段做出合理解读但这不一定总能成功访问头文件时可能触发警告、写入时可能抛出异常。写入时的校验级别由open的output_verify参数控制读取后的文件可用HDUList.verify方法验证并修复通常在打开文件后、访问任何头文件或数据之前调用 with fits.open(fits_image_filename) as hdul: ... hdul.verify(fix) ... data hdul[1].dataverify(fix)请求 Astropy 修复不合规字段并打印提示信息。校验选项定义在 verify.py包括ignore、warn、exception、fix、silentfix以及fixignore、fixwarn、fixexception、silentfixignore、silentfixwarn、silentfixexception等组合形式。源码中verify(optionwarn)会在非法选项上抛出ValueError而warn/exception模式下不可修复项会被标记为Unfixable error。操作 FITS 头文件HeaderHDUList中每个 HDU 都有.header与.data属性。FITS 头文件由若干 80 字节的卡片card组成每张卡片包含一个关键字keyword、一个值value和一条注释comment。关键字与注释必须是字符串值可以是字符串、整数、浮点数、复数或True/False。关键字通常唯一少数特殊情况除外。读取关键字dict 式与 list 式访问header属性是一个Header实例。像 dict 一样按键取值 hdul fits.open(fits_image_filename) hdul[0].header[DATE] 01/04/99关键字在 FITS 文件内总是大写但 Astropy 对用户输入大小写不敏感若关键字不存在会抛出KeyError。也可以像 list 一样按索引取值仍是零基 hdul[0].header[7] 32768.0修改与新增关键字通过关键字名或索引更新值 hdr hdul[0].header hdr[targname] NGC121-a hdr[27] 99绝大多数应用代码应通过关键字名而非位置索引更新头文件因为大多数 FITS 关键字可能出现在头文件中的任意位置。还可以把值与注释作为元组一并赋值 hdr[targname] (NGC121-a, the observation target) hdr[targname] NGC121-a hdr.comments[targname] the observation target上述 dict 式语法也可用于新增关键字/值对可带注释新卡片追加到头文件末尾注释类关键字如 COMMENT、HISTORY 则追加到最后一个同类关键字之后。另一种更新或追加卡片的方式是 Header.set 方法 hdr.set(observer, Edwin Hubble)set还支持before/after参数控制新卡片的位置before优先于after这在源码中有完整实现。添加 COMMENT 或 HISTORY 记录时总是新建卡片而不是更新已有卡片 hdr[history] I updated this file 2/26/09 hdr[comment] Edwin Hubble really knew his stuff hdr[comment] I like using HST observations hdr[history] I updated this file 2/26/09 hdr[comment] Edwin Hubble really knew his stuff I like using HST observations注意不要混淆 COMMENT 卡片与普通卡片上的注释值。要更新已有的 COMMENT/HISTORY 卡片通过索引引用 hdr[history][0] I updated this file on 2/27/09 hdr[comment][1] I like using JWST observations查看整个头文件输入头对象本身或print(repr(hdr))可查看头文件在 FITS 文件中的完整样子已剥离 END 卡片与填充 hdr SIMPLE T / file does conform to FITS standard BITPIX 16 / number of bits per data pixel NAXIS 0 / number of data axes ...直接print(hdr)也可以但它在多数显示环境下可读性差——因为它按 FITS 文件内部原始方式输出卡片之间没有换行这是新手常见的困惑点。查看切片与全部关键字列表 hdr[:2] SIMPLE T / file does conform to FITS standard BITPIX 16 / number of bits per data pixel list(hdr.keys()) [SIMPLE, BITPIX, NAXIS, ...]Header.keys()与 dict 的keys()行为一致header.py 中它遍历底层卡片产生关键字。结构关键字别去手改FITS 关键字既包含元数据也包含解析文件所必需的结构信息。这些结构关键字由astropy.io.fits内部管理通常不应由用户触碰而应使用 HDU 类的相关属性例如hdu.name设置EXTNAME、hdu.ver设置EXTVER。不同 HDU 类型对应的结构关键字如下表HDU 类型结构关键字全部SIMPLE、BITPIX、NAXISPrimaryHDUEXTENDImageHDU、TableHDU、BinTableHDUPCOUNT、GCOUNTGroupsHDUNAXIS1、GCOUNT、PCOUNT、GROUPSTableHDU、BinTableHDUTFIELDS、TFORM、TBCOL除此之外还有大量保留关键字数据缩放、表列属性等大部分可通过Column或 HDU 对象的属性访问。结构关键字会在以下常见操作中被检查/更新设置 dataNAXIS*由数据形状.data.shape确定BITPIX由数据类型.data.dtype确定设置 header关键字根据数据属性更新同上写文件所有必要关键字被删除、更新或添加调用 HDU 的 verify 方法如PrimaryHDU.verify部分关键字可被自动修复。在这些情况下用户手工赋给这些关键字的值会被覆盖。处理图像数据如果 HDU 的数据是图像.data属性返回numpy.ndarray对象 data hdul[1].data这里data指向第二个 HDUhdul[0]为主 HDU即 SCI 扩展的数据。也可以用扩展名EXTNAME 关键字访问若多个扩展同名则需要(EXTNAME, EXTVER)元组 data hdul[SCI].data data hdul[sci,2].dataEXTNAME 同样大小写不敏感。返回的 numpy 对象携带常规属性 data.shape (40, 40) data.dtype.name int16图像数据是 numpy 对象可直接切片、查看、做数学运算。查看 x5、y2 处的像素值 print(data[1, 4]) 348与 C 语言一致Python 是零基索引且最慢轴在前、最快轴在后对 2D 图像最快轴X 轴对应 FITS 的 NAXIS1是第二个索引。因此 FITS 中一基索引的 x1120、y3140 子区在 Python 中写为 data[30:40, 10:20] array([[350, 349, 349, 348, 349, 348, 349, 347, 350, 348], ... [349, 349, 349, 348, 350, 349, 349, 350, 348, 350]], dtypei2)更新像素或子区 data[30:40, 10:20] data[1, 4] 999把计数转换为流量flux的经典示例 photflam hdul[1].header[photflam] exptime hdr[exptime] data data * photflam / exptime hdul.close()注意对整个图像做这样的运算需要把整幅图像放在内存中上述示例原地乘除、不产生拷贝但原始图像必须先能装进主内存对多数观测数据现代个人电脑没有问题。想保存所有修改到新文件用HDUList.writeto。源码实现上ImageHDU / PrimaryHDU 继承自_ImageBaseHDU其data属性是一个lazyproperty返回已按 BZERO/BSCALE 缩放到物理值的数据除非以do_not_scale_image_dataTrue打开shape属性则由头文件中的轴信息tuple(reversed(self._axes))直接推导无需真正读取数据。处理表格数据FITS 表扩展的数据同样在.data属性中 fits_table_filename fits.util.get_testdata_filepath(tb.fits) hdul fits.open(fits_table_filename) data hdul[1].data # 假定第一个扩展是表 hdul.close()表数据本质上是带一些额外属性的 numpy record array。查看第一行 print(data[0]) (np.int32(1), abc, np.float64(3.7000000715255736), np.False_)每行是一个FITS_record对象像包含异构类型元素的 Python 元组此例为整数、字符串、浮点数、布尔值。更常用的按列访问方式用field方法 data.field(0) # 第一列 array([1, 2]...) data.field(c1) # 按列名 array([1, 2]...) data[c1] # dict 式访问更推荐 array([1, 2]...)按列名访问更可取因为列名与其物理顺序完全独立与头关键字一致列名也大小写不敏感。用表 HDU 的columns属性一个ColDefs列定义对象查看有哪些列 cols hdul[1].columns cols.info() name: [c1, c2, c3, c4] format: [1J, 3A, 1E, 1L] unit: [, , , ] null: [-2147483647, , , ] bscale: [, , 3, ] bzero: [, , 0.4, ] disp: [I11, A3, G15.7, L6] start: [, , , ] dim: [, , , ] coord_type: [, , , ] coord_unit: [, , , ] coord_ref_point: [, , , ] coord_ref_value: [, , , ] coord_inc: [, , , ] time_ref_pos: [, , , ]在脚本中打印列名与格式可以更紧凑 hdul[1].columns ColDefs( name c1; format 1J; null -2147483647; disp I11 name c2; format 3A; disp A3 name c3; format 1E; bscale 3; bzero 0.4; disp G15.7 name c4; format 1L; disp L6 )也可以单独获取属性如cols.names返回列名列表。ColDefs.names属性在 column.py 中实现Column与ColDefs类定义于 column.py。由于每列都是 numpy 对象可直接更新、求均值等 data[c4][:] 0 data[c3].mean() np.float64(5.19999989271164)保存文件修改修改头文件或数据后可用HDUList.writeto把内存中的版本写到新磁盘文件hdul.writeto(newtable.fits)如果文件以 update 模式打开可用HDUList.flush把所有修改写回原文件close对 update 模式也有同样效果with fits.open(original.fits, modeupdate) as hdul: # 修改 hdul 中的内容 hdul.flush() # 修改写回 original.fits # 关闭文件也会 flush 任何修改并阻止进一步写入源码细节hdu/hdulist.pyflush仅支持append、update、ostream模式若开启save_backupTrueflush 前会把原文件保存为.bak已存在则依次用.bak.1、.bak.2……。writeto支持output_verify默认exception、overwrite默认False目标已存在时抛OSError与checksum参数写文件前会调用self.verify(optionoutput_verify)并自动确保EXTEND关键字正确update_extend还会自动补上必要的结构关键字。创建新的 FITS 文件创建图像文件从零创建只含主 HDU 图像数据的 FITS 文件非常方便。先创建 numpy 数据 import numpy as np data np.arange(100.0) # 0.0 到 99.0 的浮点序列封装为PrimaryHDU再放进HDUList写入文件 hdu fits.PrimaryHDU(datadata) hdul fits.HDUList([hdu]) hdul.writeto(new1.fits)Astropy 还提供了快捷方式两步合一 hdu.writeto(new2.fits)这会直接写单个 HDU 到 FITS 文件无需手动包一层HDUList。创建表格文件表格 HDU 只能作为扩展不能作主 HDUFITS 表扩展分 ASCII 表与二进制表两种。先构造Column对象与数据再创建ColDefs最后用BinTableHDU.from_columns生成 HDU import numpy as np a1 np.array([NGC1001, NGC1002, NGC1003]) a2 np.array([11.1, 12.3, 15.2]) col1 fits.Column(nametarget, format20A, arraya1) col2 fits.Column(nameV_mag, formatE, arraya2) cols fits.ColDefs([col1, col2]) hdu fits.BinTableHDU.from_columns(cols)如果数据存放在结构化数组中则不必显式创建Column对象。也可以更简洁地一次完成不建中间变量 hdu fits.BinTableHDU.from_columns( ... [fits.Column(nametarget, format20A, arraya1), ... fits.Column(nameV_mag, formatE, arraya2)])然后直接写文件 hdu.writeto(table3.fits)这个快捷方式会自动创建一个无数据的最小主 HDU 并前置到表 HDU 之前从而构成合法 FITS 文件。BinTableHDU.from_columns是类方法实现于 hdu/table.pyBinTableHDU类在 hdu/table.py。FITS 表的底层数据结构是FITS_rec派生自numpy.recarray新建表 HDU 时各列数组会被组装成单个FITS_rec数组。另外如果只创建一个二进制 FITS 表且不含其他 HDU用astropy.table.Table更简单 from astropy.table import Table t Table([[1, 2], [4, 5], [7, 8]], names(a, b, c)) t.write(table1.fits, formatfits)等价的底层写法 from astropy.io import fits import numpy as np c1 fits.Column(namea, arraynp.array([1, 2]), formatK) c2 fits.Column(nameb, arraynp.array([4, 5]), formatK) c3 fits.Column(namec, arraynp.array([7, 8]), formatK) t fits.BinTableHDU.from_columns([c1, c2, c3]) t.writeto(table2.fits)创建多扩展 FITSMEF文件创建多个扩展需要把各 HDU 放进HDUList import numpy as np primary_hdu fits.PrimaryHDU(datanp.ones((3, 3))) image_hdu fits.ImageHDU(datanp.ones((100, 100)), nameMYIMAGE) image_hdu2 fits.ImageHDU(datanp.ones((10, 10, 10)), nameMYCUBE)MEF 文件不限于纯图像或纯表格可以混合 c1 fits.Column(namea, arraynp.array([1, 2]), formatK) c2 fits.Column(nameb, arraynp.array([4, 5]), formatK) c3 fits.Column(namec, arraynp.array([7, 8]), formatK) table_hdu fits.BinTableHDU.from_columns([c1, c2, c3]) hdul fits.HDUList([primary_hdu, image_hdu, table_hdu])HDUList行为类似 list也可以追加 hdul.append(image_hdu2)多扩展HDUList与只有主 HDU 的用法一致用HDUList.writeto保存。FITS 标准强制每个文件恰好有一个PrimaryHDU且必须是第一个 HDU该约束在HDUList.writeto调用时被强制执行不满足会报错可通过output_verify选项修复或忽略这些警告。如果主 HDU 只想要基本头信息无数据先建Header再建PrimaryHDU hdr fits.Header() hdr[OBSERVER] Edwin Hubble hdr[COMMENT] Heres some commentary about this FITS file. empty_primary fits.PrimaryHDU(headerhdr)这样创建主 HDU 时FITS 格式必需的关键字如SIMPLE、NAXIS会被自动补全。用户一般不必手工管理这类关键字只需创建/修改观测相关的信息性关键字。便捷函数Convenience Functionsastropy.io.fits还提供若干高层便捷函数把打开/关闭文件的底层事务隐式处理好一个调用完成一个任务。⚠️注意这些函数适合交互式 Python 会话与较简单的分析脚本不应在应用代码中使用因为它们效率很低。例如每次调用getval都要重新解析整个 FITS 文件反复使用时应改用open打开文件直接访问数据结构。读取类便捷函数getheader获取某 HDU 的头文件只需文件名其余参数可选且灵活指定 HDU from astropy.io.fits import getheader hdr getheader(fits_image_filename) # 默认 HDU(0)即主 HDU 头 hdr getheader(fits_image_filename, ext0) hdr getheader(fits_image_filename, ext2) # 第二个扩展 hdr getheader(fits_image_filename, extnamesci) # 第一个 EXTNAMESCI 的 HDU hdr getheader(fits_image_filename, extnamesci, extver2) hdr getheader(fits_image_filename, ext(sci, 2)) # 元组等价写法含混的规格会抛出异常 getheader(fits_image_filename, ext(sci, 1), extnameerr, extver2) Traceback (most recent call last): ... TypeError: Redundant/conflicting extension arguments(s): ...拿到头文件后即可读取/修改关键字 fits_image_2_filename fits.util.get_testdata_filepath(o4sp040b0_raw.fits) hdr getheader(fits_image_2_filename, ext0) filter hdr[filter] # 读取关键字 filter 的值 val hdr[10] # 第 11 个关键字的值 hdr[filter] FW555 # 修改关键字值getval只读一个关键字时一步到位 from astropy.io.fits import getval getval(fits_image_2_filename, filter, ext0) # 第 0 扩展关键字 FILTER 的值 Clear getval(fits_image_2_filename, 10, extnamesci, extver2) Falsesetval编辑第 0 扩展中的单个头值也可新建关键字-值对卡片 fits.setval(fits_image_2_filename, filter, valueFW555) fits.setval(fits_image_2_filename, ANEWKEY, valuesome value)getdata获取某 HDU 的数据多一个可选参数header——为True时同时返回 data 与 header from astropy.io.fits import getdata data getdata(fits_image_filename, extnamesci, extver3) # 第 3 个 sci 扩展的数据 data, hdr getdata(fits_image_filename, ext1, headerTrue) # 数据加头文件源码层面这些函数都实现于 convenience.pygetheaderL99、getdataL131ext未指定且主 HDU 无数据时会尝试返回第一个扩展 HDU 的数据、getvalL269、setvalL303。getdata的扩展规格支持 HDU 编号、EXTNAME 名称、EXTNAMEEXTVER 组合等。写入类便捷函数writeto用给定数据与可选头文件写新 FITS 文件 fits.writeto(out.fits, data, hdr)append把数据与可选头文件追加到已有 FITS 文件若目标文件不存在则创建 fits.append(out.fits, data, hdr)update更新指定扩展。第三个参数可以是与数据关联的头文件若第三个参数不是头文件则它及后续位置参数被视为扩展规格。头与扩展规格也可用关键字参数给出from astropy.io.fits import update update(filename, dat, hdr, sci) # 更新 sci 扩展 update(filename, dat, 3) # 更新第 3 个扩展 update(filename, dat, hdr, 3) # 更新第 3 个扩展 update(filename, dat, sci, 2) # 更新第 2 个 SCI 扩展 update(filename, dat, 3, headerhdr) # 更新第 3 个扩展 update(filename, dat, headerhdr, ext5) # 更新第 5 个扩展writetoL415、appendL676支持checksum与verify参数、updateL752均在 convenience.py 中实现。比较与概览printdiff打印两个 FITS 文件的差异报告含头与数据。前两个参数必须是两个文件名或类型匹配的 FITS 文件对象第三个可选参数是扩展规格调用格式同getheader/getdata还可传FITSDiff类接受的任意关键字from astropy.io.fits import printdiff printdiff(inA.fits, inB.fits, ext2) # 比较 ext 2 的差异 printdiff(inA.fits, inB.fits, ignore_keywords(HISTORY,COMMENT))info打印指定 FITS 文件的概览信息是快速了解文件内容最有用的便捷函数之一 fits.info(fits_image_filename) Filename: ...test0.fits No. Name Ver Type Cards Dimensions Format 0 PRIMARY 1 PrimaryHDU 138 () 1 SCI 1 ImageHDU 61 (40, 40) int16 2 SCI 2 ImageHDU 61 (40, 40) int16 3 SCI 3 ImageHDU 61 (40, 40) int16 4 SCI 4 ImageHDU 61 (40, 40) int16命令行工具Astropy 的若干子包会在系统上安装命令行工具无需打开 Python 解释器即可完成常见任务。astropy.io.fits相关的工具包括fitsheader打印 FITS 文件的头文件scripts/fitsheader.py。支持-e/--extension按名称或编号指定扩展可重复、-k/--keyword指定关键字支持通配符可重复、-t/--table以机器可读表格格式输出如ascii.csv、ascii.html、ascii.latex、fits等等参数fitscheck验证并可选择重写 FITS 文件的 CHECKSUM 与 DATASUM 关键字scripts/fitscheck.pyfitsdiff比较两个 FITS 文件并报告差异scripts/fitsdiff.pyfits2bitmap把 FITS 图像转换为位图包括缩放与拉伸wcslint检查 FITS 文件中的 WCS 关键字是否符合标准。仓库中对应脚本位于 astropy/io/fits/scripts/相关测试见 test_fitsheader.py、test_fitscheck.py 与 test_fitsdiff.py。测试数据与进一步验证本文示例使用的test0.fits、tb.fits、o4sp040b0_raw.fits等文件都随包发布在 astropy/io/fits/tests/data/ 目录下可用fits.util.get_testdata_filepath()取得路径后按上述代码复现。围绕本文主题仓库中还提供了覆盖面很广的测试套件便捷函数测试见 test_convenience.py含getdata各种扩展规格、lower/upper 裁剪等用例、无符号整数约定测试见 test_uint.py、云存储fsspec相关测试见 test_fsspec.py。需要更深入的场景如头文件过渡、历史与 FAQ可继续查阅 docs/io/fits/index.rst 中列出的使用手册章节与附录并通过 astropy/io/fits/api/ 参考 API 文档获取每个类与函数的完整签名。小结本文围绕astropy.io.fits梳理了从打开、读取、修改到创建 FITS 文件的完整链路openHDUList是底层访问的核心Header提供了 dict/list 双语义的关键字操作ImageHDU/BinTableHDU分别覆盖图像与表格数据writeto/flush负责持久化getheader/getval/getdata/setval等便捷函数适合交互式快速操作命令行工具则适合批量处理。处理超大文件时善用memmap与section处理远程数据时使用use_fsspec面对非标准文件时用verify与output_verify把控质量——掌握这些要点后你就能在各类 FITS 数据处理任务中游刃有余。赞分享科学计算科研数据分析【免费下载链接】astropyAstronomy and astrophysics core library项目地址https://gitcode.com/gh_mirrors/as/astropy点击查看免费下载相关推荐Astropy FITS 文件处理完全指南基于 astropy.io.fits 的读取、写入与工程实践Astropy FITS 文件处理完全指南基于 astropy.io.fits 的读取、写入与工程实践 FITSFlexible Image TranspoAI 技能科研生物信息学数据科学astropy.io.fits FITS Header 完全指南从基本读写到 CONTINUE 与 HIERARCH 卡片进阶操作astropy.io.fits FITS Header 完全指南从基本读写到 CONTINUE 与 HIERARCH 卡片进阶操作 本指南以 astropy.科学计算科研数据分析Astropy FITS 文件处理与便利函数open / writeto / getdata / getheader 等完全指南Astropy FITS 文件处理与便利函数open / writeto / getdata / getheader 等完全指南 导读 astropy.io科学计算科研数据分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考