Als anatoly Techtonik pointed out Nicht-ASCII-Zeichen in FITS-Header völlig ungültig sind und ungültig FITS machen Dateien. Das heißt, es wäre schön, wenn astropy.io.fits
zumindest die ungültigen Einträge lesen könnte. Die Unterstützung dafür ist derzeit kaputt und benötigt einen Champion, um es zu beheben, aber niemand hat es, weil es ein selten genug Problem ist, und die meisten Leute treffen es in einer oder zwei Dateien, reparieren diese Dateien und gehen weiter. Würde mich freuen, wenn jemand das Problem angehen würde.
In der Zwischenzeit, da Sie genau wissen, welche Zeichenfolge diese Datei auf Schluckauf ist, würde ich nur die Datei im rohen Binärmodus öffnen und die Zeichenfolge ersetzen. Wenn die FITS-Datei sehr groß ist, können Sie sie blockweise lesen und die Blöcke austauschen. FITS-Dateien (insbesondere Header) werden in 2880-Byte-Blöcken geschrieben, sodass Sie wissen, dass die Stelle, an der diese Zeichenfolge angezeigt wird, an einem solchen Block ausgerichtet ist und Sie darüber hinaus kein Header-Format analysieren müssen. Stellen Sie nur sicher, dass die Zeichenfolge, durch die Sie es ersetzen, nicht länger als die ursprüngliche Zeichenfolge ist, und dass es, wenn es kürzer ist, mit Leerzeichen aufgefüllt wird, da FITS-Header ein Format fester Breite und alles, das die Länge eines Headers ändert Die gesamte Datei wird beschädigt. Für diesen speziellen Fall ist, dann würde ich so etwas wie dies versucht:
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)
Dies ist hässlich, und für eine sehr große Datei kann langsam sein, aber es ist ein Anfang. Ich kann mir bessere Lösungen ausdenken, aber diese sind schwerer zu verstehen und es lohnt sich wahrscheinlich nicht, sich die Zeit zu nehmen, wenn Sie nur eine Handvoll Dateien reparieren müssen.
Sobald dies erledigt ist, geben Sie bitte dem Urheber der Datei ein ernstes Gespräch - sie sollten keine korrupten FITS-Dateien veröffentlichen.
''Uni G \ xföttingen, Institut f \ xfcr Astrophysik' 'ist nicht UTF-8, es ist (wahrscheinlich) die Latin1-Kodierung von' 'Uni Göttingen, Institut für Astrophysik' '; das Äquivalent UTF-8 ist "Uni G \ xc3 \ xb6ttingen, Institut f \ xc3 \ xbcr Astrophysik" –