Skip to main content

A full featured python library to read from and write to FITS files.

Project description

fitsio

build wheels/sdist tests

A Python library to read from and write to FITS files.

Description

This is a Python extension written in C and Python. Data are read into numerical Python arrays.

A version of cfitsio is bundled with this package, there is no need to install your own, nor will this conflict with a version you have installed.

Some Features

  • Read from and write to image, binary, and ASCII table extensions.
  • Read arbitrary subsets of table columns and rows without loading all the data to memory.
  • Read image subsets without reading the whole image.
  • Write subsets to existing images.
  • Write and read variable length table columns.
  • Read images and tables using slice notation similar to numpy arrays. (This is like a more powerful memmap, since it is column-aware for tables.)
  • Append rows to an existing table.
  • Delete row sets and row ranges, resize tables, or insert rows.
  • Query the columns and rows in a table.
  • Read and write header keywords.
  • Read and write images in tile-compressed format (RICE, GZIP, PLIO ,HCOMPRESS).
  • Read/write GZIP files directly.
  • Read unix compress (.Z, .zip) and bzip2 (.bz2) files.
  • TDIM information is used to return array columns in the correct shape.
  • Write and read string table columns, including array columns of arbitrary shape.
  • Read and write complex, bool (logical), unsigned integer, signed bytes types.
  • Write checksums into the header and verify them.
  • Insert new columns into tables in-place.
  • Iterate over rows in a table. Data are buffered for efficiency.
  • Python 3 support, including Python 3 strings.

Examples

import fitsio
from fitsio import FITS,FITSHDR

# Often you just want to quickly read or write data without bothering to
# create a FITS object.  In that case, you can use the read and write
# convienience functions.

# read all data from the first hdu that has data
filename='data.fits'
data = fitsio.read(filename)

# read a subset of rows and columns from a table
data = fitsio.read(filename, rows=[35,1001], columns=['x','y'], ext=2)

# read the header
h = fitsio.read_header(filename)
# read both data and header
data,h = fitsio.read(filename, header=True)

# open the file and write a new binary table extension with the data
# array, which is a numpy array with fields, or "recarray".

data = np.zeros(10, dtype=[('id','i8'),('ra','f8'),('dec','f8')])
fitsio.write(filename, data)

# Write an image to the same file. By default a new extension is
# added to the file.  use clobber=True to overwrite an existing file
# instead.  To append rows to an existing table, see below.

fitsio.write(filename, image)

#
# the FITS class gives the you the ability to explore the data, and gives
# more control
#

# open a FITS file for reading and explore
fits=fitsio.FITS('data.fits')

# see what is in here; the FITS object prints itself
print(fits)

file: data.fits
mode: READONLY
extnum hdutype         hduname
0      IMAGE_HDU
1      BINARY_TBL      mytable

# at the python or ipython prompt the fits object will
# print itself
>>> fits
file: data.fits
... etc

# explore the extensions, either by extension number or
# extension name if available
>>> fits[0]

file: data.fits
extension: 0
type: IMAGE_HDU
image info:
  data type: f8
  dims: [4096,2048]

# by name; can also use fits[1]
>>> fits['mytable']

file: data.fits
extension: 1
type: BINARY_TBL
extname: mytable
rows: 4328342
column info:
  i1scalar            u1
  f                   f4
  fvec                f4  array[2]
  darr                f8  array[3,2]
  dvarr               f8  varray[10]
  s                   S5
  svec                S6  array[3]
  svar                S0  vstring[8]
  sarr                S2  array[4,3]

# See bottom for how to get more information for an extension

# [-1] to refers the last HDU
>>> fits[-1]
...

# if there are multiple HDUs with the same name, and an EXTVER
# is set, you can use it.  Here extver=2
#    fits['mytable',2]


# read the image from extension zero
img = fits[0].read()
img = fits[0][:,:]

# read a subset of the image without reading the whole image
img = fits[0][25:35, 45:55]


# read all rows and columns from a binary table extension
data = fits[1].read()
data = fits['mytable'].read()
data = fits[1][:]

