2011-12-22 16:00:25 +05:30
|
|
|
# $Id$
|
|
|
|
|
2011-12-14 01:32:26 +05:30
|
|
|
class ASCIItable():
|
|
|
|
'''
|
|
|
|
There should be a doc string here :)
|
|
|
|
'''
|
2012-12-07 03:16:19 +05:30
|
|
|
import sys,numpy
|
2011-12-14 01:32:26 +05:30
|
|
|
__slots__ = ['__IO__',
|
|
|
|
'info',
|
|
|
|
'labels',
|
|
|
|
'data',
|
|
|
|
]
|
|
|
|
|
2012-02-02 22:43:51 +05:30
|
|
|
# ------------------------------------------------------------------
|
2011-12-14 01:32:26 +05:30
|
|
|
def __init__(self,
|
|
|
|
fileIn = sys.stdin,
|
|
|
|
fileOut = sys.stdout,
|
|
|
|
buffered = True):
|
|
|
|
self.__IO__ = {'in': fileIn,
|
|
|
|
'out':fileOut,
|
|
|
|
'output':[],
|
|
|
|
'buffered':buffered,
|
|
|
|
'validReadSize': 0,
|
2012-01-20 02:07:53 +05:30
|
|
|
'dataStart': 0,
|
2011-12-14 01:32:26 +05:30
|
|
|
}
|
|
|
|
self.info = []
|
|
|
|
self.labels = []
|
|
|
|
self.data = []
|
|
|
|
|
2012-02-02 22:43:51 +05:30
|
|
|
|
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def _transliterateToFloat(self,x):
|
|
|
|
try:
|
|
|
|
return float(x)
|
|
|
|
except:
|
|
|
|
return 0.0
|
|
|
|
|
|
|
|
# ------------------------------------------------------------------
|
2011-12-14 01:32:26 +05:30
|
|
|
def output_write(self,
|
|
|
|
what):
|
|
|
|
if isinstance(what,list):
|
|
|
|
for item in what: self.output_write(item)
|
|
|
|
else:
|
|
|
|
self.__IO__['output'] += [str(what)]
|
2012-02-17 00:12:04 +05:30
|
|
|
return self.__IO__['buffered'] or self.output_flush()
|
2011-12-14 01:32:26 +05:30
|
|
|
|
2012-02-02 22:43:51 +05:30
|
|
|
# ------------------------------------------------------------------
|
2011-12-14 01:32:26 +05:30
|
|
|
def output_flush(self,
|
|
|
|
clear = True):
|
2012-02-17 00:12:04 +05:30
|
|
|
import sys
|
|
|
|
try:
|
|
|
|
self.__IO__['output'] == [] or self.__IO__['out'].write('\n'.join(self.__IO__['output']) + '\n')
|
|
|
|
except IOError, e:
|
|
|
|
return False
|
2011-12-14 01:32:26 +05:30
|
|
|
if clear: self.output_clear()
|
2012-02-17 00:12:04 +05:30
|
|
|
return True
|
|
|
|
|
2012-02-02 22:43:51 +05:30
|
|
|
# ------------------------------------------------------------------
|
2011-12-14 01:32:26 +05:30
|
|
|
def output_clear(self):
|
|
|
|
self.__IO__['output'] = []
|
|
|
|
|
2012-02-02 22:43:51 +05:30
|
|
|
# ------------------------------------------------------------------
|
2011-12-14 01:32:26 +05:30
|
|
|
def head_read(self):
|
|
|
|
'''
|
|
|
|
get column labels by either read the first row, or
|
|
|
|
--if keyword "head[*]" is present-- the last line of the header
|
|
|
|
'''
|
2011-12-18 21:19:44 +05:30
|
|
|
import re
|
2011-12-14 01:32:26 +05:30
|
|
|
try:
|
|
|
|
self.__IO__['in'].seek(0)
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
firstline = self.__IO__['in'].readline()
|
|
|
|
m = re.search('(\d+)\s*head', firstline.lower())
|
|
|
|
if m:
|
2012-01-18 15:00:50 +05:30
|
|
|
self.info = [self.__IO__['in'].readline().strip() for i in xrange(1,int(m.group(1)))]
|
|
|
|
self.labels = self.__IO__['in'].readline().split()
|
2011-12-14 01:32:26 +05:30
|
|
|
else:
|
2012-01-18 15:00:50 +05:30
|
|
|
self.info = []
|
|
|
|
self.labels = firstline.split()
|
2011-12-14 01:32:26 +05:30
|
|
|
self.__IO__['validReadSize'] = len(self.labels)
|
2012-02-16 23:33:14 +05:30
|
|
|
try:
|
|
|
|
self.__IO__['dataStart'] = self.__IO__['in'].tell()
|
|
|
|
except IOError:
|
|
|
|
pass
|
2011-12-14 01:32:26 +05:30
|
|
|
|
2012-02-02 22:43:51 +05:30
|
|
|
# ------------------------------------------------------------------
|
2011-12-14 01:32:26 +05:30
|
|
|
def head_write(self):
|
2012-12-07 03:16:19 +05:30
|
|
|
'''
|
|
|
|
write current header information (info + labels)
|
|
|
|
'''
|
2012-02-17 00:12:04 +05:30
|
|
|
return self.output_write (['%i\theader'%(len(self.info)+1),
|
|
|
|
self.info,
|
|
|
|
'\t'.join(self.labels)])
|
2011-12-14 01:32:26 +05:30
|
|
|
|
2012-02-02 22:43:51 +05:30
|
|
|
# ------------------------------------------------------------------
|
2011-12-14 01:32:26 +05:30
|
|
|
def labels_append(self,
|
2012-12-07 03:16:19 +05:30
|
|
|
what):
|
|
|
|
'''
|
|
|
|
add item or list to existing set of labels
|
|
|
|
'''
|
2011-12-14 01:32:26 +05:30
|
|
|
if isinstance(what,list):
|
|
|
|
for item in what: self.labels_append(item)
|
|
|
|
else: self.labels += [str(what)]
|
|
|
|
|
2012-12-07 03:16:19 +05:30
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def labels_index(self,
|
|
|
|
labels):
|
|
|
|
'''
|
|
|
|
tell index of column label(s)
|
|
|
|
'''
|
|
|
|
if isinstance(labels,list):
|
|
|
|
idx = []
|
|
|
|
for label in labels:
|
|
|
|
try:
|
|
|
|
idx.append(self.labels.index(label))
|
|
|
|
except ValueError:
|
|
|
|
idx.append(-1)
|
|
|
|
else:
|
|
|
|
try:
|
|
|
|
idx = self.labels.index(labels)
|
|
|
|
except ValueError:
|
|
|
|
idx = -1
|
|
|
|
|
|
|
|
return idx
|
|
|
|
|
2012-02-02 22:43:51 +05:30
|
|
|
# ------------------------------------------------------------------
|
2011-12-14 01:32:26 +05:30
|
|
|
def info_append(self,
|
|
|
|
what):
|
|
|
|
if isinstance(what,list):
|
|
|
|
for item in what: self.info_append(item)
|
|
|
|
else: self.info += [str(what)]
|
|
|
|
|
2012-02-23 19:24:38 +05:30
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def info_clear(self):
|
|
|
|
self.info = []
|
|
|
|
|
2012-02-02 22:43:51 +05:30
|
|
|
# ------------------------------------------------------------------
|
2012-01-20 02:07:53 +05:30
|
|
|
def data_rewind(self):
|
|
|
|
self.__IO__['in'].seek(self.__IO__['dataStart'])
|
|
|
|
|
2012-04-18 17:12:57 +05:30
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def data_skipLines(self,lines):
|
|
|
|
for i in range(lines):
|
|
|
|
self.__IO__['in'].readline()
|
|
|
|
|
2012-02-02 22:43:51 +05:30
|
|
|
# ------------------------------------------------------------------
|
2011-12-14 01:32:26 +05:30
|
|
|
def data_read(self):
|
|
|
|
line = self.__IO__['in'].readline()
|
|
|
|
items = line.split()[:self.__IO__['validReadSize']] # get next data row
|
|
|
|
self.data = {False: [],
|
|
|
|
True: items}[len(items) == self.__IO__['validReadSize']] # take if correct number of entries
|
2012-02-02 22:43:51 +05:30
|
|
|
return self.data != []
|
2012-04-18 17:12:57 +05:30
|
|
|
|
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def data_readLine(self,line):
|
|
|
|
self.__IO__['in'].seek(self.__IO__['dataStart'])
|
|
|
|
for i in range(line-1):
|
|
|
|
self.__IO__['in'].readline()
|
|
|
|
self.data_read()
|
|
|
|
|
2012-02-02 22:43:51 +05:30
|
|
|
# ------------------------------------------------------------------
|
2011-12-14 01:32:26 +05:30
|
|
|
def data_write(self):
|
2012-02-14 17:34:37 +05:30
|
|
|
if len(self.data) == 0: return
|
2011-12-14 01:32:26 +05:30
|
|
|
if isinstance(self.data[0],list):
|
2012-02-17 00:12:04 +05:30
|
|
|
return self.output_write (['\t'.join(map(str,items)) for items in self.data])
|
2011-12-14 01:32:26 +05:30
|
|
|
else:
|
2012-02-17 00:12:04 +05:30
|
|
|
return self.output_write ('\t'.join(map(str,self.data)))
|
2011-12-14 01:32:26 +05:30
|
|
|
|
2012-02-02 22:43:51 +05:30
|
|
|
# ------------------------------------------------------------------
|
2011-12-14 01:32:26 +05:30
|
|
|
def data_append(self,
|
|
|
|
what):
|
|
|
|
if isinstance(what,list):
|
|
|
|
for item in what: self.data_append(item)
|
|
|
|
else: self.data += [str(what)]
|
2012-02-02 22:43:51 +05:30
|
|
|
|
2012-02-15 20:20:51 +05:30
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def data_set(self,
|
|
|
|
what,where):
|
|
|
|
idx = -1
|
|
|
|
try:
|
|
|
|
idx = self.labels.index(where)
|
|
|
|
if len(self.data) <= idx:
|
|
|
|
self.data_append(['n/a' for i in xrange(idx+1-len(self.data))]) # grow data if too short
|
|
|
|
self.data[idx] = str(what)
|
|
|
|
except ValueError:
|
|
|
|
pass
|
|
|
|
|
|
|
|
return idx
|
|
|
|
|
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def data_clear(self):
|
|
|
|
self.data = []
|
|
|
|
|
2012-02-02 22:43:51 +05:30
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def data_asFloat(self):
|
|
|
|
return map(self._transliterateToFloat,self.data)
|
|
|
|
|
2012-12-07 03:16:19 +05:30
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def data_asArray(self,
|
|
|
|
labels = []):
|
|
|
|
import numpy
|
|
|
|
'''
|
|
|
|
read whole data of all (given) labels as numpy array
|
|
|
|
'''
|
|
|
|
|
|
|
|
if labels == []: indices = range(self.__IO__['validReadSize']) # use all columns
|
|
|
|
else: indices = self.labels_index(labels) # use specified columns
|
|
|
|
|
|
|
|
self.data_rewind()
|
|
|
|
return numpy.loadtxt(self.__IO__['in'], usecols=indices)
|
|
|
|
|