【问题标题】:How to update a FITS file header using FitsIO?如何使用 FitsIO 更新 FITS 文件头?
【发布时间】:2019-04-19 20:43:08
【问题描述】:

我目前正在尝试修改 FITS 文件的标题。更具体地说,我想向它附加新的关键字。我使用 FitsIO for python,版本为 0.9.11。

在一些数据处理过程中,我的程序会创建新的 FITS 文件并更新它们的内容和标题。我曾经使用 Astropy 工作,但这不再是一个选择,所以我转而使用 FitsIO,这对我来说是一个很大的挑战。

内容更新/覆盖相当简单,但我在修改标题时遇到了麻烦。为了隔离我的问题,并找到正确的过程(文档不是很有帮助),我创建了一个小程序,只测试如何编写标题。

作为输入数据,我使用包含以下内容的 FITSHDR 对象:

update_data = fitsio.FITSHDR([
"IVAL    =                   36 / integer value           ",
"SHORTS  = 'hello w'                                      ",
"DBL     =                 1.25                           ",
"CDELT1  =                 0.00333333333333               "])

以下是经过测试的功能:

def write_hdu_1(data, fits_file):
    with fitsio.FITS(fits_file, 'rw', clobber=True) as fits:
        fits[extension].write_keys(data)

RESULT:删除 END 卡,损坏 HDU。

def write_hdu_2(data, fits_file):
   with fitsio.FITS(fits_file, 'rw', clobber=True) as fits:
       for key in data.keys():
           fits[extension].write_key(key, data.get(key))

RESULT:删除 END 卡,损坏 HDU。

def write_hdu_3(fits_file):
    with fitsio.FITS(fits_file, 'rw', clobber=True) as fits:
        keydict = { 'name':'test', 'value':35, 'comment':'keydict test'}
        fits[-1].write_key(**keydict)

结果

File "test_fitsio.py", line 26, in write_hdu_3
    fits[-1].write_key(**keydict)
TypeError: write_key() got an unexpected keyword argument 'name'

无奈之下,我终于手动添加了“END”卡,像这样:

def write_hdu(self, header_content):
    self.fits[extension].write_keys(header_content)
    self.fits[extension].write_key('END', '')

但是,然后,END 卡用空格填充,我正在使用的其他库无法正确识别。

那么,对于如何使用 python FitsIO 添加/更新标题关键字,并且在过程中不丢失“END”卡,您有什么后见之明吗?

谢谢!

【问题讨论】:

  • “我曾经使用 Astropy 工作,但这不再是一个选项,所以我回退到 FitsIO” 为什么它不是一个选项? astropy.fits.io 在处理标头时通常更好。而在某些情况下,fitsio 在处理大型数据文件时会有更好的性能。没有理由不能在不同的环境中同时使用这两种方法。
  • 我的项目中使用的 Astropy.fits 版本无法很好地处理大于 RAM 大小的文件,这就是我的情况。而且,作为一个偏好问题,我真的不喜欢在一个程序中拥有多个库,专门用于同一目的。

标签: python python-3.x fits


【解决方案1】:

打开文件时删除clobber 选项,标题版本将起作用。 clobber 选项用于在打开任何现有文件之前删除它,请参阅docstringcode 实现。

在我看来,这就像 Python3 中的 fitio 0.9.11 的魅力:

with fitsio.FITS('test.fits', 'rw') as ff:
    ff[-1].write_key('KEY', 'key value', 'my comment')

另一方面,如果您使用clobber 选项,则在现有文件上使用相同的代码在给定的 HDU 标头中附加关键字会从磁盘中删除文件。

$ du -sh test.fits                                                                                           
308K    test.fits
$ python3 -c "import fitsio; ff = fitsio.FITS('test.fits', 'rw', clobber=True); ff[-1].write_key('KEY', 'key value', 'my comment')"
$ du -sh test.fits                                                                                  
4.0K    test.fits
$ cat test.fits
KEY     = 'key value'          / my comment                                     END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

这是一个安静的奇怪结果,但 fitio 将 END 关键字附加在一个空文件上,如果不是有效的 FITS 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 2020-03-03
    • 2019-07-26
    • 1970-01-01
    • 2019-02-01
    • 2019-02-04
    相关资源
    最近更新 更多