# read a subset of rows and columns. By default uses a case-insensitive
# match. The result retains the names with original case.  If columns is a
# sequence, a numpy array with fields, or recarray is returned
data = fits[1].read(rows=[1,5], columns=['index','x','y'])

# Similar but using slice notation
# row subsets
data = fits[1][10:20]
data = fits[1][10:20:2]
data = fits[1][[1,5,18]]

# Using EXTNAME and EXTVER values
data = fits['SCI',2][10:20]

# Slicing with reverse (flipped) striding
data = fits[1][40:25]
data = fits[1][40:25:-5]

# all rows of column 'x'
data = fits[1]['x'][:]

# Read a few columns at once. This is more efficient than separate read for
# each column
data = fits[1]['x','y'][:]

# General column and row subsets.
columns=['index','x','y']
rows = [1, 5]
data = fits[1][columns][rows]

# data are returned in the order requested by the user
# and duplicates are preserved
rows = [2, 2, 5]
data = fits[1][columns][rows]

# iterate over rows in a table hdu
# faster if we buffer some rows, let's buffer 1000 at a time
fits=fitsio.FITS(filename,iter_row_buffer=1000)
for row in fits[1]:
    print(row)

# iterate over HDUs in a FITS object
for hdu in fits:
    data=hdu.read()

# Note dvarr shows type varray[10] and svar shows type vstring[8]. These
# are variable length columns and the number specified is the maximum size.
# By default they are read into fixed-length fields in the output array.
# You can over-ride this by constructing the FITS object with the vstorage
# keyword or specifying vstorage when reading.  Sending vstorage='object'
# will store the data in variable size object fields to save memory; the
# default is vstorage='fixed'.  Object fields can also be written out to a
# new FITS file as variable length to save disk space.

fits = fitsio.FITS(filename,vstorage='object')
# OR
data = fits[1].read(vstorage='object')
print(data['dvarr'].dtype)
    dtype('object')


# you can grab a FITS HDU object to simplify notation
hdu1 = fits[1]
data = hdu1['x','y'][35:50]

# get rows that satisfy the input expression.  See "Row Filtering
# Specification" in the cfitsio manual (note no temporary table is
# created in this case, contrary to the cfitsio docs)
w=fits[1].where("x > 0.25 && y < 35.0")
data = fits[1][w]

# read the header
h = fits[0].read_header()
print(h['BITPIX'])
    -64

fits.close()


# now write some data
fits = FITS('test.fits','rw')


# create a rec array.  Note vstr
# is a variable length string
nrows=35
data = np.zeros(nrows, dtype=[('index','i4'),('vstr','O'),('x','f8'),
                              ('arr','f4',(3,4))])
data['index'] = np.arange(nrows,dtype='i4')
data['x'] = np.random.random(nrows)
data['vstr'] = [str(i) for i in xrange(nrows)]
data['arr'] = np.arange(nrows*3*4,dtype='f4').reshape(nrows,3,4)

# create a new table extension and write the data
fits.write(data)

# can also be a list of ordinary arrays if you send the names
array_list=[xarray,yarray,namearray]
names=['x','y','name']
fits.write(array_list, names=names)

# similarly a dict of arrays
fits.write(dict_of_arrays)
fits.write(dict_of_arrays, names=names) # control name order

# append more rows to the table.  The fields in data2 should match columns
# in the table.  missing columns will be filled with zeros
fits[-1].append(data2)

# insert a new column into a table
fits[-1].insert_column('newcol', data)

# insert with a specific colnum
fits[-1].insert_column('newcol', data, colnum=2)

# overwrite rows
fits[-1].write(data)

# overwrite starting at a particular row. The table will grow if needed
fits[-1].write(data, firstrow=350)


# create an image
img=np.arange(2*3,dtype='i4').reshape(2,3)

# write an image in a new HDU (if this is a new file, the primary HDU)
fits.write(img)

# write an image with rice compression
fits.write(img, compress='rice')

# control the compression
fimg=np.random.normal(size=2*3).reshape(2, 3)
fits.write(img, compress='rice', qlevel=16, qmethod='SUBTRACTIVE_DITHER_2')

# lossless gzip compression for integers or floating point
fits.write(img, compress='gzip', qlevel=None)
fits.write(fimg, compress='gzip', qlevel=None)

