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 ファイルを公開するべきではありません。