SimpleTable: simple wrapper around the Table object¶
Here it is yet another example on how to inherit from the tables.Table
object so as to build an easy-to-use Table object.
Thanks to Brent Pedersen for this one (taken from
https://pypi.python.org/pypi/simpletable).
"""
SimpleTable: simple wrapper around pytables hdf5
------------------------------------------------------------------------------
Example Usage::
>>> from simpletable import SimpleTable
>>> import tables
# define the table as a subclass of simple table.
>>> class ATable(SimpleTable):
... x = tables.Float32Col()
... y = tables.Float32Col()
... name = tables.StringCol(16)
# instantiate with: args: filename, tablename
>>> tbl = ATable('test_docs.h5', 'atable1')
# insert as with pytables:
>>> row = tbl.row
>>> for i in range(50):
... row['x'], row['y'] = i, i * 10
... row['name'] = "name_%i" % i
... row.append()
>>> tbl.flush()
# there is also insert_many() method() with takes an iterable
# of dicts with keys matching the colunns (x, y, name) in this
# case.
# query the data (query() alias of tables' readWhere()
>>> tbl.query('(x > 4) & (y < 70)') #doctest: +NORMALIZE_WHITESPACE
array([('name_5', 5.0, 50.0), ('name_6', 6.0, 60.0)],
dtype=[('name', '|S16'), ('x', '<f4'), ('y', '<f4')])
"""
import tables
_filter = tables.Filters(complib="lzo", complevel=1, shuffle=True)
class SimpleTable(tables.Table):
def __init__(self, file_name, table_name, description=None,
group_name='default', mode='a', title="", filters=_filter,
expectedrows=512000):
f = tables.openFile(file_name, mode)
self.uservars = None
if group_name is None: group_name = 'default'
parentNode = f._getOrCreatePath('/' + group_name, True)
if table_name in parentNode: # existing table
description = None
elif description is None: # pull the description from the attrs
description = dict(self._get_description())
tables.Table.__init__(self, parentNode, table_name,
description=description, title=title,
filters=filters,
expectedrows=expectedrows,
_log=False)
self._c_classId = self.__class__.__name__
def _get_description(self):
# pull the description from the attrs
for attr_name in dir(self):
if attr_name[0] == '_': continue
try:
attr = getattr(self, attr_name)
except:
continue
if isinstance(attr, tables.Atom):
yield attr_name, attr
def insert_many(self, data_generator, attr=False):
row = self.row
cols = self.colnames
if not attr:
for d in data_generator:
for c in cols:
row[c] = d[c]
row.append()
else:
for d in data_generator:
for c in cols:
row[c] = getattr(d, c)
row.append()
self.flush()
query = tables.Table.readWhere
# convience sublcass that i use a lot.
class BlastTable(SimpleTable):
query = tables.StringCol(5)
subject = tables.StringCol(5)
pctid = tables.Float32Col()
hitlen = tables.UInt16Col()
nmismatch = tables.UInt16Col()
ngaps = tables.UInt16Col()
qstart = tables.UInt32Col()
qstop = tables.UInt32Col()
sstart = tables.UInt32Col()
sstop = tables.UInt32Col()
evalue = tables.Float64Col()
score = tables.Float32Col()
if __name__ == '__main__':
import doctest
doctest.testmod()
import os
os.unlink('test_docs.h5')