# overwrite the image
fits[ext].write(img2)

# write into an existing image, starting at the location [300,400]
# the image will be expanded if needed
fits[ext].write(img3, start=[300,400])

# change the shape of the image on disk
fits[ext].reshape([250,100])

# add checksums for the data
fits[-1].write_checksum()

# can later verify data integridy
fits[-1].verify_checksum()

# you can also write a header at the same time.  The header can be
#   - a simple dict (no comments)
#   - a list of dicts with 'name','value','comment' fields
#   - a FITSHDR object

hdict = {'somekey': 35, 'location': 'kitt peak'}
fits.write(data, header=hdict)
hlist = [{'name':'observer', 'value':'ES', 'comment':'who'},
         {'name':'location','value':'CTIO'},
         {'name':'photometric','value':True}]
fits.write(data, header=hlist)
hdr=FITSHDR(hlist)
fits.write(data, header=hdr)

# you can add individual keys to an existing HDU
fits[1].write_key(name, value, comment="my comment")

# Write multiple header keys to an existing HDU. Here records
# is the same as sent with header= above
fits[1].write_keys(records)

# write special COMMENT fields
fits[1].write_comment("observer JS")
fits[1].write_comment("we had good weather")

# write special history fields
fits[1].write_history("processed with software X")
fits[1].write_history("re-processed with software Y")

fits.close()

# using a context, the file is closed automatically after leaving the block
with FITS('path/to/file') as fits:
    data = fits[ext].read()

    # you can check if a header exists using "in":
    if 'blah' in fits:
        data=fits['blah'].read()
    if 2 in f:
        data=fits[2].read()

# methods to get more information about extension.  For extension 1:
f[1].get_info()             # lots of info about the extension
f[1].has_data()             # returns True if data is present in extension
f[1].get_extname()
f[1].get_extver()
f[1].get_extnum()           # return zero-offset extension number
f[1].get_exttype()          # 'BINARY_TBL' or 'ASCII_TBL' or 'IMAGE_HDU'
f[1].get_offsets()          # byte offsets (header_start, data_start, data_end)
f[1].is_compressed()        # for images. True if tile-compressed
f[1].get_colnames()         # for tables
f[1].get_colname(colnum)    # for tables find the name from column number
f[1].get_nrows()            # for tables
f[1].get_rec_dtype()        # for tables
f[1].get_rec_column_descr() # for tables
f[1].get_vstorage()         # for tables, storage mechanism for variable
                            # length columns

# public attributes you can feel free to change as needed
f[1].lower           # If True, lower case colnames on output
f[1].upper           # If True, upper case colnames on output
f[1].case_sensitive  # if True, names are matched case sensitive

Installation

The easiest way is using pip or conda. To get the latest release

pip install fitsio

# update fitsio (and everything else)
pip install fitsio --upgrade

# if pip refuses to update to a newer version
pip install fitsio --upgrade --ignore-installed

# if you only want to upgrade fitsio
pip install fitsio --no-deps --upgrade --ignore-installed

# for conda, use conda-forge
conda install -c conda-forge fitsio

You can also get the latest source tarball release from

https://pypi.python.org/pypi/fitsio

or the bleeding edge source from GitHub or use git. To check out the code for the first time

git clone https://github.com/esheldon/fitsio.git

Or at a later time to update to the latest

cd fitsio
git update

To install, run

pip install .

Requirements

  • python >=3.10
  • a C compiler and build tools (make, patch, etc. for linux/osx; cmake, nmake, patch, etc. for windows)
  • numpy (See the note below. Generally, numpy 1.11 or later is better.)

Do not use numpy 1.10.0 or 1.10.1

There is a serious performance regression in numpy 1.10 that results in fitsio running tens to hundreds of times slower. A fix may be forthcoming in a later release. Please comment on GitHub issue numpy/issues/6467 here if this has already impacted your work

Tests

The unit tests should all pass for full support.

pytest fitsio

Some tests may fail if certain libraries are not available, such as bzip2. This failure only implies that bzipped files cannot be read, without affecting other functionality.

Linting and Code Formatting

