0

ヘッダーに utf8 テキストを含むいくつかの適合ファイルを処理する必要があります。これは、基本的に pyfits パッケージのすべての機能が動作しないことを意味します。また、fits ヘッダーはリストではなくクラスであるため、 .decodeは機能しません。データを処理できるようにヘッダーをデコードする方法を知っている人はいますか? 実際の内容はそれほど重要ではないので、文字を無視するなどで構いません。私の現在のコードは次のようになります。

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

そして私は得る: AttributeError: 'Header' object has no attribute '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.

気にしなくていいので、エントリーに何か書こうと思いました。ただし、どのエントリに不正な文字が含まれているかを取得することもできます。数百のファイルがあるため、バッチ ソリューションが必要です。

4

2 に答える 2

1

anatoly techtonikが指摘したように、FITS ヘッダーの非 ASCII 文字は完全に無効であり、無効な FITS ファイルを作成します。astropy.io.fitsそうは言っても、少なくとも無効なエントリを読み取ることができればいいのですが。そのサポートは現在壊れており、それを修正するにはチャンピオンが必要ですが、それは十分にまれな問題であり、ほとんどの人は 1 つまたは 2 つのファイルで問題に遭遇し、それらのファイルを修正して先に進むため、誰も持っていません。しかし、誰かが問題に取り組むのが大好きです。

それまでの間、このファイルが問題を起こしている文字列が正確にわかっているので、生のバイナリ モードでファイルを開き、文字列を置き換えます。FITS ファイルが非常に大きい場合は、一度に 1 ブロックずつ読み取り、それらのブロックで置換を行うことができます。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 ファイルを公開するべきではありません。

于 2016-09-22T11:28:03.600 に答える
0

PyFITSサポートしていないようです(まだ?)

https://github.com/astropy/astropy/issues/3497から:

FITS は Unicode より前から存在し、ASCII 印刷可能文字以外のデータをサポートするように更新されたことはありません。FITS ヘッダーで非 ASCII 文字をエンコードすることはできません。

于 2016-09-21T12:25:21.837 に答える