def _get_td_css(h, v, td_styles): # check for user-provided style if td_styles: if isinstance(td_styles, string_types): return td_styles elif callable(td_styles): return td_styles(v) elif isinstance(td_styles, dict): if h in td_styles: s = td_styles[h] if isinstance(s, string_types): return s elif callable(s): return s(v) else: raise ArgumentError('expected string or callable, got %r' % s) else: raise ArgumentError('expected string, callable or dict, got %r' % td_styles) # fall back to default style if isinstance(v, numeric_types) and not isinstance(v, bool): return 'text-align: right' else: return ''
def _get_tr_css(row, tr_style): # check for user-provided style if tr_style: if isinstance(tr_style, string_types): return tr_style elif callable(tr_style): return tr_style(row) else: raise ArgumentError("expected string or callable, got %r" % tr_style) # fall back to default style return ""
def _get_tr_css(row, tr_style): # check for user-provided style if tr_style: if isinstance(tr_style, string_types): return tr_style elif callable(tr_style): return tr_style(row) else: raise ArgumentError('expected string or callable, got %r' % tr_style) # fall back to default style return ''
def __iter__(self): table = self.table source = self.source encoding = self.encoding errors = self.errors lineterminator = self.lineterminator caption = self.caption index_header = self.index_header tr_style = self.tr_style td_styles = self.td_styles vrepr = self.vrepr truncate = self.truncate with source.open('wb') as buf: # deal with text encoding if PY2: codec = getcodec(encoding) f = codec.streamwriter(buf, errors=errors) else: f = io.TextIOWrapper(buf, encoding=encoding, errors=errors, newline='') # write the table try: it = iter(table) # write header hdr = next(it) _write_begin(f, hdr, lineterminator, caption, index_header, truncate) yield hdr # write body if tr_style and callable(tr_style): # wrap as records it = (Record(row, hdr) for row in it) for row in it: _write_row(f, hdr, row, lineterminator, vrepr, tr_style, td_styles, truncate) yield row # finish up _write_end(f, lineterminator) f.flush() finally: if not PY2: f.detach()
def _hasprop(o, n): return hasattr(o, n) and not callable(getattr(o, n))
def _hasmethod(o, n): return hasattr(o, n) and callable(getattr(o, n))
def select(table, *args, **kwargs): """ Select rows meeting a condition. E.g.:: >>> import petl as etl >>> table1 = [['foo', 'bar', 'baz'], ... ['a', 4, 9.3], ... ['a', 2, 88.2], ... ['b', 1, 23.3], ... ['c', 8, 42.0], ... ['d', 7, 100.9], ... ['c', 2]] >>> # the second positional argument can be a function accepting ... # a row ... table2 = etl.select(table1, ... lambda rec: rec.foo == 'a' and rec.baz > 88.1) >>> table2 +-----+-----+------+ | foo | bar | baz | +=====+=====+======+ | 'a' | 2 | 88.2 | +-----+-----+------+ >>> # the second positional argument can also be an expression ... # string, which will be converted to a function using petl.expr() ... table3 = etl.select(table1, "{foo} == 'a' and {baz} > 88.1") >>> table3 +-----+-----+------+ | foo | bar | baz | +=====+=====+======+ | 'a' | 2 | 88.2 | +-----+-----+------+ >>> # the condition can also be applied to a single field ... table4 = etl.select(table1, 'foo', lambda v: v == 'a') >>> table4 +-----+-----+------+ | foo | bar | baz | +=====+=====+======+ | 'a' | 4 | 9.3 | +-----+-----+------+ | 'a' | 2 | 88.2 | +-----+-----+------+ The complement of the selection can be returned (i.e., the query can be inverted) by providing `complement=True` as a keyword argument. """ missing = kwargs.get('missing', None) complement = kwargs.get('complement', False) if len(args) == 0: raise ArgumentError('missing positional argument') elif len(args) == 1: where = args[0] if isinstance(where, string_types): where = expr(where) else: assert callable(where), 'second argument must be string or callable' return RowSelectView(table, where, missing=missing, complement=complement) else: field = args[0] where = args[1] assert callable(where), 'third argument must be callable' return FieldSelectView(table, field, where, complement=complement, missing=missing)
def tohtml(table, source=None, encoding=None, errors=None, caption=None, vrepr=text_type, lineterminator='\n', index_header=False, tr_style=None, td_styles=None, truncate=None): """ Write the table as HTML to a file. E.g.:: >>> import petl as etl >>> table1 = [['foo', 'bar'], ... ['a', 1], ... ['b', 2], ... ['c', 2]] >>> etl.tohtml(table1, 'example.html', caption='example table') >>> print(open('example.html').read()) <table class='petl'> <caption>example table</caption> <thead> <tr> <th>foo</th> <th>bar</th> </tr> </thead> <tbody> <tr> <td>a</td> <td style='text-align: right'>1</td> </tr> <tr> <td>b</td> <td style='text-align: right'>2</td> </tr> <tr> <td>c</td> <td style='text-align: right'>2</td> </tr> </tbody> </table> The `caption` keyword argument is used to provide a table caption in the output HTML. """ source = write_source_from_arg(source) with source.open('wb') as buf: # deal with text encoding if PY2: codec = getcodec(encoding) f = codec.streamwriter(buf, errors=errors) else: f = io.TextIOWrapper(buf, encoding=encoding, errors=errors, newline='') # write the table try: it = iter(table) # write header hdr = next(it) _write_begin(f, hdr, lineterminator, caption, index_header, truncate) # write body if tr_style and callable(tr_style): # wrap as records it = (Record(row, hdr) for row in it) for row in it: _write_row(f, hdr, row, lineterminator, vrepr, tr_style, td_styles, truncate) # finish up _write_end(f, lineterminator) f.flush() finally: if not PY2: f.detach()
def select(table, *args, **kwargs): """ Select rows meeting a condition. E.g.:: >>> import petl as etl >>> table1 = [['foo', 'bar', 'baz'], ... ['a', 4, 9.3], ... ['a', 2, 88.2], ... ['b', 1, 23.3], ... ['c', 8, 42.0], ... ['d', 7, 100.9], ... ['c', 2]] >>> # the second positional argument can be a function accepting ... # a row ... table2 = etl.select(table1, ... lambda rec: rec.foo == 'a' and rec.baz > 88.1) >>> table2 +-----+-----+------+ | foo | bar | baz | +=====+=====+======+ | 'a' | 2 | 88.2 | +-----+-----+------+ >>> # the second positional argument can also be an expression ... # string, which will be converted to a function using petl.expr() ... table3 = etl.select(table1, "{foo} == 'a' and {baz} > 88.1") >>> table3 +-----+-----+------+ | foo | bar | baz | +=====+=====+======+ | 'a' | 2 | 88.2 | +-----+-----+------+ >>> # the condition can also be applied to a single field ... table4 = etl.select(table1, 'foo', lambda v: v == 'a') >>> table4 +-----+-----+------+ | foo | bar | baz | +=====+=====+======+ | 'a' | 4 | 9.3 | +-----+-----+------+ | 'a' | 2 | 88.2 | +-----+-----+------+ The complement of the selection can be returned (i.e., the query can be inverted) by providing `complement=True` as a keyword argument. """ missing = kwargs.get('missing', None) complement = kwargs.get('complement', False) if len(args) == 0: raise ArgumentError('missing positional argument') elif len(args) == 1: where = args[0] if isinstance(where, string_types): where = expr(where) else: assert callable( where), 'second argument must be string or callable' return RowSelectView(table, where, missing=missing, complement=complement) else: field = args[0] where = args[1] assert callable(where), 'third argument must be callable' return FieldSelectView(table, field, where, complement=complement, missing=missing)