We use the pre-commit framework for linting and code formatting. To run the linting and code formatting, use the following command

pre-commit run -a

Notes on Usage and Features

cfitsio bundling

We bundle cfitsio partly because many deployed versions of cfitsio in the wild do not have support for interesting features like tiled image compression. Bundling a version that meets our needs is a safe alternative.

Array Ordering

Since numpy uses C order, FITS uses fortran order, we have to write the TDIM and image dimensions in reverse order, but write the data as is. Then we need to also reverse the dims as read from the header when creating the numpy dtype, but read as is.

distutils vs setuptools

As of version 1.0.0, fitsio has been transitioned to setuptools for packaging and installation. There are many reasons to do this (and to not do this). However, at a practical level, what this means for you is that you may have trouble uninstalling older versions with pip via pip uninstall fitsio. If you do, the best thing to do is to manually remove the files manually. See this stackoverflow question for example.

Python 3 Strings

As of version 1.0.0, fitsio now supports Python 3 strings natively. This support means that for Python 3, native strings are read from and written correctly to FITS files. All byte string columns are treated as ASCII-encoded unicode strings as well. For FITS files written with a previous version of fitsio, the data in Python 3 will now come back as a string and not a byte string. Note that this support is not the same as full unicode support. Internally, fitsio only supports the ASCII character set.

Thread Safety and Python Free Threading

fitsio is a Python wrapper for the cfitsio library and so inherits the constraints on multithreaded programs from cfitsio. Specifically this means that

  • Concurrent reading from FITS files is thread-safe, but every thread must open the FITS file on its own, getting a unique fitsio.FITS object.
  • Concurrent writing to FITS files is NOT thread-safe.
  • fitsio.FITS file objects can be shared between threads for reading, but only one thread can use the file object at a time. You will need to employ a lock from the threading module in order to prevent race conditions. See the example below.

fitsio is compatible with Python free threading, and will not reenable the GIL when imported. However, the constraints above must be respected even when using Python free threading.

Here is an example of using a lock to share a fitsio.FITS file pointer across threads:

import concurrent.futures
import threading
import fitsio


lock = threading.RLock()

def _read_file(fp):
    with lock:
        # do something with fp here
        pass

with fitsio.FITS(fname) as fp:
    with ThreadPoolExecutor(max_workers=10) as exc:
        futs = [
            exc.submit(_read_file, fp) for _ in range(10)
        ]
        for fut in futs:
            res = fut.result()

Free-threading Macros and Locks in the C Wrapper

On Python 3.13 and above, we release the GIL (for GIL-enabled Python builds) or detach the thread state (for free-threading Python builds). Some background information is helpful in understanding how this works.

  • In the Python C API, the GIL and the thread state (i.e., attached or detached) are two separate concepts. A thread that is attached to the Python C runtime can make calls into it, use data from it, etc. In GIL-enabled builds of Python, only one thread can be attached at a time, and the GIL is the lock that enforces this constraint. In free-threading builds of Python, the interpreter must sometimes "stop the world" in order to do key tasks (e.g., garbage collection). Thus threads still must either attach to the runtime or not (but there is no constraint on how many threads can be attached, and thus no GIL). For performance reasons, if a thread is doing I/O or some other long-running computation where it does not need the Python runtime, it is good to detach it so that any "stop the world" tasks are not blocked.
  • The Python C API uses the same functions for these handling both the GIL and the thread state (wrapped in the*_NOGIL macros in the C code.)
  • The cfitsio library can be compiled in such a way that it is "reentrant." Versions of the library that are reentrant allow library functions to be called concurrently by different threads, but only on different FITS file handles. Even in reentrant builds of the cfitsio library, it is not safe to call library functions concurrently on the same FITS file handle. The typical way to manage access to reentrant libraries is via a lock on the data structure returned by the library (i.e., the FITS file handle).
  • When dealing with both the GIL and a lock for reentrant libraries, it is very easy to create deadlocks (i.e., two threads that are each waiting on one another). To help with this, on Python 3.13 or newer, the Python C API provides a lock that is hooked into the Python runtime in such a way that it will not deadlock with the GIL.

