Source code for faampy.utils.file_info

import os
import re

DATA_TYPES = {'core-hires':        'core_faam_20[0-9][0-9][0-1][0-9][0-3][0-9].*_r\d_[bBcC][0-9][0-9][0-9].nc$',
              'core-lowres':       'core_faam_20[0-9][0-9][0-1][0-9][0-3][0-9].*_r\d_[bBcC][0-9][0-9][0-9]_1[Hh]z.nc$',
              'core-descrip':      'core_faam_20[0-9][0-9][0-1][0-9][0-3][0-9].*_r\d_[bBcC][0-9][0-9][0-9]_descrip.txt$',
              'core-quality':      'core_faam_20[0-9][0-9][0-1][0-9][0-3][0-9].*_r\d_[bBcC][0-9][0-9][0-9]_quality.txt$',
              'dropsonde-proc':    '.*dropsonde_faam_.*_r.*_[bBcC][0-9][0-9][0-9]_proc.nc$',
              'dropsonde-raw':     '.*dropsonde_faam_.*_r.*_[bBcC][0-9][0-9][0-9]_raw.nc$',
              'dropsonde-descrip': '.*dropsonde_faam_.*_r.*_[bBcC][0-9][0-9][0-9]_descrip.txt$',
              'flight-cst':        'flight-cst_faam_20[0-9][0-9][0-1][0-9][0-3][0-9]_r\d_[bBcC][0-9][0-9][0-9].txt$',
              'flight-log':        'flight-log_faam_20[0-9][0-9][0-1][0-9][0-3][0-9]_r\d_[bBcC][0-9][0-9][0-9].pdf$',
              'flight-sum':        'flight-sum_faam_20[0-9][0-9][0-1][0-9][0-3][0-9]_r\d_[bBcC][0-9][0-9][0-9].txt$',
              'rawdrs':            'core_faam_20[0-9][0-9][0-1][0-9][0-3][0-9]_r\d_[bB][0-9][0-9][0-9]_rawdrs.zip$',
              'rawgin':            'core_faam_20[0-9][0-9][0-1][0-9][0-3][0-9]_r\d_[bB][0-9][0-9][0-9]_rawgin.zip$',
              'rawgps':            'core_faam_20[0-9][0-9][0-1][0-9][0-3][0-9]_r\d_[bB][0-9][0-9][0-9]_rawgps.zip$',
              'rawdlu':            'core_faam_20[0-9][0-9][0-1][0-9][0-3][0-9]_r\d_[bBcC][0-9][0-9][0-9]_rawdlu.zip$'}


def get_revision_from_filename(filename):
    """
    Extracts the revision number from the netCDF core filename

    :param str filename: filename

    :Example:

      >>> file = 'core_faam_20090529_v004_r1_b450.nc'
      >>> getRevisionFromFilename(file)
      1
      >>>
    """
    fn = os.path.basename(filename)
    fn = fn.split('.')[0]
    parts = fn.split('_')
    for p in parts:
        if re.match('r\d', p):
            result = int(p[1:])
            if result < 90:
                return result
    return


def get_data_type_from_filename(filename):
    """
    returns the datatype for the input filename determined using the DATA_TYPES
    dictionary
    """

    for key in DATA_TYPES.keys():
        if re.match(DATA_TYPES[key], os.path.basename(filename)):
            return key
    return


def get_fid_from_filename(filename):
    """
    Extracts the flight number from the netCDF core filename

    :param str filename: filename

    :Example:

      >>> ncfile = 'core_faam_20090529_v004_r1_b450.nc'
      >>> getFlightNumbserFromFilename(ncfile)
      b450
      >>>
    """

    fn = os.path.basename(filename)
    fn = fn.split('.')[0]
    parts = fn.split('_')
    for p in parts:
        if re.match('[bBcC][0-9][0-9][0-9]', p):
            return p.lower()
    return


def get_date_from_filename(filename):
    """
    Extracts the flight date from the netCDF core filename

    :param str filename: filename

    :Example:

      >>> ncfile = 'core_faam_20090529_v004_r1_b450.nc'
      >>> getDateFromFilename(ncfile)
      20090529
      >>>
    """

    fn = os.path.basename(filename)
    fn = fn.split('.')[0]
    parts = fn.split('_')
    for p in parts:
        if re.match('20\d{6}', p):
            return p
        elif re.match('20\d{12}', p):
            return p
        else:
            pass
    return


[docs]class File_Info(object): """ Holds all file specific information for a FAAM data file: * filename * path * Flight Number (fid) * date * revision * datatype """ def __init__(self, filename): """ :param str filename: filename """ self.filename = os.path.basename(filename) self.path = os.path.dirname(filename) self.fid = get_fid_from_filename(filename) self.date = get_date_from_filename(filename) self.rev = get_revision_from_filename(filename) self.data_type = get_data_type_from_filename(filename) def __str__(self): output = '\n' labels = ['Filename', 'Path', 'FID', 'Date', 'Revision', 'Data Type'] values = [self.filename, self.path, self.fid, self.date, str(self.rev), self.data_type] for s in zip(labels, values): output += '%9s: %s\n' % s return output def __eq__(self, other): return ((self.fid, self.rev, self.data_type) == (other.fid, other.rev, other.data_type)) def __ne__(self, other): return not self == other def __gt__(self, other): return (self.fid, self.rev) > (other.fid, other.rev) def __lt__(self, other): return (self.fid, self.rev) < (other.fid, other.rev) def __ge__(self, other): return (self > other) or (self == other) def __le__(self, other): return (self < other) or (self == other)