IMMA: A module for observations in International Meteorological Maritime Archive format

This module provides a Python API to IMMA files.

IMMA files are not necessarily consistent in their contents - each line can have a different set of extensions. So we can’t treat the file as a table of data - instead we treat it as a list of records, and read those records one at a time.

So an IMMA file is best thought of as an iterator. Set up a file as an iterator with the get() function:

import IMMA
iobs=IMMA.get('some_file.imma')

Then every time you call iobs.next() you will get the next record from some_file.imma.

Each record is returned as a dict where vthe keys are the IMMA variable names. So after rec=iobs.next(), the sea-surface temperature is in rec['SST'].

If you want all the records in the file loaded simultaniously, either use obs=list(iobs) or call the read() function:

obs=IMMA.read('some_file.imma')

In both cases obs will be a list of dictionaries. So obs[3]['SST'] will be the SST from the fourth record in the file. If you want a list of all the SSTs in the file, you need something like:

SSTs=[ob['SST'] for ob in obs]

SST is in the core extension, so rec['SST'] will either have a valid number, or be None (blank in the IMMA record). If you look for a variable in an extension other than core it may be that the extension is not present in the selected record. In this case looking for it will raise a KeyError. I.e. rec['DCK'] might be a valid deck ID, it might be None (if the ICOADS extension is present but the DCK entry is blank) or it might raise a KeyError (if the ICOADS extension is missing from that record).

To output records to a file, first open the file, and then write() records to it one at a time:

opfile=open('some_output_file.imma','w')
for ob in obs:
    IMMA.write(ob,opfile)

The list of extensions to write to the file is controlled by ob['extensions'] - an integer array containing the extension_id for all the extensions in the record. You need to update this explicitly - if you add or delete extensions from a record, update this array.


class IMMA.get(filename)[source]

Turn an imma file into an iterator providing its records.

Parameters:filename (str) – Name of file containing IMMA records.
Returns:iterator - call next() on this to get the next record.
Return type:func
IMMA.read(filename)[source]

Load all the records from an imma file.

Just the same as list(IMMA.get(filename).

Parameters:filename (str) – Name of file containing IMMA records.
Returns:List of records - each record is a dict:
Return type:list
IMMA.write(record, fh)[source]

Write the given record to a file.

File should be result of open() (or anything with a write method).

Parameters:
  • record (dict) – One IMMA record.
  • fh (file) – File to write to (from open() function).