11# Licensed under a 3-clause BSD style license - see PYFITS.rst
22
3-
4-
53import datetime
64import os
75import sys
1311
1412from astropy .io .fits import conf
1513from astropy .io .fits .file import _File
16- from astropy .io .fits .header import Header , _pad_length
17- from astropy .io .fits .util import (_is_int , _is_pseudo_unsigned , _unsigned_zero ,
18- itersubclasses , decode_ascii , _get_array_mmap , first ,
19- _free_space_check , _extract_number )
14+ from astropy .io .fits .header import Header , BasicHeader , _pad_length
15+ from astropy .io .fits .util import (
16+ _is_int , _is_pseudo_unsigned , _unsigned_zero , itersubclasses , decode_ascii ,
17+ _get_array_mmap , first , _free_space_check , _extract_number )
2018from astropy .io .fits .verify import _Verify , _ErrList
2119
2220from astropy .utils import lazyproperty
@@ -68,6 +66,7 @@ def _hdu_class_from_header(cls, header):
6866 if not (c .__module__ .startswith ('astropy.io.fits.' ) or
6967 c in cls ._hdu_registry ):
7068 continue
69+ # print('try', c)
7170 if c .match_header (header ):
7271 klass = c
7372 break
@@ -154,6 +153,7 @@ def __init__(self, data=None, header=None, *args, **kwargs):
154153 if header is None :
155154 header = Header ()
156155 self ._header = header
156+ self ._header_str = None
157157 self ._file = None
158158 self ._buffer = None
159159 self ._header_offset = None
@@ -176,6 +176,9 @@ def __init__(self, data=None, header=None, *args, **kwargs):
176176
177177 @property
178178 def header (self ):
179+ if self ._header is None and self ._header_str is not None :
180+ self ._header = Header .fromstring (self ._header_str )
181+ self ._header_str = None
179182 return self ._header
180183
181184 @header .setter
@@ -390,7 +393,12 @@ def _readfrom_internal(cls, data, header=None, checksum=False,
390393 if isinstance (data , _File ):
391394 if header is None :
392395 header_offset = data .tell ()
393- header = Header .fromfile (data , endcard = not ignore_missing_end )
396+ try :
397+ header_str , header = BasicHeader .fromfile (data )
398+ except Exception :
399+ data .seek (header_offset )
400+ header = Header .fromfile (data ,
401+ endcard = not ignore_missing_end )
394402 hdu_fileobj = data
395403 data_offset = data .tell () # *after* reading the header
396404 else :
@@ -457,6 +465,10 @@ def block_iter(nbytes):
457465 if checksum and checksum != 'remove' and isinstance (hdu , _ValidHDU ):
458466 hdu ._verify_checksum_datasum ()
459467
468+ if isinstance (hdu ._header , BasicHeader ):
469+ hdu ._header = None
470+ hdu ._header_str = header_str
471+
460472 return hdu
461473
462474 def _get_raw_data (self , shape , code , offset ):
0 commit comments