Source code for omfit_classes.omfit_asciitable
try:
# framework is running
from .startup_choice import *
except ImportError as _excp:
# class is imported by itself
if (
'attempted relative import with no known parent package' in str(_excp)
or 'No module named \'omfit_classes\'' in str(_excp)
or "No module named '__main__.startup_choice'" in str(_excp)
):
from startup_choice import *
else:
raise
from omfit_classes.omfit_ascii import OMFITascii
import numpy as np
from astropy.io import ascii as asciitable
__all__ = ['OMFITasciitable']
[docs]class OMFITasciitable(SortedDict, OMFITascii):
r"""
OMFIT class used to interface with ascii tables files
This class makes use of the asciitable Python module http://cxc.harvard.edu/contrib/asciitable/
Files can have a header preceeding the talbe (e.g. comment) and will be stored in the ['header'] field
NOTE: the ['data'] field is a np.recarray and the data in the tables columns can be retrieved with the names defined in the ['columns'] field
:param filename: filename passed to OMFITascii class
:param skipToLine: (integer) line to skip to before doing the parsing
:param \**kw: keyword dictionary passed to OMFITascii class
"""
def __init__(self, filename, **kw):
OMFITascii.__init__(self, filename, **kw)
SortedDict.__init__(self)
self.addedDot = False
self.skipToLine = kw.get('skipToLine', 0)
self.dynaLoad = True
[docs] @dynaLoad
def load(self):
"""
Method used to load the content of the file specified in the .filename attribute
:return: None
"""
self['header'] = ''
self['columns'] = []
self['data'] = np.array([])
with open(self.filename, 'r') as f:
lines = f.read()
if not len(lines.strip()):
return
if 'd' in lines.lower():
# convert FORTRAN exponentials (d,D) to (e,E)
lines = re.sub(r'([0-9]+|[0-9]*(?:[0-9]\.|\.[0-9])[0-9]*)[dD]([\-\+]*[0-9]+)', r'\1e\2', lines)
with open(self.filename, 'w') as f:
f.write(lines)
lines = lines.splitlines(True)
self['header'] = ''.join(lines[: self.skipToLine])
lines = lines[self.skipToLine :]
if len(lines):
for k in range(len(lines)):
tmp = ''.join(lines[k:])
try:
if asciitable.__name__ == 'asciitable':
self['data'] = asciitable.read(tmp)
else:
self['data'] = np.array(asciitable.read(tmp, guess=True)).view(np.recarray)
self.addedDot = False
break
except Exception:
tmp = '. ' + tmp
try:
if asciitable.__name__ == 'asciitable':
self['data'] = asciitable.read(tmp)
else:
self['data'] = np.array(asciitable.read(tmp, guess=True)).view(np.recarray)
self.addedDot = True
break
except Exception as _excp:
pass
if k == len(lines):
raise _excp
self['columns'] = list(self['data'].dtype.names)
self['header'] = self['header'] + ''.join(lines[:k])[:-1]
self.dynaLoad = False
[docs] @dynaSave
def save(self):
"""
Method used to save the content of the object to the file specified in the .filename attribute
:return: None
"""
with open(self.filename, 'w') as f:
if len(self['header']):
f.write(self['header'] + '\n')
if np.all(['col' in item for item in self['columns']]):
if asciitable.__name__ == 'asciitable':
asciitable.write(self['data'], f, asciitable.NoHeader)
else:
asciitable.write(self['data'], f, 'fixed_width_no_header', delimiter=' ')
else:
if asciitable.__name__ == 'asciitable':
asciitable.write(self['data'], f, asciitable.Basic)
else:
asciitable.write(self['data'], f, 'fixed_width', delimiter=' ')
############################################
if '__main__' == __name__:
test_classes_main_header()
filename = 'omfit_asciitable_test.dat'
data = OMFITasciitable(filename, fromString='a b c\n1 2 3')
data.load()
data.save()