The Python Free-Threading Guide is a very useful resource for learning more about the concepts above.

To enforce the threading constraints, we use the following macros in the C layer:

  • LOCK_FITS(x) & UNLOCK_FITS(x): These macros take a pointer to the PyFITSObject object, and for non-reentrant builds, use a global lock to avoid concurrent calls to non-reentrant builds of the cfitsio library. This lock is not reentrant (i.e., every LOCK_FITS call must be paired with an UNLOCK_FITS call). The implementation of this lock uses the one from the Python C API so it will not deadlock with the GIL-related macros below.
  • ALLOW_NOGIL: This macro defines variables needed for handling the GIL/thread state, and it must be used in any C function where the other GIL-related macros below are used.
  • RELEASE_GIL & CAPTURE_GIL: These macros are used to actually release/capture the GIL and/or attach/detach the thread state. Like the locks, these macros are not reentrant and so every RELEASE_GIL call must be paired with a CAPTURE_GIL call.
  • NOGIL(x): This macro wraps a single function call with the release and capture operations, returning the value of the function call. It can be used to make code more concise. You cannot use this macro in between calls to RELEASE_GIL and CAPTURE_GIL.

All of these macros (except NOGIL) must be followed by a semicolon when used in C code (e.g., ALLOW_NOGIL;). You must also take care to properly unlock the global lock and/or release the GIL for all possible execution paths through your function (including branches for error handling). C goto statements can be very helpful for this task.

In the C wrapper of cfitsio on Python 3.13 and above, we always employ a global lock for non-reentrant builds of cfitsio, and we do our best to release the GIL during I/O and/or long-running operations.

