Source code for clfits.io

"""Functions for reading and writing FITS headers."""

from pathlib import Path
from typing import Union

from astropy.io import fits
from astropy.io.fits.header import Header

HDU = Union[int, str]


[docs] def read_header(fits_file: Path, hdu: HDU = 0) -> Header: """Read a header from a specific HDU in a FITS file. Parameters ---------- fits_file : Path The path to the FITS file. hdu : int or str, optional The HDU to read from, specified by its 0-based index or name, by default 0 (the primary HDU). Returns ------- Header The header object from the specified HDU. Raises ------ FileNotFoundError If the FITS file does not exist. IndexError If the HDU index is out of range. KeyError If the HDU name is not found. OSError If the file is not a valid FITS file. """ if not fits_file.exists(): raise FileNotFoundError(f"Error: FITS file not found at '{fits_file}'") try: with fits.open(fits_file) as hdul: return hdul[hdu].header except (IndexError, KeyError) as e: # Re-raise with a more informative message raise e.__class__(f"Error: HDU '{hdu}' not found in '{fits_file}'.") from e except OSError as e: # Catch errors like truncated files raise OSError(f"Error: Not a valid FITS file: '{fits_file}'") from e
[docs] def write_header(fits_file: Path, header: Header, hdu: HDU = 0) -> None: """Write a header to a specific HDU of a FITS file. This function opens the FITS file in update mode and replaces the header of the specified HDU with the new one. Parameters ---------- fits_file : Path The path to the FITS file. header : Header The header object to write to the file. hdu : int or str, optional The HDU to write to, specified by its 0-based index or name, by default 0 (the primary HDU). Raises ------ FileNotFoundError If the FITS file does not exist. IndexError If the HDU index is out of range. KeyError If the HDU name is not found. OSError If the file is not a valid FITS file or cannot be written to. """ if not fits_file.exists(): raise FileNotFoundError(f"Error: FITS file not found at '{fits_file}'") try: with fits.open(fits_file, mode="update") as hdul: hdul[hdu].header = header hdul.flush() # Ensure changes are written to disk except (IndexError, KeyError) as e: raise e.__class__(f"Error: HDU '{hdu}' not found in '{fits_file}'.") from e except OSError as e: raise OSError(f"Error: Could not write to FITS file: '{fits_file}'") from e