source: FCC2/trunk/source/ncd_parse.py @ 41

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/FCC2/trunk/source/ncd_parse.py@41
Revision 41, 3.3 KB checked in by mjuckes, 6 years ago (diff)

reworked and MIP tables added

Line 
1#!/usr/bin/python
2
3import string, os, re
4
5## extract contents to first curly brace
6re1 = re.compile( '(.*?)\{(.*)\}' , re.MULTILINE | re.DOTALL )
7re2 = re.compile( 'dimensions:(.*)variables:(.*)// global attributes:(.*)', re.MULTILINE | re.DOTALL )
8re3 = re.compile( '(.*?)=(.*);' )
9re4 = re.compile( ':(.*?)=(.*);', re.MULTILINE | re.DOTALL )
10rer = re.compile( '([0-9]*\.[0-9]*$)' )
11rei = re.compile( '([0-9]*$)' )
12rev = re.compile( '(float|int|char|double) (.*) ;' )
13rev1 = re.compile( '(.*?)\((.*)\)' )
14isreal = lambda x: rer.match(x) != None 
15isint = lambda x: rei.match(x) != None 
16
17class read_ncdump:
18
19  def __init__(self,file):
20    assert os.path.isfile( file ), '%s not found' % file
21    fh = open( file )
22    self.ncd = string.strip( string.join( fh.readlines() ) )
23    assert self.ncd[-1] == '}', 'Unexpected last char'
24    fh.close()
25    hdr, content = re1.findall( self.ncd )[0]
26    bits = string.split( hdr )
27    assert bits[0] == 'netcdf', 'Unexpected start of ncdump output: %s' % hdr
28    dims, vars, gats = re2.findall( content )[0]
29    self.dl = self._strip_empty( string.split( dims, '\n' ) )
30    self.vl = self._strip_empty( string.split( vars, '\n' ) )
31    self.gl = self._strip_empty( string.split( gats, '\n' ) )
32    self.fileName = file
33   
34  def _strip_empty( self, ll ):
35    oo = []
36    for l in map( string.strip, ll ):
37       if l != '':
38         oo.append(l)
39    return oo
40
41  def parse(self):
42    self.parse_dims()
43    self.parse_gats()
44    self.parse_vars()
45
46  def parse_dims(self):
47    self.dims = {}
48    for d in self.dl:
49       k,v = map( string.strip, re3.findall( d )[0]  )
50       if k not in ['',None]:
51         self.dims[k] = v
52
53  def parse_gats(self):
54    self.gats = {}
55    gl1 = [self.gl[0]]
56    for g in self.gl:
57      if g[0] == ':':
58        gl1.append(g)
59      else:
60        gl1[-1]+= g
61    for g in gl1:
62       k,v = self._parse_att( g )
63       if k not in ['',None]:
64           self.gats[k] = v
65
66
67  def _parse_att(self,g):
68       bb = re4.findall( g )
69       if len(bb) != 1:
70         assert False, 'Failed to parse %s' % g
71         k,v0 = map( string.strip, bb[0]  )
72         v = str(bb)
73       else:
74         k,v = map( string.strip, bb[0]  )
75         if v[0] == '"' and v[-1] == '"':
76           v = v[1:-1]
77         elif isreal(v):
78           v = float(v)
79         elif isint(v):
80           v = int(v)
81       return k,v
82
83
84  def parse_vars(self):
85    self._dict_vars = {}
86    this_var = None
87    for v in self.vl:
88      bb = rev.findall( v )
89      if len(bb) == 0:
90        if this_var != None:
91           this_var.append( v )
92      elif len(bb) == 1:
93        if this_var != None:
94          self._dict_vars[this_var[0][1]] = this_var
95        vtype, vdef = bb[0]
96        this_var = [(vtype,vdef),]
97    if this_var != None:
98          self._dict_vars[this_var[0][1]] = this_var
99
100    keys = self._dict_vars.keys()
101    self.vars = {}
102    for k in keys:
103      v,dims,atts = self._var_parse( self._dict_vars[k] )
104      self.vars[v] = (dims, atts)
105
106  def _var_parse( self, ll ):
107    x = rev1.findall( ll[0][1] )
108    if len(x) > 0:
109      var = x[0][0]
110      dims = map( string.strip, string.split( x[0][1],',' ) )
111    else:
112      var = ll[0][1]
113      dims = None
114    ats = {}
115    for l in ll[1:]:
116       k,v = self._parse_att( l )
117       if k not in ['',None]:
118           ats[k] = v
119    return var,dims,ats
Note: See TracBrowser for help on using the repository browser.