Description
[](https://pypi.python.org/pypi/pyogrio/) [](https://anaconda.org/conda-forge/pyogrio) [](https://github.com/geopandas/pyogrio/actions?branch=main) [](https://numfocus.org) # pyogrio - bulk-oriented spatial vector file I/O using GDAL/OGR Pyogrio provides fast, bulk-oriented read and write access to [GDAL/OGR](https://gdal.org/en/latest/drivers/vector/index.html) vector data sources, such as ESRI Shapefile, GeoPackage, GeoJSON, and several others. Vector data sources typically have geometries, such as points, lines, or polygons, and associated records with potentially many columns worth of data. The typical use is to read or write these data sources to/from [GeoPandas](https://github.com/geopandas/geopandas) `GeoDataFrames`. Because the geometry column is optional, reading or writing only non-spatial data is also possible. Hence, GeoPackage attribute tables, DBF files, or CSV files are also supported. Pyogrio is fast because it uses pre-compiled bindings for GDAL/OGR to read and write the data records in bulk. This approach avoids multiple steps of converting to and from Python data types within Python, so performance becomes primarily limited by the underlying I/O speed of data source drivers in GDAL/OGR. We have seen \>5-10x speedups reading files and \>5-20x speedups writing files compared to using row-per-row approaches (e.g. Fiona). Read the documentation for more information: [https://pyogrio.readthedocs.io](https://pyogrio.readthedocs.io/en/latest/). ## Requirements Supports Python 3.10 - 3.14 and GDAL 3.6.x - 3.11.x. Reading to GeoDataFrames requires `geopandas>=0.12` with `shapely>=2`. Additionally, installing `pyarrow` in combination with GDAL 3.6+ enables a further speed-up when specifying `use_arrow=True`. ## Installation Pyogrio is currently available on [conda-forge](https://anaconda.org/conda-forge/pyogrio) and [PyPI](https://pypi.org/project/pyogrio/) for Linux, MacOS, and Windows. Please read the [installation documentation](https://pyogrio.readthedocs.io/en/latest/install.html) for more information. ## Supported vector formats Pyogrio supports most common vector data source formats (provided they are also supported by GDAL/OGR), including ESRI Shapefile, GeoPackage, GeoJSON, and FlatGeobuf. Please see the [list of supported formats](https://pyogrio.readthedocs.io/en/latest/supported_formats.html) for more information. ## Getting started Please read the [introduction](https://pyogrio.readthedocs.io/en/latest/supported_formats.html) for more information and examples to get started using Pyogrio. You can also check out the [API documentation](https://pyogrio.readthedocs.io/en/latest/api.html) for full details on using the API. ## Credits This project is made possible by the tremendous efforts of the GDAL, Fiona, and Geopandas communities. - Core I/O methods and supporting functions adapted from [Fiona](https://github.com/Toblerity/Fiona) - Inspired by [Fiona PR](https://github.com/Toblerity/Fiona/pull/540/files)
Release History
| Version | Changes | Urgency | Date |
|---|---|---|---|
| 0.12.1 | Imported from PyPI (0.12.1) | Low | 4/21/2026 |
| v0.12.1 | ### Bug fixes - Fix regression in reading date columns (#616) - Fix regression in `read_dataframe` when `use_arrow=True` and `columns` is used to filter out columns of some specific types (#611) | Low | 11/28/2025 |
| v0.12.0 | ### Potentially breaking changes - Return JSON fields (as identified by GDAL) as dicts/lists in `read_dataframe`; these were previously returned as strings (#556). - Drop support for GDAL 3.4 and 3.5 (#584). ### Improvements - Add `datetime_as_string` and `mixed_offsets_as_utc` parameters to `read_dataframe` to choose the way datetime columns are returned + several fixes when reading and writing datetimes (#486). - Add listing of GDAL data types and subtypes to | Low | 11/26/2025 |
| v0.11.1 | ### Bug fixes - Compatibility with Shapely >= 2.1 to avoid triggering a deprecation warning at import (#542). - Fix reading with a `skip_features` larger than the available number of features to ensure this consistently returns an empty result for all file formats (#550). | Low | 8/2/2025 |
| v0.11.0 | ### Improvements - Capture all errors logged by gdal when opening a file fails (#495). - Add support to read and write ".gpkg.zip" (GDAL >= 3.7), ".shp.zip", and ".shz" files (#527). - Compatibility with the string dtype in the upcoming pandas 3.0 release (#493). ### Bug fixes - Fix WKB writing on big-endian systems (#497). - Fix writing fids to e.g. GPKG file with `use_arrow` (#511). - Fix error in `write_dataframe` when writing an empty or all-None object col | Low | 5/8/2025 |
| v0.10.0 | ### Improvements - Add support to read, write, list, and remove `/vsimem/` files (#457). ### Bug fixes - Silence warning from `write_dataframe` with `GeoSeries.notna()` (#435). - Enable mask & bbox filter when geometry column not read (#431). - Raise NotImplmentedError when user attempts to write to an open file handle (#442). - Prevent seek on read from compressed inputs (#443). ### Packaging - For the conda-forge package, change the dependency from `libgdal` to | Low | 9/28/2024 |
| v0.9.0 | ### Improvements - Add `on_invalid` parameter to `read_dataframe` (#422). ### Bug fixes - Fixed bug transposing longitude and latitude when writing files with coordinate transformation from EPSG:4326 (#421). - Fix bug preventing reading from file paths containing hashes in `read_dataframe` (#412). ### Packaging - **MacOS wheels are now only available for macOS 12+**. For older unsupported macOS versions, pyogrio can still be built from source (requires GDAL to b | Low | 6/17/2024 |
| v0.8.0 | ### Improvements - Support for writing based on Arrow as the transfer mechanism of the data from Python to GDAL (requires GDAL >= 3.8). This is provided through the new `pyogrio.raw.write_arrow` function, or by using the `use_arrow=True` option in `pyogrio.write_dataframe` (#314, #346). - Add support for `fids` filter to `read_arrow` and `open_arrow`, and to `read_dataframe` with `use_arrow=True` (#304). - Add some missing properties to `read_info`, including lay | Low | 5/6/2024 |
| v0.7.2 | ### Bug fixes - Add `packaging` as a dependency (#320). - Fix conversion of WKB to geometries with missing values when using `pandas.ArrowDtype` (#321). | Low | 10/30/2023 |
| v0.7.1 | ### Bug fixes - Fix unspecified dependency on `packaging` (#318). | Low | 10/26/2023 |
| v0.7.0 | ### Improvements - Support reading and writing datetimes with timezones (#253). - Support writing dataframes without geometry column (#267). - Calculate feature count by iterating over features if GDAL returns an unknown count for a data layer (e.g., OSM driver); this may have signficant performance impacts for some data sources that would otherwise return an unknown count (count is used in `read_info`, `read`, `read_dataframe`) (#271). - Add `arrow_to_pandas_kwargs` | Low | 10/25/2023 |
| v0.6.0 | ### Improvements - Add automatic detection of 3D geometries in `write_dataframe` (#223, #229) - Add "driver" property to `read_info` result (#224) - Add support for dataset open options to `read`, `read_dataframe`, and `read_info` (#233) - Add support for pandas' nullable data types in `write_dataframe`, or specifying a mask manually for missing values in `write` (#219) - Standardized 3-dimensional geometry type labels from "2.5D <type>" to "<type> Z" for consiste | Low | 4/27/2023 |
| v0.5.1 | ### Bug fixes - Fix memory leak in reading files (#207) - Fix to only use transactions for writing records when supported by the driver (#203) | Low | 1/27/2023 |
| v0.5.0 | ### Major enhancements - Support for reading based on Arrow as the transfer mechanism of the data from GDAL to Python (requires GDAL >= 3.6 and `pyarrow` to be installed). This can be enabled by passing `use_arrow=True` to `pyogrio.read_dataframe` (or by using `pyogrio.raw.read_arrow` directly), and provides a further speed-up (#155, #191). - Support for appending to an existing data source when supported by GDAL by passing `append=True` to `pyogrio.write_datafra | Low | 1/16/2023 |
| v0.4.2 | ### Improvements - new `get_gdal_data_path()` utility funtion to check the path of the data directory detected by GDAL (#160) ### Bug fixes - register GDAL drivers during initial import of pyogrio (#145) - support writing "not a time" (NaT) values in a datetime column (#146) - fixes an error when reading GPKG with bbox filter (#150) - properly raises error when invalid where clause is used on a GPKG (#150) - avoid duplicate count of available features (#151) | Low | 10/6/2022 |
| v0.4.1 | Release v0.4.1 | Low | 7/25/2022 |
| v0.4.0 | ### Major enhancements - support for reading from file-like objects and in-memory buffers (#25) - index of GeoDataFrame created by `read_dataframe` can now optionally be set to the FID of the features that are read, as `int64` dtype. Note that some drivers start FID numbering at 0 whereas others start numbering at 1. - generalize check for VSI files from `/vsizip` to `/vsi` (#29) - add dtype for each field to `read_info` (#30) - support writing empty GeoDataFrames (#38 | Low | 6/20/2022 |
| v0.4.0b1 | Release v0.4.0b1 | Low | 6/19/2022 |
| v0.4.0a1 | Release v0.4.0a1 | Low | 5/26/2022 |
| v0.3.0 | ### Major enhancements - Auto-discovery of `GDAL_VERSION` on Windows, if `gdalinfo.exe` is discoverable on the `PATH`. - Addition of `read_bounds` function to read the bounds of each feature. - Addition of a `fids` keyword to `read` and `read_dataframe` to selectively read features based on a list of the FIDs. | Low | 12/22/2021 |
| v0.2.0 | ### Major enhancements - initial support for building on Windows. - Windows: enabled search for GDAL dll directory for Python >= 3.8. - Addition of `where` parameter to `read` and `read_dataframe` to enable GDAL-compatible SQL WHERE queries to filter data sources. - Addition of `force_2d` parameter to `read` and `read_dataframe` to force coordinates to always be returned as 2 dimensional, dropping the 3rd dimension if present. - Addition of `bbox` parameter to `re | Low | 4/1/2021 |
| v0.1.0 | Initial release of core functionality, including: * listing layers * reading basic info for a layer * reading from supported file formats (Shapefile, GeoPackage, GeoJSON) into GeoDataFrames * writing from GeoDataFrames into supported file formats | Low | 8/28/2020 |
