Skip to main content

A light-weight pure Python GRIB reader

Project description


Pupygrib (pronounced puppy grib and short for PUre PYthon GRIB) is a light-weight pure Python GRIB reader. It's purpose is to extract data from GRIB files with as little effort as possible. The user can then freely choose how to further process the data (read: pupygrib will not help you).


This project is in the alpha phase, which means that many planned features are missing and implemented features are not well tested. It also means that the API may change in future version. The implemented features are:

  • Iterate over and extract the raw fields from GRIB edition 1 messages in a file.
  • Extract simply packed grid-point data values from GRIB edition 1 messages.
  • Extract the coordinates for these values if they are on a latitude/longitude grid.

The planned features are:

  • Be able to easily identify (filter) the messages.
  • Be able to extract the data values for other packings.
  • Be able to extract the coordinates of other grid types.
  • Support for GRIB edition 2.


  • Python 2.7, 3.4, 3.5 or 3.6. Earlier Python 3 versions may work, but they are not tested.
  • Numpy
  • Six


$ pip install pupygrib

For development, the following command will install all extra requirements, including test requirements:

$ pip install pupygrib[dev]


To use pupygrib, you will need a good understanding of the GRIB format, especially since table lookups are not yet implemented. ECMWF provides an overview of GRIB edition 1 and edition 2 that can be used as references.

Iterate over the messages in a GRIB file and extract the coordinates and values:

>>> import pupygrib
>>> with open('tests/data/regular_latlon_surface.grib1', 'rb') as stream:
...     for i, msg in enumerate(, 1):
...         lons, lats = msg.get_coordinates()
...         values = msg.get_values()
...         print("Message {}: {:.3f} {}".format(i, values.mean(), lons.shape))
Message 1: 291.585 (31, 16)

Access a section of a GRIB message and print its fields:

>>> with open('tests/data/regular_latlon_surface.grib1', 'rb') as stream:
...     msg, =
>>> sorted(msg[0].fieldnames)  # fieldnames is a set, so we can't trust the order
['editionNumber', 'identifier', 'totalLength']
>>> msg[0].totalLength
>>> msg[3] is None  # the bit-map section is not included in this message


Pull requests are most welcome! I do ask that you add test cases and update the documentation for any new features. Make sure that the following checks (coding style, unit tests, and the manifest, respectively) pass without any warnings or errors. Tox should have at least one supported Python 2 and Python 3 version available.

$ flake8
$ tox
$ check-manifest


Pupygrib is being developed by Mattias Jakobsson at SMHI. It is released under the GNU General Public License v3 or later (GPLv3+).

Project details

Download files

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

Files for pupygrib, version 0.2.0
Filename, size File type Python version Upload date Hashes
Filename, size pupygrib-0.2.0-py2.py3-none-any.whl (14.0 kB) File type Wheel Python version py2.py3 Upload date Hashes View
Filename, size pupygrib-0.2.0.tar.gz (74.3 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page