Package chianti :: Package fortranformat :: Module FortranRecordReader'
[hide private]
[frames] | no frames]

Source Code for Module chianti.fortranformat.FortranRecordReader'

 1  import sys 
 2  IS_PYTHON3 = sys.version_info[0] >= 3 
 3  
 
 4  if IS_PYTHON3: 
 5      exec('from ._input import input as _input') 
 6      exec('from ._parser import parser as _parser') 
 7      exec('from ._lexer import lexer as _lexer') 
 8  else: 
 9      exec('from _input import input as _input') 
10      exec('from _parser import parser as _parser') 
11      exec('from _lexer import lexer as _lexer') 
12  
 
13 -class FortranRecordReader(object):
14 ''' 15 Generate a reader object for FORTRAN format strings 16 17 Typical use case ... 18 19 >>> header_line = FortranRecordReader('(A15, A15, A15)') 20 >>> header_line.read(' x y z') 21 [' x', ' y', ' z'] 22 >>> line = FortranRecordReader('(3F15.3)') 23 >>> line.read(' 1.000 0.000 0.500') 24 [1.0, 0.0, 0.5] 25 >>> line.read(' 1.100 0.100 0.600') 26 [1.1, 0.1, 0.6] 27 28 Note: it is best to create a new object for each format, changing the format 29 causes the parser to reevalute the format string which is costly in terms of 30 performance 31 ''' 32
33 - def __init__(self, format):
34 self.format = format 35 self._eds = [] 36 self._rev_eds = [] 37 self._parse_format()
38
39 - def __eq__(self, other):
40 if isinstance(other, FortranRecordReader): 41 return self.format == other.format 42 else: 43 return object.__eq__(self, other)
44
45 - def match(self, record):
46 try: 47 self.read(record) 48 except RecordError: 49 return False 50 else: 51 return True
52
53 - def read(self, record):
54 ''' 55 Pass a string representing a FORTRAN record to obtain the relevent 56 values 57 ''' 58 return _input(self._eds, self._rev_eds, record)
59
60 - def get_format(self):
61 return self._format
62 - def set_format(self, format):
63 self._format = format 64 self._parse_format()
65 format = property(get_format, set_format) 66
67 - def _parse_format(self):
68 self._eds, self._rev_eds = _parser(_lexer(self.format))
69 70 71 if __name__ == '__main__': 72 import doctest 73 doctest.testmod() 74