在python(pyfits)中打开/编辑utf8适合头

时间:2016-09-21 12:15:35

标签: python decode fits pyfits

我必须处理一些在其标题中包含utf8文本的拟合文件。这意味着基本上所有pyfits包的功能都不起作用。此外, .decode 不起作用,因为fit标头是一个不是列表的类。有人知道如何解码标题,以便我可以处理数据吗?实际内容并不那么重要,所以忽略这些字母就好了。我目前的代码如下:

hdulist = fits.open('Jupiter.FIT')
hdu = hdulist[0].header
hdu.decode('ascii', errors='ignore')

我得到:     AttributeError:'标题'对象没有属性' 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.

我想在条目中写点什么,所以我不需要关心它。但是我可以'甚至检索哪个条目包含坏字符,我想有一个批处理解决方案,因为我有几百个文件。

2 个答案:

答案 0 :(得分:1)

由于FITS标题中的非ASCII字符的解析技术pointed out完全无效,并且会生成无效的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)

这很难看,对于一个非常大的文件可能会很慢,但这是一个开始。我可以想到更好的解决方案,但是如果你只需要修复一些文件就很难理解并且可能不值得花时间。

一旦完成,请给文件的发起人严厉交谈 - 他们不应该发布损坏的FITS文件。

答案 1 :(得分:0)

看起来PyFITS只是不支持它(还有?)

来自https://github.com/astropy/astropy/issues/3497

  

FITS早于unicode,从未更新为支持数据的ASCII可打印字符以外的任何内容。在FITS标题中编码非ASCII字符是不可能的。