Python astropy.io.fits-层次关键词don';t使用“继续”卡:错误或“继续”;特写“;符合标准吗?
Python astropy.io.fits-层次关键词don';t使用“继续”卡:错误或“继续”;特写“;符合标准吗?,python,fits,astropy,pyfits,Python,Fits,Astropy,Pyfits,astropy.io.fitsmanual声明,我们可以使用长度超过8个字符的标题关键字。在这种情况下。手册还指出,如果我们想要存储超过80个字符的关键字-值对 然而,在实践中,这两个定义似乎只是相互排斥的,即我们无法创建包含关键字-值对的FITS文件,其中关键字长度超过8个字符(即层次关键字),且值是非常长的字符串 例如: from astropy.io import fits header1 = fits.Header() header2 = fits.Header() header3 =
astropy.io.fits
manual声明,我们可以使用长度超过8个字符的标题关键字。在这种情况下。手册还指出,如果我们想要存储超过80个字符的关键字-值对
然而,在实践中,这两个定义似乎只是相互排斥的,即我们无法创建包含关键字-值对的FITS文件,其中关键字长度超过8个字符(即层次关键字),且值是非常长的字符串
例如:
from astropy.io import fits
header1 = fits.Header()
header2 = fits.Header()
header3 = fits.Header()
header1['TEST'] = 'superlongstring'*10
header2['TEST TEST'] = 'superlongstring'
header3['TEST TEST'] = 'superlongstring'*10
这里的header1
和header2
是正确的,但是当调用repr(header3)
或试图用这样的头保存FITS文件时,会出现错误ValueError:关键字TEST及其值太长
这是否是FITS标准的“意外功能”,即HIERARCH
关键字不能用CONTINUE
卡继续,或者这可能仅仅是astropy.io.FITS
的一个bug?以下部分答案由熟悉astropy代码库的同事提供
查看astropy
源代码,明确排除在属于HIERARCH关键字的值中使用CONTINUE卡
在源代码中,我们发现():
该评论来自2011年,是在pyfits重新设计期间发表的。在此之前,pyfits还可以单独阅读或书写等级卡或带有CONTINUE语句的卡,显然它是这样保存的。有关:
然而,根据我的感觉,没有什么特别的理由让等级制度将长期价值排除在继续之外
到目前为止,我的同事给出了答案,他最后建议在astropy问题跟踪器中创建一张罚单
我也做了一些研究
我自己HIERARCH和CONTINUE关键字都不是
官员。HIERARCH关键字约定是
屈服于
而CONTINUE公约是由。仔细阅读这两个定义,我认为绝对没有理由认为它们应该相互排斥。因此,我创建了一个
编辑:
正如iGuanaut在回答中所提到的,似乎有一个原因表明它们确实是互斥的,即等级卡在形式上根本不包含任何值。。。疯狂但真实,因此我认为我的答案是不正确的。我在中写道,但我在这里也复制了一个版本作为可能的答案:
这里的问题是CONTINUE约定严格限于扩展具有字符串值的卡的值(即,它不适用于具有不同类型值的卡)。但是,从形式上讲,使用HIERARCH约定的卡根本没有任何价值,因此CONTINUE约定不适用于它,除非在使用HIERARCH约定解析卡时隐式支持CONTINUE约定。因为在如何做到这一点上存在歧义(例如,关键字的最大长度是多少?),并且因为等级惯例没有明确允许这种解释(它为如何解释等级卡的内容提供了一套具体的指导原则)FITS读者应避免对某些未记录的层次卡解释添加任何隐含支持(从而建立另一种大多数读者/作者不支持的隐含约定)
我们可以做的是游说ESO HIERARCH约定的作者更新他们的约定,以明确与CONTINUE约定的相互兼容性,在任何支持这两种约定的FITS阅读器中都应该允许这样做。但与此同时,这一问题也充满了困难,即使“显然”他们可以合作。Feature。这两个约定互不兼容。响应延迟,部分不直接相关,但是,在astropy的标记中不添加这个难看的“HIERARCH”关键字,是否可以使用>8个字符的键?(为了特定用例的目的,而不是与学术人士共享)?@Tobbey否,FITS标准(astropy遵守)明确规定了这一点
keywordvalue_length = len(keyword) + len(delimiter) + len(value)
if (keywordvalue_length > self.length and
keyword.startswith('HIERARCH')):
if (keywordvalue_length == self.length + 1 and keyword[-1] == ' '):
output = ''.join([keyword[:-1], delimiter, value, comment])
else:
# I guess the HIERARCH card spec is incompatible with CONTINUE
# cards
raise ValueError('The keyword %s with its value is too long' %
self.keyword)
if cardimage[:8].upper() == 'HIERARCH':
card = _HierarchCard()
# for card image longer than 80, assume it contains CONTINUE card(s).
elif len(cardimage) > Card.length:
card = _ContinueCard()