GitXplorerGitXplorer
e

python-tablefu

public
233 stars
18 forks
5 issues

Commits

List of commits on branch master.
Unverified
d8761c1f87e3f89d9b89b0b6b9283fc4738b6676

Merge pull request #15 from ftobia/master

eeyeseast committed 11 years ago
Unverified
fdb71aa548ba734e073c204aab3f3a8bf186cd76

Add travis-ci config.

fftobia committed 12 years ago
Unverified
e6f1f5c07f20d10c226b3f68097dcaab53d16cb5

Add tox.ini

fftobia committed 12 years ago
Unverified
3233865dc7f05744593db60fee4e9326ed5f1135

Merge pull request #12 from abbgrade/master

ppalewire committed 12 years ago
Unverified
cb3ca7de5a5a02a4e737f1bddfc32b5097fc4705

csv-dialect as constructor option added

committed 12 years ago
Unverified
25b1f408480d21cf7f3fb772f68b866e2109819b

Patch version bump

eeyeseast committed 13 years ago

README

The README file for this repository.

Python TableFu is a tool for manipulating spreadsheet-like tables in Python. It began as a Python implementation of ProPublica's TableFu, though new methods have been added. TableFu allows filtering, faceting and manipulating of data. Going forward, the project aims to create something akin to an ORM for spreadsheets.

Usage:

>>> from table_fu import TableFu
>>> table = TableFu.from_file('tests/test.csv')
>>> table.columns
['Author', 'Best Book', 'Number of Pages', 'Style']

# get all authors
>>> table.values('Author')
['Samuel Beckett', 'James Joyce', 'Nicholson Baker', 'Vladimir Sorokin']

# total a column
>>> table.total('Number of Pages')
1177.0

# filtering a table returns a new instance
>>> t2 = table.filter(Style='Modernism')
>>> list(t2)
[<Row: Samuel Beckett, Malone Muert, 120, Modernism>,
 <Row: James Joyce, Ulysses, 644, Modernism>]


# each TableFu instance acts like a list of rows
>>> table[0]
<Row: Samuel Beckett, Malone Muert, 120, Modernism>

list(table.rows)
[<Row: Samuel Beckett, Malone Muert, 120, Modernism>,
 <Row: James Joyce, Ulysses, 644, Modernism>,
 <Row: Nicholson Baker, Mezannine, 150, Minimalism>,
 <Row: Vladimir Sorokin, The Queue, 263, Satire>]

# rows, in turn, act like dictionaries
>>> row = table[1]
>>> print row['Author']
James Joyce

# transpose a table
>>> t2 = table.transpose()
>>> list(t2)
[<Row: Best Book, Malone Muert, Ulysses, Mezannine, The Queue>,
 <Row: Number of Pages, 120, 644, 150, 263>,
 <Row: Style, Modernism, Modernism, Minimalism, Satire>]

>>> t2.columns
['Author',
 'Samuel Beckett',
 'James Joyce',
 'Nicholson Baker',
 'Vladimir Sorokin']

# sort rows
>>> table.sort('Author')
>>> table.rows
[<Row: James Joyce, Ulysses, 644, Modernism>,
 <Row: Nicholson Baker, Mezannine, 150, Minimalism>,
 <Row: Samuel Beckett, Malone Muert, 120, Modernism>,
 <Row: Vladimir Sorokin, The Queue, 263, Satire>]

# sorting is stored
table.options['sorted_by']
{'Author': {'reverse': False}}

# which is handy because...

# tables can also be faceted (and options are copied to new tables)
>>> for t in table.facet_by('Style'):
...     print t.faceted_on
...     t.table
Minimalism
[['Nicholson Baker', 'Mezannine', '150', 'Minimalism']]
Modernism
[['Samuel Beckett', 'Malone Muert', '120', 'Modernism'],
 ['James Joyce', 'Ulysses', '644', 'Modernism']]
Satire
[['Vladimir Sorokin', 'The Queue', '263', 'Satire']]

Here's an advanced example that uses faceting and filtering to produce aggregates from this spreadsheet (extracted from the New York Times Congress API).

Formatting

Filters are just functions that take a value and some number of positional arguments. New filters can be registered with the included Formatter class.

>>> from table_fu.formatting import Formatter
>>> format = Formatter()
>>> def capitalize(value, *args):
...     return str(value).capitalize()
>>> format.register(capitalize)
>>> print format('foo', 'capitalize')
Foo

Cells can be formatted according to rules of the table (which carry over if the table is faceted):

>>> table = TableFu(open('tests/sites.csv'))
>>> table.columns
['Name', 'URL', 'About']
>>> table.formatting = {
... 'Name': {'filter': 'link', 'args': ['URL']}
... }
>>> print table[0]['Name']
<a href="http://www.chrisamico.com" title="ChrisAmico.com">ChrisAmico.com</a>

HTML Output

TableFu can output an HTML table, using formatting you specify:

>>> table = TableFu(open('tests/sites.csv'))
>>> table.columns
['Name', 'URL', 'About']
>>> table.formatting = {'Name': {'filter: 'link', 'args': ['URL']}}
>>> table.columns = 'Name', 'About'
>>> print table.html()
<table>
<thead>
<tr><th>Name</th><th>About</th></tr>
</thead>
<tbody>
<tr id="row0" class="row even"><td class="datum"><a href="http://www.chrisamico.com" title="ChrisAmico.com">ChrisAmico.com</a></td><td class="datum">My personal site and blog</td></tr>
<tr id="row1" class="row odd"><td class="datum"><a href="http://www.propublica.org" title="ProPublica">ProPublica</a></td><td class="datum">Builders of the Ruby version of this library</td></tr>
<tr id="row2" class="row even"><td class="datum"><a href="http://www.pbs.org/newshour" title="PBS NewsHour">PBS NewsHour</a></td><td class="datum">Where I spend my days</td></tr>
</tbody>
</table>