TODO

  • HDU groups: does anyone use these? If so open an issue!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fitsio-1.4.1.tar.gz (4.1 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

fitsio-1.4.1-cp314-cp314t-win_amd64.whl (718.7 kB view details)

Uploaded CPython 3.14tWindows x86-64

fitsio-1.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl (815.5 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

fitsio-1.4.1-cp314-cp314t-manylinux_2_28_x86_64.whl (928.3 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ x86-64

fitsio-1.4.1-cp314-cp314t-macosx_14_0_arm64.whl (753.2 kB view details)

Uploaded CPython 3.14tmacOS 14.0+ ARM64

fitsio-1.4.1-cp314-cp314t-macosx_13_0_x86_64.whl (753.9 kB view details)

Uploaded CPython 3.14tmacOS 13.0+ x86-64

fitsio-1.4.1-cp314-cp314-win_amd64.whl (717.7 kB view details)

Uploaded CPython 3.14Windows x86-64

fitsio-1.4.1-cp314-cp314-musllinux_1_2_x86_64.whl (815.2 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

fitsio-1.4.1-cp314-cp314-manylinux_2_28_x86_64.whl (913.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

fitsio-1.4.1-cp314-cp314-macosx_14_0_arm64.whl (752.5 kB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

fitsio-1.4.1-cp314-cp314-macosx_13_0_x86_64.whl (753.2 kB view details)

Uploaded CPython 3.14macOS 13.0+ x86-64

fitsio-1.4.1-cp313-cp313-win_amd64.whl (701.9 kB view details)

Uploaded CPython 3.13Windows x86-64

fitsio-1.4.1-cp313-cp313-musllinux_1_2_x86_64.whl (815.2 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

fitsio-1.4.1-cp313-cp313-manylinux_2_28_x86_64.whl (913.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

fitsio-1.4.1-cp313-cp313-macosx_14_0_arm64.whl (752.5 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

fitsio-1.4.1-cp313-cp313-macosx_13_0_x86_64.whl (753.2 kB view details)

Uploaded CPython 3.13macOS 13.0+ x86-64

fitsio-1.4.1-cp312-cp312-win_amd64.whl (697.7 kB view details)

Uploaded CPython 3.12Windows x86-64

fitsio-1.4.1-cp312-cp312-musllinux_1_2_x86_64.whl (810.0 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

fitsio-1.4.1-cp312-cp312-manylinux_2_28_x86_64.whl (881.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

fitsio-1.4.1-cp312-cp312-macosx_14_0_arm64.whl (748.2 kB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

fitsio-1.4.1-cp312-cp312-macosx_13_0_x86_64.whl (748.9 kB view details)

Uploaded CPython 3.12macOS 13.0+ x86-64

fitsio-1.4.1-cp311-cp311-win_amd64.whl (697.6 kB view details)

Uploaded CPython 3.11Windows x86-64

fitsio-1.4.1-cp311-cp311-musllinux_1_2_x86_64.whl (809.9 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

fitsio-1.4.1-cp311-cp311-manylinux_2_28_x86_64.whl (879.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

fitsio-1.4.1-cp311-cp311-macosx_14_0_arm64.whl (748.3 kB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

fitsio-1.4.1-cp311-cp311-macosx_13_0_x86_64.whl (748.7 kB view details)

Uploaded CPython 3.11macOS 13.0+ x86-64

fitsio-1.4.1-cp310-cp310-win_amd64.whl (697.6 kB view details)

Uploaded CPython 3.10Windows x86-64

fitsio-1.4.1-cp310-cp310-musllinux_1_2_x86_64.whl (809.9 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

fitsio-1.4.1-cp310-cp310-manylinux_2_28_x86_64.whl (878.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

fitsio-1.4.1-cp310-cp310-macosx_14_0_arm64.whl (748.3 kB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

fitsio-1.4.1-cp310-cp310-macosx_13_0_x86_64.whl (748.7 kB view details)

Uploaded CPython 3.10macOS 13.0+ x86-64

File details

Details for the file fitsio-1.4.1.tar.gz.

File metadata

  • Download URL: fitsio-1.4.1.tar.gz
  • Upload date:
  • Size: 4.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for fitsio-1.4.1.tar.gz
Algorithm Hash digest
SHA256 2b2bf0bfd37790114b44283931c59a14b1fec25a653bf65c4fc555b8d3b24de9
MD5 3b9369580787628f569478b27c9c7555
BLAKE2b-256 346b5658778e070faaa194f1a1133527cedfa948d173daed29d61f25c5487ab6

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp314-cp314t-win_amd64.whl.

File metadata

  • Download URL: fitsio-1.4.1-cp314-cp314t-win_amd64.whl
  • Upload date:
  • Size: 718.7 kB
  • Tags: CPython 3.14t, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for fitsio-1.4.1-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 ee2aa6a125275a08c34f0990bdcd53c159c86069771244b7e63b8e226c3d19a7
MD5 164df0bcb2f8e2a1b91db703dda298c4
BLAKE2b-256 58c15ae27c670c3810218c3c1b91b5d2708ebc68679974ce860e1497b6de893e

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c2a0dba7a868b4b1716d7468431fda51bc89ee8d8f2a643ac28f9200d99d2e2b
MD5 dd55f1c9153c0be4f8f873b99c620347
BLAKE2b-256 0afaeeb997744bb1c2c9308dab9b492bcdb1843e4eb3dc5d1697d2f0a312c8b7

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp314-cp314t-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp314-cp314t-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5f499149738fdce6afa3324a76fd65a762082647d8b1d30a356dc002dd4a9178
MD5 0f0d9de11e57c8f51a485ee02f5957d4
BLAKE2b-256 8b3b9a6d92637db9a603a18681f60689c30208f2485016ed91280e42b927df57

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp314-cp314t-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp314-cp314t-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 9952fddcdc79a5416a360f04a94fb669f7b417ed907b88dc411f5d157aa32547
MD5 073be66c79a3b558742fa49e4002bd35
BLAKE2b-256 c49cb6ded274687e431083f5b0e84b4d579ab81abc81044b7c18609be6fa0ff9

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp314-cp314t-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp314-cp314t-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 8b73cd0cd0f3428b309a961e4034764f1a5c9cb096cb3d34df6ea53b8510cfa3
MD5 2c0ffaf800812dd7ceb370cd984300c4
BLAKE2b-256 061b5d8a8a2b8a7af21f5f6ebb28cb196d4a65589977afd2dacbbe084bbb9c08

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: fitsio-1.4.1-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 717.7 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for fitsio-1.4.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 7d0fe1b1416184cbf565ed6415727bf9f522f51d1d4ac990834e34854af2f8b1
MD5 f0666d6de1765b61a9f58733d50ce732
BLAKE2b-256 512d38db40567b928dc7b316324a12eded66354d82eaf5bc90d9d0d965bd6964

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2627eeec3dff4b692402babb88aec3cccbf73a3ee22d19b4accfe76491bd67a8
MD5 b5be470bb072f9308303483f2809b2df
BLAKE2b-256 de469f45b3c8bd371057f1333aec8f92879cb786fe9ed05b6b0c2643fd228558

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1ab4eadb13caf362630d45bce7cf7e57e407d3c971f361f639ca9c316f460bb2
MD5 1a16d789b9726f0732289a0652ccaf7c
BLAKE2b-256 7c477f64a60d883a4b69a0a15c1ec60ba9313d8e774af83ac2b00f57d511b76d

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 b21f58ca3326ec69ddb7ea34da51a1ea31c9983c86bba118c1bcb0625d76740c
MD5 8335bdb1d8c2d42e08a36c287113f4e2
BLAKE2b-256 e3a64c4b7df4f145f781904f4f7ffe359ab953b14c0d2ed9155c7b1d67abf75d

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp314-cp314-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp314-cp314-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 bc65f2bd5eaa13265955608036323ab39120373f46be0989d4766e79c2d682dc
MD5 57b360639185b6a9e61356c466fa060f
BLAKE2b-256 c30d136ad1d3598764ee40c18887eee054966d6abc53fe215b8d393d8301e48c

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: fitsio-1.4.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 701.9 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for fitsio-1.4.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2bafee0658ee81f9036be465a1e34bda9ba0df279ecfc1bbcbce82d798871747
MD5 76ab8636b95616f5bfd437d19ed38c1e
BLAKE2b-256 ea51aca7543d10e2c220c2b97e4fc6f52225bf297b9beff774bfdb137d8a7609

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5ed27e5b8aaf1ae51718c6624d00fec1d6054fddde8d602eaea3bb6686bcfb0a
MD5 f198ad66a14683873b15755720dd10a0
BLAKE2b-256 efaee89778256e0aee3e5b51a620cdf9d91ac89f348504045461bee28006275d

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 161806de2bb9971e271379558616d2cef795ce9590923270ec3bbdadea0d0b2f
MD5 c32420c162166a8c85ae4f8b604c6317
BLAKE2b-256 835dd71993140df9f939e81d2a5531f26d15cbd700855348a756921b0ad24235

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 a696bddae8746b963ad6c77457fab1f21b26419126baefe804f3ecd1e29da3ff
MD5 2868aa925a469c7b9437db6e75f48bb5
BLAKE2b-256 528a643e674064fdfc7d011989a810e93bde85ede4001c52d84b4e0ac8010335

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp313-cp313-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp313-cp313-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 c7fca67ba8cf7a14b08535947d4a0bc3c8bf0a5b1c7c9951d39eb459a3d7c325
MD5 87b6dfae9e54600ce562c2ab67ee4049
BLAKE2b-256 ba0d6a511a8d548ed157c0548d6b00ab34dbfb39841956c12b55ad999e4009c3

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: fitsio-1.4.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 697.7 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for fitsio-1.4.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 8af5f182edaef8f47971c4c64eb0533e1cfa906a219aa0eae357c8c6fcaf3e8c
MD5 4c84383d6b6081b2bd206b9f4608f59a
BLAKE2b-256 02c9ecb5784e63c45f8610e8eb3e35cc337a37ff9a19a858ddeb71f27c77e0ee

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 34df9129decab3ae85377601668b82442159ed704800bd1ed047428bc532c96d
MD5 ef76ee716cb0449c1862fabba4850317
BLAKE2b-256 a553f7f644b812e572c57015ef5215f982922d9cdac8d239549c136ba48f2850

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 de7ac1df97ce68626dac1da5014e6b396cff2789d1c617c36df03d6bc6d98a2d
MD5 ad732e64f5ed90eb6ff6f3b13958638c
BLAKE2b-256 38a086e2bde46aa5559b7b9544208def3045675d055f0d132b235ff325279a9b

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 b0eab12c498d9964a118918fdee9b542d118803875ac6ebb9ad0c29788006401
MD5 fb33b388b8b11b7eee6bce702d59f2da
BLAKE2b-256 7522b83bdb3ec3d2105a9350210b5403be55ab203fcb079a489ecb21f52809ec

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp312-cp312-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp312-cp312-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 6af05dcb4c7da3355f575fe2d7e9eff254b35db9965233a6f2d37a9a403bcf5a
MD5 b226e5e3cb7f863f5c543b9cd7d17279
BLAKE2b-256 c61e21a5c0233fbd1e1f64f6abe99146ee9a265fde70ea6c12448257b22730d5

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: fitsio-1.4.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 697.6 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for fitsio-1.4.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 1903e55fc92d17163223a6dbd2aaf4c5f106d0e5323c2b8b715442e2a57ec7f3
MD5 b875c537c43129fcf25031287e47993b
BLAKE2b-256 b0f2e0cee8193866c5512647fa35abfc76b8b2821986a4bc56e3c1ff3f8f8d02

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 15d180bff7d8d6623a9b35c61aa9d2218748c94d7e8407065cf40399e69ba667
MD5 3b54cd07428300e3a7bf309f114950fb
BLAKE2b-256 c0349a0e21d2e2c91368a274e761dd81d849055066fac6057d56db69f0acf4b7

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c56ac470da2acca0dcd95c869c83da7d17b2b4204c949efa6e6e42fa789b9a9b
MD5 a58c32093cafea7af93a35a13c372252
BLAKE2b-256 1882be2f6da101ce7881bdfefec4a7fbb11de5a0a69d0da04a4ed29cc54b30d6

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 315b975d154536ea46a7c94e74b64352e21077778d38927dfc8c19c467639416
MD5 2e9455240eaf1af5a5319e38162427a5
BLAKE2b-256 e0959e812b94afeef8f952c9b81dc48ddd7c6c5e7b96ca61a4e74a0009cf305a

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp311-cp311-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp311-cp311-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 8a40327728f60bef89c6877cca0dcb04e9a3392978e91bcabb9fd84542177228
MD5 8083d8ee043f2354e30b2a34d4eee184
BLAKE2b-256 5095ffd45ca26160a25daeb0ae020d37f2175fd27fb6d4225bc59187553f5a0f

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: fitsio-1.4.1-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 697.6 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for fitsio-1.4.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 043d824adaaadbb37f8175d50fdd41b933bed194ef98ce4104ccc805305cf2d6
MD5 d4ffb2ec650516718bb1facd68f80a1f
BLAKE2b-256 b0dcacfeb50bfc6a69efcc3a8f4ca2d5659a2bf673f1cb8b567ef70b1391c923

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6f74c1142fb1d3443c44aa6b45bdd5895c053f50e496cc11d0ee6d1bc367de46
MD5 59bab3bb45df9f1bec9bcf4479896de3
BLAKE2b-256 6dcfeaf2a0d5765412f7c13bf9983c83e8df1efc4b9b87c21724b59f3850e2db

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 19e75620b4eaf1ebe1554f5585ae37377e27282b40c3158fe4bf16494349eef0
MD5 148a13d2a8e8f5e09397dc012f2afa46
BLAKE2b-256 2793aa4f992a7c2a9ea0073b8b3e32d64c4f5995506a241268f4ba58f00a8735

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 03c7e32d0c848cc36dc68fbcff4acb36c46619ec0e72c2d035d5862240832aaf
MD5 214cdae83f72d6474a02a09bbd4c92b5
BLAKE2b-256 021f470d89d3672559fc17d659e798b429f45584924d0595e216ce026ea1c02c

See more details on using hashes here.

File details

Details for the file fitsio-1.4.1-cp310-cp310-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for fitsio-1.4.1-cp310-cp310-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 cf242839c45b8fde4553936435c64ca9c8959a93ca2391c5105891984b6d778a
MD5 60390f25596256ca850244bca8a2f89c
BLAKE2b-256 0517bb756eb67291b4ad176ba9c3df42fdd49c0e8a08baca5fb84fe7aa3c267a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page