我必须处理一些在头中包含utf8文本的fits文件。这意味着基本上所有的功能都不起作用。而且,.decode不工作,因为fits头是类而不是列表。有人知道如何解码标题以便我可以处理数据吗?实际内容不那么重要,所以忽略字母之类的东西是可以的。我的当前代码如下:
hdulist = fits.open('Jupiter.FIT')
hdu = hdulist[0].header
hdu.decode('ascii', errors='ignore')我得到: AttributeError:'Header‘对象没有属性'decode’
职能如下:
print (hdu)返回:
ValueError: FITS header values must contain standard printable ASCII characters; "'Uni G\xf6ttingen, Institut f\xfcr Astrophysik'" contains characters/bytes that do not represent printable characters in ASCII.我想在条目里写点什么,所以我不需要关心它。但是,我甚至可以检索包含坏字符的条目,并且我希望有一个批处理解决方案,因为我有几百个文件。
发布于 2016-09-22 11:28:03
由于anatoly pointed out非ASCII字符在FITS头是完全无效的,并使无效的FITS文件。尽管如此,如果astropy.io.fits至少能够读取无效条目,那就太好了。对此的支持目前已经中断,需要一个拥护者来修复它,但是没有人这样做,因为这是一个非常少见的问题,大多数人会在一两个文件中遇到它,修复这些文件,然后继续前进。希望有人能解决这个问题。
同时,由于您确切地知道该文件正在执行哪个字符串,所以我只需以原始二进制模式打开该文件并替换该字符串。如果FITS文件非常大,您可以一次读取一个块并对这些块进行替换。FITS文件(特别是头文件)是用2880字节块编写的,因此您知道字符串出现的任何位置都将与这样的块对齐,而且您不必再对头格式进行任何解析。只需确保替换它的字符串不长于原始字符串,如果字符串较短,则使用空格填充,因为FITS标头是固定的宽度格式,任何更改标头长度的内容都会破坏整个文件。在这个特殊的情况下,我会尝试这样的方法:
bad_str = 'Uni Göttingen, Institut für Astrophysik'.encode('latin1')
good_str = 'Uni Gottingen, Institut fur Astrophysik'.encode('ascii')
# In this case I already know the replacement is the same length so I'm no worried about it
# A more general solution would require fixing the header parser to deal with non-ASCII bytes
# in some consistent manner; I'm also looking for the full string instead of the individual
# characters so that I don't corrupt binary data in the non-header blocks
in_filename = 'Jupiter.FIT'
out_filename = 'Jupiter-fixed.fits'
with open(in_filename, 'rb') as inf, open(out_filename, 'wb') as outf:
while True:
block = inf.read(2880)
if not block:
break
block = block.replace(bad_str, good_str)
outf.write(block)这很难看,对于一个非常大的文件来说,它可能很慢,但这是一个开始。我可以想出更好的解决方案,但这很难理解,而且如果您有少量的文件需要修复,则可能不值得花时间。
一旦完成,请给文件的发起人一个严厉的谈话--他们不应该发布腐败的契合文件。
发布于 2016-09-21 12:25:21
看起来PyFITS只是不支持它(现在?)
来自https://github.com/astropy/astropy/issues/3497
FITS早于unicode,从未更新过以支持ASCII可打印的数据字符以外的任何内容。不可能在适合的标题中编码非ASCII字符。
https://stackoverflow.com/questions/39616304
复制相似问题