将拟合文件数据和/或标题复制到新的拟合文件中

时间:2018-04-26 13:02:48

标签: astronomy astropy fits pyfits

以前曾问过类似的问题,但是以一种暧昧的方式询问并使用不同的代码。 我的问题:我想将.fits文件头的精确副本复制到一个新文件中。 (我需要处理一个拟合文件,我更改数据,保持标题相同并将结果保存在新文件中)。这是一个简短的示例代码,只展示了我使用的工具以及我得出的差异:

data_old, header_old = fits.getdata("input_file.fits", header=True)
fits.writeto('output_file.fits', data_old, header_old, overwrite=True)

我现在希望这些文件是精确的副本(两者的标题和数据相同)。但如果我检查差异,例如这样 -

fits.printdiff("input_file.fits", "output_file.fits")

我看到这两个文件并不是彼此的精确副本。报告说:

...
Files contain different numbers of HDUs:
 a: 3
 b: 2

Primary HDU:

   Headers contain differences:
     Headers have different number of cards:
      a: 54
      b: 4
...

Extension HDU 1:

   Headers contain differences:
     Keyword GCOUNT   has different comments:
...

为什么没有确切的副本?如何对标题(和/或数据)进行精确复制?关键是忘记了吗?是否有另一种简单的方法来复制粘贴一个fit-file-header?

1 个答案:

答案 0 :(得分:1)

如果您只想更新现有文件中的数据数组,同时保留结构的其余部分,您是否尝试过update函数?

唯一的问题是它似乎没有选择写入新文件而不是更新现有文件(可能它应该有此选项)。但是,您仍然可以通过先复制现有文件然后更新副本来使用它。

或者,您可以使用面向对象的API直接执行操作。类似的东西:

with fits.open(filename) as hdu_list:
    hdu = hdu_list[<name or index of the HDU to update>]
    hdu.data = <new ndarray>
    # or hdu.data[<some index>] = <some value> i.e. just directly modify the existing array
    hdu.writeto('updated.fits')  # to write just that HDU to a new file, or
    # hdu_list.writeto('updated.fits')  # to write all HDUs, including the updated one, to a new file

关于这一点没有“pythonic”:)