[![PyPI version fury.io](https://badge.fury.io/py/ansitable.svg)](https://pypi.python.org/pypi/ansitable/)
[![Anaconda version](https://anaconda.org/conda-forge/ansitable/badges/version.svg)](https://anaconda.org/conda-forge/ansitable)
[![pyversions](https://img.shields.io/pypi/pyversions/ansitable)](https://pypi.python.org/pypi/ansitable/)
[![Build Status](https://github.com/petercorke/bdsim/workflows/build/badge.svg?branch=master)](https://github.com/petercorke/bdsim/actions?query=workflow%3Abuild)
[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/petercorke/ansitable/graphs/commit-activity)
[![GitHub license](https://img.shields.io/github/license/Naereen/StrapDown.js.svg)](https://github.com/petercorke/ansitable/blob/master/LICENSE)
[![PyPI - Downloads](https://img.shields.io/pypi/dm/ansitable)](https://pypistats.org/packages/ansitable)
<table style="border:0px">
<tr style="border:0px">
<td style="border:0px">
<img src="https://github.com/petercorke/ansitable/raw/master/figs/ansi_logo.png" width="300"></td>
<td style="border:0px">
Pretty tables and matrices for Python</a>
<ul>
<li><a href="https://github.com/petercorke/ansitable">GitHub repository </a></li>
<li><a href="https://petercorke.github.io/ansitable">Documentation</a></li>
<li>Dependencies: <a href="https://dslackw.gitlab.io/colored">colored</a></li>
</ul>
</td>
</tr>
</table>
# Synopsis
Create a table programatically from Python, or import a table from a Pandas dataframe which is also an easy way to read an Excel or CSV file. Display your table on the console or render it to a popular markup language such as HTML, Markdown, reStructured text, LaTeX or wikitable.
* [Tables of data](#tables)
* [Matrices](#matrices)
### What's new
0.11.2:
- export a table in HTML format
- export a table in ReST format
- export a table in wikitable format
- improved format override for a single cell, using `Cell`
0.11.0:
- [Pandas integration](https://pandas.pydata.org). Convert a Pandas DataFrame to a table, or vice versa
- export a table in CSV format
- added unit tests for the various conversion methods
0.10.0:
- `colsep` is now the number of padding spaces on each side of the cell data. `colsep=1` means one space on the left and one on the right, previously this was achieved by `colsep=2`.
- the padding now has `bgcolor`
- the method `rule()` adds a horizontal dividing line across the table (actually this is from a few releases ago)
- `row()` has arguments to override the fgcolor, bgcolor and style of all columns in the row, useful for highlighting a row.
0.9.10:
- fix problems due to changes with [`colored`](https://pypi.org/project/colored) 2.x
0.9.5:
- methods to format table as MarkDown or LaTeX
- work with Python 3.4
0.9.3:
- create matrices as well as tables
- option to suppress color output
# Tables
Painless creation of nice-looking tables of data for Python.
![colored table](https://github.com/petercorke/ansitable/raw/master/figs/colortable.png)
## Starting simple
```python
1 | from ansitable import ANSITable, Column
2 |
3 | table = ANSITable("col1", "column 2 has a big header", "column 3")
4 | table.row("aaaaaaaaa", 2.2, 3)
5 | table.row("bbbbbbbbbbbbb", 5.5, 6)
6 | table.row("ccccccc", 8.8, 9)
7 | table.print()
```
Line 3 constructs an `ANSITable` object and the arguments are a sequence of
column names followed by `ANSITable` keyword arguments - there are none in this first example. Since there are three column names this this will be
a 3-column table.
Lines 4-6 add rows, 3 data values for each row.
Line 7 prints the table and yields a tabular display
with column widths automatically chosen, and headings and column
data all right-justified (default)
```
col1 column 2 has a big header column 3
aaaaaaaaa 2.2 3
bbbbbbbbbbbbb 5.5 6
ccccccc 8.8 9
```
By default output is printed to the console (`stdout`) but we can also:
- provide a `file` option to `.print()` to allow writing to a specified output stream, the
default is `stdout`.
- obtain a multi-line string version of the entire table as `str(table)`.
The more general solution is to provide a sequence of `Column` objects which
allows many column specific options to be given, as we shall see later.
For now though, we could rewrite the example above as:
```python
table = ANSITable(
Column("col1"),
Column("column 2 has a big header"),
Column("column 3")
)
```
or as
```python
table = ANSITable()
table.addcolumn("col1")
table.addcolumn("column 2 has a big header")
table.addcolumn("column 3")
```
where the keyword arguments to `.addcolumn()` are the same as those for
`Column` and are given below.
***
We can specify a [Python `format()` style format string](https://docs.python.org/3/library/string.html#formatspec) for any column - by default it
is the general formatting option `"{}"`.
You may choose to left or right justify values via the format string, `ansitable` provides control over how those resulting strings are justified within the column.
```python
table = ANSITable(
Column("col1"),
Column("column 2 has a big header", "{:.3g}"), # CHANGE
Column("column 3", "{:-10.4f}")
)
table.row("aaaaaaaaa", 2.2, 3)
table.row("bbbbbbbbbbbbb", 5.5, 6)
table.row("ccccccc", 8.8, 9)
table.print()
```
which yields
```
col1 column 2 has a big header column 3
aaaaaaaaa 2.2 3.0000
bbbbbbbbbbbbb 5.5 6.0000
ccccccc 8.8 9.0000
```
Alternatively we can specify the format argument as a function that converts
the value to a string.
***
The data in column 1 is quite long, we might wish to set a maximum column width which
we can do using the `width` argument
```python
table = ANSITable(
Column("col1", width=10), # CHANGE
Column("column 2 has a big header", "{:.3g}"),
Column("column 3", "{:-10.4f}")
)
table.row("aaaaaaaaa", 2.2, 3)
table.row("bbbbbbbbbbbbb", 5.5, 6)
table.row("ccccccc", 8.8, 9)
table.print()
```
which yields
```
col1 column 2 has a big header column 3
aaaaaaaaa 2.2 3.0000
bbbbbbbbb… 5.5 6.0000
ccccccc 8.8 9.0000
```
where we see that the data in column 1 has been truncated.
If you don't like the ellipsis you can turn it off, and get to see one more
character, with the `ANSITable` option `ellipsis=False`. The Unicode ellipsis
character u+2026 is used.
## Borders
We can add a table border made up of regular ASCII characters
```python
table = ANSITable(
Column("col1"),
Column("column 2 has a big header"),
Column("column 3"),
border="ascii" # CHANGE
)
table.row("aaaaaaaaa", 2.2, 3)
table.row("bbbbbbbbbbbbb", 5.5, 6)
table.row("ccccccc", 8.8, 9)
table.print()
```
which yields
```
+--------------+---------------------------+----------+
| col1 | column 2 has a big header | column 3 |
+--------------+---------------------------+----------+
| aaaaaaaaa | 2.2 | 3 |
|bbbbbbbbbbbbb | 5.5 | 6 |
| ccccccc | 8.8 | 9 |
+--------------+---------------------------+----------+
```
***
Or we can construct a border using the [ANSI box-drawing characters](https://en.wikipedia.org/wiki/Box-drawing_character) which are supported by most terminal
emulators
```python
table = ANSITable(
Column("col1"),
Column("column 2 has a big header"),
Column("column 3"),
border="thick" # CHANGE
)
table.row("aaaaaaaaa", 2.2, 3)
table.row("bbbbbbbbbbbbb", 5.5, 6)
table.row("ccccccc", 8.8, 9)
table.print()
```
which yields
```
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ col1 ┃ column 2 has a big header ┃ column 3 ┃
┣━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━┫
┃ aaaaaaaaa ┃ 2.2 ┃ 3 ┃
┃bbbbbbbbbbbbb ┃ 5.5 ┃ 6 ┃
┃ ccccccc ┃ 8.8 ┃ 9 ┃
┗━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━┛
```
_Note: this actually looks better on the console than it does in GitHub markdown._
Other border options include "thin", "rounded" (thin with round corners) and "double".
## Header and column alignment
We can change the alignment of data and heading for any column with the alignment flags `"<"` (left),
`">"` (right) and `"^"` (centered).
```python
table = ANSITable(
Column("col1"),
Column("column 2 has a big header", colalign="^"), # CHANGE
Column("column 3"),
border="thick"
)
table.row("aaaaaaaaa", 2.2, 3)
table.row("bbbbbbbbbbbbb", 5.5, 6)
table.row("ccccccc", 8.8, 9)
table.print()
```
which yields
```
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ col1 ┃ column 2 has a big header ┃ column 3 ┃
┣━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━┫
┃ aaaaaaaaa ┃ 2.2 ┃ 3 ┃
┃bbbbbbbbbbbbb ┃ 5.5 ┃ 6 ┃
┃ ccccccc ┃ 8.8 ┃ 9 ┃
┗━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━┛
```
where the data for column 2 has been centered.
***
Heading and data alignment for any column can be set independently
```python
table = ANSITable(
Column("col1", headalign="<"), # CHANGE
Column("column 2 has a big header", colalign="^"),
Column("column 3", colalign="<"), # CHANGE
border="thick"
)
table.row("aaaaaaaaa", 2.2, 3)
table.row("bbbbbbbbbbbbb", -5.5, 6)
table.row("ccccccc", 8.8, -9)
table.print()
```
yields
```
┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ col1 ┃ column 2 has a big header ┃ column 3 ┃
┣━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━┫
┃ aaaaaaaaa ┃ 2.2 ┃ 3 ┃
┃ bbbbbbbbbbbbb ┃ -5.5 ┃ 6 ┃
┃ ccccccc ┃ 8.8 ┃ -9 ┃
┗━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━┛
```
where we have left-justified the heading for column 1 and the data for column 3.
We can easily add a dividing line
```python
table = ANSITable(
Column("col1", headalign="<"),
Column("column 2 has a big header", colalign="^"),
Column("column 3", colalign="<"),
border="thick"
)
table.row("aaaaaaaaa", 2.2, 3)
table.row("bbbbbbbbbbbbb", -5.5, 6)
table.rule() # CHANGE
table.row("ccccccc", 8.8, -9)
table.print()
```
yields
```
┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ col1 ┃ column 2 has a big header ┃ column 3 ┃
┣━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━┫
┃ aaaaaaaaa ┃ 2.2 ┃ 3 ┃
┃ bbbbbbbbbbbbb ┃ -5.5 ┃ 6 ┃
┣━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━┫
┃ ccccccc ┃ 8.8 ┃ -9 ┃
┗━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━┛
```
## Color
If you have the `colored` package installed then you can set the foreground and
background color and style (bold, reverse, underlined, dim) of the header and column data, as well as the border color.
```python
table = ANSITable(
Column("col1", headalign="<", colcolor="red", headstyle="underlined"), # CHANGE
Column("column 2 has a big header", colalign="^", colstyle="bold"), # CHANGE
Column("column 3", colalign="<", colbgcolor="green"), # CHANGE
border="thick", bordercolor="blue" # CHANGE
)
table.row("aaaaaaaaa", 2.2, 3)
table.row("bbbbbbbbbbbbb", -5.5, 6) # CHANGE
table.row("ccccccc", 8.8, -9)
table.print()
```
which yields
![colored table](https://github.com/petercorke/ansitable/raw/master/figs/colortable.png)
It is possible to the change the color of a single row of the table, overriding the column
defaults, by
```python
table.row("aaaaaaaaa", 2.2, 3)
table.row("bbbbbbbbbbbbb", 5.5, 6)
table.row("ccccccc", 8.8, -9)
```
which yields
![colored table](https://github.com/petercorke/ansitable/raw/master/figs/colortable2.png)
It is also possible to the change the color of a single cell of the table, overriding the column
and row defaults, by passing a `Cell` instance
```python
table = ANSITable("col1", "column 2 has a big header", "column 3")
table.row("aaaaaaaaa", 2.2, 3)
table.row("bbbbbbbbbbbbb", Cell(-5.5, bgcolor="blue"), 6, bgcolor="yellow") # CHANGE
table.row("ccccccc", 8.8, 9)
table.print()
```
which yields
![colored table](https://github.com/petercorke/ansitable/raw/master/figs/colortable3.png)
The older method (deprecated) of doing this is by prefixing the value with a color enclosed in double angle brackets, for example `<<red>>`. This does not allow changing the background
color or style of the cell.
```python
table = ANSITable("col1", "column 2 has a big header", "column 3")
table.row("aaaaaaaaa", 2.2, 3)
table.row("<<red>>bbbbbbbbbbbbb", 5.5, 6)
table.row("<<blue>>ccccccc", 8.8, 9)
table.print()
```
## All options
### ANSITable
These keyword arguments control the styling of the entire table.
| Keyword | Default | Purpose |
|---- |---- |---- |
colsep | 2 | Gap between columns (in spaces)
offset | 0 | Gap at start of each row, shifts the table to the left
border | no border | Border style: 'ascii', 'thin', 'thick', 'double'
bordercolor | |Border color, see [possible values](https://pypi.org/project/colored)
ellipsis | True | Add an ellipsis if a wide column is truncated
header | True | Include the column header row
columns | | Specify the number of columns if `header=False` and no header name or `Column` arguments are given
color | True | Enable color
- Color is only possible if the `colored` package is installed
- If `color` is False then no color escape sequences will be emitted, useful
override for tables included in Sphinx documentation.
### Column
These keyword arguments control the styling of a single column.
| Keyword | Default | Purpose |
|---- |---- |---- |
fmt | `"{}"` | format string for the column value, or a callable that maps the column value to a string
width || maximum column width, excess will be truncated
colcolor || Text color, see [possible values](https://pypi.org/project/colored)
colbgcolor || Text background color, see [possible values](https://pypi.org/project/colored)
colstyle || Text style: "bold", "underlined", "reverse", "dim", "blink"
colalign | `">"` | Text alignment: `">"` (left), `"<"` (right), `"^"` (centered)
headcolor || Heading text color, see [possible values](https://pypi.org/project/colored)
headbgcolor || Heading text background color, see [possible values](https://pypi.org/project/colored)
headstyle || Heading text style: "bold", "underlined", "reverse", "dim", "blink"
headalign | `">"` | Heading text alignment: `">"` (left), `"<"` (right), `"^"` (centered)
Note that many terminal emulators do not support the "blink" style.
### Row
These keyword arguments control the styling of a single row.
| Keyword | Default | Purpose |
|---- |---- |---- |
fgcolor || Text color, see [possible values](https://pypi.org/project/colored)
bgcolor || Text background color, see [possible values](https://pypi.org/project/colored)
style || Text style: "bold", "underlined", "reverse", "dim", "blink"
Row styling overrides column styling.
### Cell
These keyword arguments control the styling of a single cell.
| Keyword | Default | Purpose |
|---- |---- |---- |
fgcolor || Text color, see [possible values](https://pypi.org/project/colored)
bgcolor || Text background color, see [possible values](https://pypi.org/project/colored)
style || Text style: "bold", "underlined", "reverse", "dim", "blink"
Cell styling overrides row and column styling.
## Render to markup language
Now that you can visualize your data as a beautiful table on the console, you
might want the table in a different format to include in a
document or website. ANSItable supports rendering a table into one of a number of common markup languages.
We start by creating a simple table
```python
table = ANSITable("col1", "column 2 has a big header", "column 3")
table.row("aaaaaaaaa", 2.2, 3)
table.row("bbbbbbbbbbbbb", -5.5, 6)
table.row("ccccccc", 8.8, -9)
table.print()
```
Support for alignment and color options depends on the capability of the markup language that is being exported to.
### Markdown
The table can be rendered into Markdown format by
```
table.markdown()
```
which generates
```
| col1 | column 2 has a big header | column 3 |
| ------------: | ------------------------: | -------: |
| aaaaaaaaa | 2.2 | 3 |
| bbbbbbbbbbbbb | -5.5 | 6 |
| ccccccc | 8.8 | -9 |
```
Column alignment is supported, but MarkDown doesn't allow the header to have different alignment to the data.
### HTML
The table can be rendered into Markdown format by
```
table.html()
```
which generates
```
<table style=''>
<tr style=''>
<th style='text-align:right;'>col1</th>
<th style='text-align:right;'>column 2 has a big header</th>
<th style='text-align:right;'>column 3</th>
</tr>
<tr style=''>
<td style='text-align:right;'>aaaaaaaaa</td>
<td style='text-align:right;'>2.2</td>
<td style='text-align:right;'>3</td>
</tr>
<tr style=''>
<td style='text-align:right;'>bbbbbbbbbbbbb</td>
<td style='text-align:right;'>-5.5</td>
<td style='text-align:right;'>6</td>
</tr>
<tr style=''>
<td style='text-align:right;'>ccccccc</td>
<td style='text-align:right;'>8.8</td>
<td style='text-align:right;'>-9</td>
</tr>
</table>
```
which renders as
<table style=''>
<tr style=''>
<th style='text-align:right;'>col1</th>
<th style='text-align:right;'>column 2 has a big header</th>
<th style='text-align:right;'>column 3</th>
</tr>
<tr style=''>
<td style='text-align:right;'>aaaaaaaaa</td>
<td style='text-align:right;'>2.2</td>
<td style='text-align:right;'>3</td>
</tr>
<tr style=''>
<td style='text-align:right;'>bbbbbbbbbbbbb</td>
<td style='text-align:right;'>-5.5</td>
<td style='text-align:right;'>6</td>
</tr>
<tr style=''>
<td style='text-align:right;'>ccccccc</td>
<td style='text-align:right;'>8.8</td>
<td style='text-align:right;'>-9</td>
</tr>
</table>
CSS styling options can be applied to the table, rows and cells.
This format supports ANSItable header and column foreground and background color options.
### ReStructedText
The table can be rendered into reStructedText (ReST) "simple table" format by
```
table.rest()
```
which generates
```
============= ========================= ========
col1 column 2 has a big header column 3
============= ========================= ========
aaaaaaaaa 2.2 3
bbbbbbbbbbbbb -5.5 6
ccccccc 8.8 -9
============= ========================= ========
```
Header and column alignment options are not supported in the ReST simple
table format.
### LaTex
The table can be rendered into LaTeX format by
```
table.latex()
```
which generates
```
\begin{tabular}{ |r|r|r| }\hline
\multicolumn{1}{|r|}{col1} & \multicolumn{1}{|r|}{column 2 has a big header} & \multicolumn{1}{|r|}{column 3}\\\hline\hline
aaaaaaaaa & 2.2 & 3 \\
bbbbbbbbbbbbb & -5.5 & 6 \\
ccccccc & 8.8 & -9 \\
\hline
\end{tabular}
```
Header and column alignment options are supported.
### Wikitable
The table can be rendered into wikitable markup format, as used for tables in Wikipedia, by
```
table.wikitable()
```
which generates
```
{| class="wikitable" col1right col2right col3right
|-
! col1 !! column 2 has a big header !! column 3
|-
| aaaaaaaaa || 2.2 || 3
|-
| bbbbbbbbbbbbb || -5.5 || 6
|-
| ccccccc || 8.8 || -9
|}
```
Column alignment is supported, but wikitable headers are always centred.
### CSV
The table can be rendered into CSV format by
```
table.csv()
```
which generates
```
col1,column 2 has a big header,column 3
aaaaaaaaa,2.2,3
bbbbbbbbbbbbb,-5.5,6
ccccccc,8.8,-9
```
The delimiter character defaults to comma, but can be set.
CSV format data can be quickly visualized on the desktop using any spreadsheet program,
or included in ReST documentation using the `csv-table` directive.
## Pandas integration
Pandas is THE tool to use for tabular data so we support conversions in both directions.
To convert a Pandas DataFrame to an ANSItable is just
```
import pandas as pd
df = pd.DataFrame({"calories": [420, 380, 390], "duration": [50, 40, 45]})
table = ANSITable.Pandas(df, border="thin")
table.print()
┌──────────┬──────────┐
│ calories │ duration │
├──────────┼──────────┤
│ 420 │ 50 │
│ 380 │ 40 │
│ 390 │ 45 │
└──────────┴──────────┘
```
``Pandas()`` is a static method that acts like a constructor. This is the simplest way to display CSV format data in an ANSItable by using Pandas ``read_csv()`` to load the data into a ``DataFrame``.
To export an ANSItable as a Pandas DataFrame is simply
```
table = ANSITable("col1", "column 2 has a big header", "column 3")
table.row("aaaaaaaaa", 2.2, 3)
table.row("bbbbbbbbbbbbb", -5.5, 6)
table.row("ccccccc", 8.8, -9)
df = table.pandas()
print(df)
col1 column_2_has_a_big_header column_3
0 aaaaaaaaa 2.2 3
1 bbbbbbbbbbbbb -5.5 6
2 ccccccc 8.8 -9
```
Note that the column names have been modified, spaces changed to underscores, which
allows the columns to be accessed as attributes:
```
print(df.column_2_has_a_big_header.to_string())
0 2.2
1 -5.5
2 8.8
```
which shows the column as a Pandas `Series` object. This column name-changing behaviour can be disabled by passing ``underscores=False``.
# Matrices
Painless creation of nice-looking matrices for Python.
We can create a formatter for NumPy arrays (1D or 2D)
```python
from ansitable import ANSIMatrix
formatter = ANSIMatrix(style='thick')
```
and then use it to format a NumPy array
```python
m = np.random.rand(4,4) - 0.5
m[0,0] = 1.23456e-14
formatter.print(m)
```
yields
```
┏ ┓
┃ 0 -0.385 -0.106 0.296 ┃
┃ 0.0432 0.339 0.119 -0.468 ┃
┃ 0.405 -0.306 0.0165 -0.439 ┃
┃ 0.203 0.4 -0.499 -0.487 ┃
┗ ┛
```
we can also add suffixes
```python
formatter.print(m, suffix_super='T', suffix_sub='3')
```
yields
```
┏ ┓T
┃ 0 -0.239 0.186 -0.414 ┃
┃ 0.49 0.215 -0.0148 0.0529 ┃
┃ 0.0473 0.0311 0.45 0.394 ┃
┃-0.192 0.193 -0.455 0.0302 ┃
┗ ┛3
```
By default output is printed to the console (stdout) but we can also:
* provide a `file` option to `.print()` to allow writing to a specified output stream, the default is `stdout`.
* obtain a multi-line string version of the entire table using the `.str()` method
instead of `.print()`.
The formatter takes additional arguments to control the numeric format and to
control the suppression of very small values.
### ANSIMatrix
These keyword arguments control the overall styling and operation of the formatter.
| Keyword | Default | Purpose |
|---- |---- |---- |
style | `"thin"` | `"thin"`, `"round"`, `"thick"`, `"double"`
fmt | `"{:< 10.3g}"` | format for each element
squish | True | set small elements to zero
squishtol | 100 | elements less than `squishtol * eps` are set to zero
### Formatter
A formatter takes additional arguments to the styling for a particular call.
| Keyword | Default | Purpose |
|---- |---- |---- |
suffix_super | `""` | superscript suffix text
suffix_sub | `""` | subscript suffix text
Raw data
{
"_id": null,
"home_page": null,
"name": "ansitable",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "table, table layout, table format, tabular, tabular layout, tabular format, Pandas, ANSI, ANSI art, ANSI box characters, color, ANSI color, matrix display, CSV, Markdown table, HTML table, LaTeX table, ReStructuredText table, wikitable table",
"author": null,
"author_email": "Peter Corke <rvc@petercorke.com>",
"download_url": "https://files.pythonhosted.org/packages/cd/1d/c91feb78afb9faf737f01071626c95d4242924585e600093ccd3af2acfc8/ansitable-0.11.4.tar.gz",
"platform": null,
"description": "[![PyPI version fury.io](https://badge.fury.io/py/ansitable.svg)](https://pypi.python.org/pypi/ansitable/)\n[![Anaconda version](https://anaconda.org/conda-forge/ansitable/badges/version.svg)](https://anaconda.org/conda-forge/ansitable)\n[![pyversions](https://img.shields.io/pypi/pyversions/ansitable)](https://pypi.python.org/pypi/ansitable/)\n[![Build Status](https://github.com/petercorke/bdsim/workflows/build/badge.svg?branch=master)](https://github.com/petercorke/bdsim/actions?query=workflow%3Abuild)\n[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/petercorke/ansitable/graphs/commit-activity)\n[![GitHub license](https://img.shields.io/github/license/Naereen/StrapDown.js.svg)](https://github.com/petercorke/ansitable/blob/master/LICENSE)\n[![PyPI - Downloads](https://img.shields.io/pypi/dm/ansitable)](https://pypistats.org/packages/ansitable)\n\n\n<table style=\"border:0px\">\n<tr style=\"border:0px\">\n<td style=\"border:0px\">\n<img src=\"https://github.com/petercorke/ansitable/raw/master/figs/ansi_logo.png\" width=\"300\"></td>\n<td style=\"border:0px\">\nPretty tables and matrices for Python</a>\n<ul>\n<li><a href=\"https://github.com/petercorke/ansitable\">GitHub repository </a></li>\n<li><a href=\"https://petercorke.github.io/ansitable\">Documentation</a></li>\n<li>Dependencies: <a href=\"https://dslackw.gitlab.io/colored\">colored</a></li>\n</ul>\n</td>\n</tr>\n</table>\n\n# Synopsis\n\n\nCreate a table programatically from Python, or import a table from a Pandas dataframe which is also an easy way to read an Excel or CSV file. Display your table on the console or render it to a popular markup language such as HTML, Markdown, reStructured text, LaTeX or wikitable.\n\n* [Tables of data](#tables)\n* [Matrices](#matrices)\n\n\n### What's new\n\n0.11.2:\n\n- export a table in HTML format\n- export a table in ReST format\n- export a table in wikitable format\n- improved format override for a single cell, using `Cell`\n\n0.11.0:\n\n- [Pandas integration](https://pandas.pydata.org). Convert a Pandas DataFrame to a table, or vice versa\n- export a table in CSV format\n- added unit tests for the various conversion methods\n\n0.10.0:\n\n- `colsep` is now the number of padding spaces on each side of the cell data. `colsep=1` means one space on the left and one on the right, previously this was achieved by `colsep=2`.\n- the padding now has `bgcolor`\n- the method `rule()` adds a horizontal dividing line across the table (actually this is from a few releases ago)\n- `row()` has arguments to override the fgcolor, bgcolor and style of all columns in the row, useful for highlighting a row.\n\n0.9.10:\n\n- fix problems due to changes with [`colored`](https://pypi.org/project/colored) 2.x\n \n0.9.5:\n\n- methods to format table as MarkDown or LaTeX\n- work with Python 3.4\n\n0.9.3:\n\n- create matrices as well as tables\n- option to suppress color output\n\n# Tables\n\nPainless creation of nice-looking tables of data for Python.\n\n![colored table](https://github.com/petercorke/ansitable/raw/master/figs/colortable.png) \n\n## Starting simple\n\n```python\n 1 | from ansitable import ANSITable, Column\n 2 |\n 3 | table = ANSITable(\"col1\", \"column 2 has a big header\", \"column 3\")\n 4 | table.row(\"aaaaaaaaa\", 2.2, 3)\n 5 | table.row(\"bbbbbbbbbbbbb\", 5.5, 6)\n 6 | table.row(\"ccccccc\", 8.8, 9)\n 7 | table.print()\n\n```\nLine 3 constructs an `ANSITable` object and the arguments are a sequence of \ncolumn names followed by `ANSITable` keyword arguments - there are none in this first example. Since there are three column names this this will be \na 3-column table.\nLines 4-6 add rows, 3 data values for each row.\n\nLine 7 prints the table and yields a tabular display\nwith column widths automatically chosen, and headings and column \ndata all right-justified (default)\n\n```\n col1 column 2 has a big header column 3 \n aaaaaaaaa 2.2 3 \nbbbbbbbbbbbbb 5.5 6 \n ccccccc 8.8 9 \n```\n\nBy default output is printed to the console (`stdout`) but we can also:\n\n- provide a `file` option to `.print()` to allow writing to a specified output stream, the\ndefault is `stdout`.\n- obtain a multi-line string version of the entire table as `str(table)`.\n\nThe more general solution is to provide a sequence of `Column` objects which \nallows many column specific options to be given, as we shall see later. \nFor now though, we could rewrite the example above as:\n\n```python\ntable = ANSITable(\n Column(\"col1\"),\n Column(\"column 2 has a big header\"),\n Column(\"column 3\")\n )\n```\n\nor as\n\n```python\ntable = ANSITable()\ntable.addcolumn(\"col1\")\ntable.addcolumn(\"column 2 has a big header\")\ntable.addcolumn(\"column 3\")\n```\nwhere the keyword arguments to `.addcolumn()` are the same as those for\n`Column` and are given below.\n\n***\nWe can specify a [Python `format()` style format string](https://docs.python.org/3/library/string.html#formatspec) for any column - by default it\nis the general formatting option `\"{}\"`.\nYou may choose to left or right justify values via the format string, `ansitable` provides control over how those resulting strings are justified within the column.\n\n```python\ntable = ANSITable(\n Column(\"col1\"),\n Column(\"column 2 has a big header\", \"{:.3g}\"), # CHANGE\n Column(\"column 3\", \"{:-10.4f}\")\n )\ntable.row(\"aaaaaaaaa\", 2.2, 3)\ntable.row(\"bbbbbbbbbbbbb\", 5.5, 6)\ntable.row(\"ccccccc\", 8.8, 9)\ntable.print()\n```\nwhich yields\n\n```\n col1 column 2 has a big header column 3 \n aaaaaaaaa 2.2 3.0000 \nbbbbbbbbbbbbb 5.5 6.0000 \n ccccccc 8.8 9.0000 \n \n```\nAlternatively we can specify the format argument as a function that converts\nthe value to a string.\n\n\n***\nThe data in column 1 is quite long, we might wish to set a maximum column width which\nwe can do using the `width` argument\n\n```python\ntable = ANSITable(\n Column(\"col1\", width=10), # CHANGE\n Column(\"column 2 has a big header\", \"{:.3g}\"),\n Column(\"column 3\", \"{:-10.4f}\")\n )\ntable.row(\"aaaaaaaaa\", 2.2, 3)\ntable.row(\"bbbbbbbbbbbbb\", 5.5, 6)\ntable.row(\"ccccccc\", 8.8, 9)\ntable.print()\n```\nwhich yields\n\n\n```\n col1 column 2 has a big header column 3 \n aaaaaaaaa 2.2 3.0000 \nbbbbbbbbb\u2026 5.5 6.0000 \n ccccccc 8.8 9.0000 \n\n```\nwhere we see that the data in column 1 has been truncated.\n\nIf you don't like the ellipsis you can turn it off, and get to see one more\ncharacter, with the `ANSITable` option `ellipsis=False`. The Unicode ellipsis\ncharacter u+2026 is used.\n\n## Borders\nWe can add a table border made up of regular ASCII characters\n\n```python\ntable = ANSITable(\n Column(\"col1\"),\n Column(\"column 2 has a big header\"),\n Column(\"column 3\"),\n border=\"ascii\" # CHANGE\n )\ntable.row(\"aaaaaaaaa\", 2.2, 3)\ntable.row(\"bbbbbbbbbbbbb\", 5.5, 6)\ntable.row(\"ccccccc\", 8.8, 9)\ntable.print()\n```\nwhich yields\n\n```\n+--------------+---------------------------+----------+\n| col1 | column 2 has a big header | column 3 |\n+--------------+---------------------------+----------+\n| aaaaaaaaa | 2.2 | 3 |\n|bbbbbbbbbbbbb | 5.5 | 6 |\n| ccccccc | 8.8 | 9 |\n+--------------+---------------------------+----------+\n```\n***\nOr we can construct a border using the [ANSI box-drawing characters](https://en.wikipedia.org/wiki/Box-drawing_character) which are supported by most terminal\nemulators\n\n```python\ntable = ANSITable(\n Column(\"col1\"),\n Column(\"column 2 has a big header\"),\n Column(\"column 3\"),\n border=\"thick\" # CHANGE\n )\ntable.row(\"aaaaaaaaa\", 2.2, 3)\ntable.row(\"bbbbbbbbbbbbb\", 5.5, 6)\ntable.row(\"ccccccc\", 8.8, 9)\ntable.print()\n```\nwhich yields\n\n```\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 col1 \u2503 column 2 has a big header \u2503 column 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252b\n\u2503 aaaaaaaaa \u2503 2.2 \u2503 3 \u2503\n\u2503bbbbbbbbbbbbb \u2503 5.5 \u2503 6 \u2503\n\u2503 ccccccc \u2503 8.8 \u2503 9 \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251b\n```\n_Note: this actually looks better on the console than it does in GitHub markdown._\n\nOther border options include \"thin\", \"rounded\" (thin with round corners) and \"double\".\n\n## Header and column alignment\nWe can change the alignment of data and heading for any column with the alignment flags `\"<\"` (left), \n`\">\"` (right) and `\"^\"` (centered).\n\n```python\ntable = ANSITable(\n Column(\"col1\"),\n Column(\"column 2 has a big header\", colalign=\"^\"), # CHANGE\n Column(\"column 3\"),\n border=\"thick\"\n )\ntable.row(\"aaaaaaaaa\", 2.2, 3)\ntable.row(\"bbbbbbbbbbbbb\", 5.5, 6)\ntable.row(\"ccccccc\", 8.8, 9)\ntable.print()\n```\nwhich yields\n\n\n```\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 col1 \u2503 column 2 has a big header \u2503 column 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252b\n\u2503 aaaaaaaaa \u2503 2.2 \u2503 3 \u2503\n\u2503bbbbbbbbbbbbb \u2503 5.5 \u2503 6 \u2503\n\u2503 ccccccc \u2503 8.8 \u2503 9 \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251b\n```\nwhere the data for column 2 has been centered.\n***\nHeading and data alignment for any column can be set independently\n\n```python\ntable = ANSITable(\n Column(\"col1\", headalign=\"<\"), # CHANGE\n Column(\"column 2 has a big header\", colalign=\"^\"),\n Column(\"column 3\", colalign=\"<\"), # CHANGE\n border=\"thick\"\n )\ntable.row(\"aaaaaaaaa\", 2.2, 3)\ntable.row(\"bbbbbbbbbbbbb\", -5.5, 6)\ntable.row(\"ccccccc\", 8.8, -9)\ntable.print()\n```\nyields\n\n```\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 col1 \u2503 column 2 has a big header \u2503 column 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252b\n\u2503 aaaaaaaaa \u2503 2.2 \u2503 3 \u2503\n\u2503 bbbbbbbbbbbbb \u2503 -5.5 \u2503 6 \u2503\n\u2503 ccccccc \u2503 8.8 \u2503 -9 \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251b\n```\nwhere we have left-justified the heading for column 1 and the data for column 3.\n\nWe can easily add a dividing line\n```python\ntable = ANSITable(\n Column(\"col1\", headalign=\"<\"),\n Column(\"column 2 has a big header\", colalign=\"^\"),\n Column(\"column 3\", colalign=\"<\"),\n border=\"thick\"\n )\ntable.row(\"aaaaaaaaa\", 2.2, 3)\ntable.row(\"bbbbbbbbbbbbb\", -5.5, 6)\ntable.rule() # CHANGE\ntable.row(\"ccccccc\", 8.8, -9)\ntable.print()\n```\nyields\n\n```\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 col1 \u2503 column 2 has a big header \u2503 column 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252b\n\u2503 aaaaaaaaa \u2503 2.2 \u2503 3 \u2503\n\u2503 bbbbbbbbbbbbb \u2503 -5.5 \u2503 6 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252b\n\u2503 ccccccc \u2503 8.8 \u2503 -9 \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251b\n```\n\n\n## Color\nIf you have the `colored` package installed then you can set the foreground and\nbackground color and style (bold, reverse, underlined, dim) of the header and column data, as well as the border color.\n\n```python\ntable = ANSITable(\n Column(\"col1\", headalign=\"<\", colcolor=\"red\", headstyle=\"underlined\"), # CHANGE\n Column(\"column 2 has a big header\", colalign=\"^\", colstyle=\"bold\"), # CHANGE\n Column(\"column 3\", colalign=\"<\", colbgcolor=\"green\"), # CHANGE\n border=\"thick\", bordercolor=\"blue\" # CHANGE\n)\n\ntable.row(\"aaaaaaaaa\", 2.2, 3)\ntable.row(\"bbbbbbbbbbbbb\", -5.5, 6) # CHANGE\ntable.row(\"ccccccc\", 8.8, -9)\ntable.print()\n```\n\nwhich yields\n\n![colored table](https://github.com/petercorke/ansitable/raw/master/figs/colortable.png) \n\nIt is possible to the change the color of a single row of the table, overriding the column\ndefaults, by\n\n```python\n table.row(\"aaaaaaaaa\", 2.2, 3)\n table.row(\"bbbbbbbbbbbbb\", 5.5, 6)\n table.row(\"ccccccc\", 8.8, -9)\n```\n\nwhich yields\n\n![colored table](https://github.com/petercorke/ansitable/raw/master/figs/colortable2.png) \n\nIt is also possible to the change the color of a single cell of the table, overriding the column\nand row defaults, by passing a `Cell` instance\n\n```python\ntable = ANSITable(\"col1\", \"column 2 has a big header\", \"column 3\")\n table.row(\"aaaaaaaaa\", 2.2, 3)\n table.row(\"bbbbbbbbbbbbb\", Cell(-5.5, bgcolor=\"blue\"), 6, bgcolor=\"yellow\") # CHANGE\n table.row(\"ccccccc\", 8.8, 9)\n table.print()\n```\nwhich yields\n\n![colored table](https://github.com/petercorke/ansitable/raw/master/figs/colortable3.png) \n\nThe older method (deprecated) of doing this is by prefixing the value with a color enclosed in double angle brackets, for example `<<red>>`. This does not allow changing the background\ncolor or style of the cell.\n\n```python\ntable = ANSITable(\"col1\", \"column 2 has a big header\", \"column 3\")\n table.row(\"aaaaaaaaa\", 2.2, 3)\n table.row(\"<<red>>bbbbbbbbbbbbb\", 5.5, 6)\n table.row(\"<<blue>>ccccccc\", 8.8, 9)\n table.print()\n```\n\n## All options\n\n### ANSITable\nThese keyword arguments control the styling of the entire table.\n\n| Keyword | Default | Purpose |\n|---- |---- |---- |\ncolsep | 2 | Gap between columns (in spaces)\noffset | 0 | Gap at start of each row, shifts the table to the left\nborder | no border | Border style: 'ascii', 'thin', 'thick', 'double'\nbordercolor | |Border color, see [possible values](https://pypi.org/project/colored)\nellipsis | True | Add an ellipsis if a wide column is truncated\nheader | True | Include the column header row\ncolumns | | Specify the number of columns if `header=False` and no header name or `Column` arguments are given\ncolor | True | Enable color \n\n- Color is only possible if the `colored` package is installed\n- If `color` is False then no color escape sequences will be emitted, useful \n override for tables included in Sphinx documentation.\n\n### Column\nThese keyword arguments control the styling of a single column.\n\n| Keyword | Default | Purpose |\n|---- |---- |---- |\nfmt | `\"{}\"` | format string for the column value, or a callable that maps the column value to a string\nwidth || maximum column width, excess will be truncated\ncolcolor || Text color, see [possible values](https://pypi.org/project/colored)\ncolbgcolor || Text background color, see [possible values](https://pypi.org/project/colored)\ncolstyle || Text style: \"bold\", \"underlined\", \"reverse\", \"dim\", \"blink\"\ncolalign | `\">\"` | Text alignment: `\">\"` (left), `\"<\"` (right), `\"^\"` (centered)\nheadcolor || Heading text color, see [possible values](https://pypi.org/project/colored)\nheadbgcolor || Heading text background color, see [possible values](https://pypi.org/project/colored)\nheadstyle || Heading text style: \"bold\", \"underlined\", \"reverse\", \"dim\", \"blink\"\nheadalign | `\">\"` | Heading text alignment: `\">\"` (left), `\"<\"` (right), `\"^\"` (centered)\n\nNote that many terminal emulators do not support the \"blink\" style.\n\n### Row\nThese keyword arguments control the styling of a single row.\n\n| Keyword | Default | Purpose |\n|---- |---- |---- |\nfgcolor || Text color, see [possible values](https://pypi.org/project/colored)\nbgcolor || Text background color, see [possible values](https://pypi.org/project/colored)\nstyle || Text style: \"bold\", \"underlined\", \"reverse\", \"dim\", \"blink\"\n\nRow styling overrides column styling.\n\n### Cell\nThese keyword arguments control the styling of a single cell.\n\n| Keyword | Default | Purpose |\n|---- |---- |---- |\nfgcolor || Text color, see [possible values](https://pypi.org/project/colored)\nbgcolor || Text background color, see [possible values](https://pypi.org/project/colored)\nstyle || Text style: \"bold\", \"underlined\", \"reverse\", \"dim\", \"blink\"\n\nCell styling overrides row and column styling.\n\n\n## Render to markup language\n\nNow that you can visualize your data as a beautiful table on the console, you\nmight want the table in a different format to include in a\ndocument or website. ANSItable supports rendering a table into one of a number of common markup languages.\n\nWe start by creating a simple table\n\n```python\ntable = ANSITable(\"col1\", \"column 2 has a big header\", \"column 3\")\ntable.row(\"aaaaaaaaa\", 2.2, 3)\ntable.row(\"bbbbbbbbbbbbb\", -5.5, 6)\ntable.row(\"ccccccc\", 8.8, -9)\ntable.print()\n```\n\nSupport for alignment and color options depends on the capability of the markup language that is being exported to.\n\n\n### Markdown\n\nThe table can be rendered into Markdown format by\n\n```\ntable.markdown()\n```\nwhich generates\n```\n| col1 | column 2 has a big header | column 3 |\n| ------------: | ------------------------: | -------: |\n| aaaaaaaaa | 2.2 | 3 |\n| bbbbbbbbbbbbb | -5.5 | 6 |\n| ccccccc | 8.8 | -9 |\n```\n\nColumn alignment is supported, but MarkDown doesn't allow the header to have different alignment to the data.\n\n\n### HTML\n\nThe table can be rendered into Markdown format by\n\n```\ntable.html()\n```\nwhich generates\n\n```\n<table style=''>\n <tr style=''>\n <th style='text-align:right;'>col1</th>\n <th style='text-align:right;'>column 2 has a big header</th>\n <th style='text-align:right;'>column 3</th>\n </tr>\n <tr style=''>\n <td style='text-align:right;'>aaaaaaaaa</td>\n <td style='text-align:right;'>2.2</td>\n <td style='text-align:right;'>3</td>\n </tr>\n <tr style=''>\n <td style='text-align:right;'>bbbbbbbbbbbbb</td>\n <td style='text-align:right;'>-5.5</td>\n <td style='text-align:right;'>6</td>\n </tr>\n <tr style=''>\n <td style='text-align:right;'>ccccccc</td>\n <td style='text-align:right;'>8.8</td>\n <td style='text-align:right;'>-9</td>\n </tr>\n</table>\n```\nwhich renders as\n\n<table style=''>\n <tr style=''>\n <th style='text-align:right;'>col1</th>\n <th style='text-align:right;'>column 2 has a big header</th>\n <th style='text-align:right;'>column 3</th>\n </tr>\n <tr style=''>\n <td style='text-align:right;'>aaaaaaaaa</td>\n <td style='text-align:right;'>2.2</td>\n <td style='text-align:right;'>3</td>\n </tr>\n <tr style=''>\n <td style='text-align:right;'>bbbbbbbbbbbbb</td>\n <td style='text-align:right;'>-5.5</td>\n <td style='text-align:right;'>6</td>\n </tr>\n <tr style=''>\n <td style='text-align:right;'>ccccccc</td>\n <td style='text-align:right;'>8.8</td>\n <td style='text-align:right;'>-9</td>\n </tr>\n</table>\n\nCSS styling options can be applied to the table, rows and cells.\nThis format supports ANSItable header and column foreground and background color options.\n\n### ReStructedText\n\nThe table can be rendered into reStructedText (ReST) \"simple table\" format by\n\n```\ntable.rest()\n```\nwhich generates\n```\n============= ========================= ========\n col1 column 2 has a big header column 3\n============= ========================= ========\n aaaaaaaaa 2.2 3\nbbbbbbbbbbbbb -5.5 6\n ccccccc 8.8 -9\n============= ========================= ========\n```\n\nHeader and column alignment options are not supported in the ReST simple\ntable format.\n\n\n### LaTex\n\nThe table can be rendered into LaTeX format by\n\n```\ntable.latex()\n```\nwhich generates\n```\n\\begin{tabular}{ |r|r|r| }\\hline\n\\multicolumn{1}{|r|}{col1} & \\multicolumn{1}{|r|}{column 2 has a big header} & \\multicolumn{1}{|r|}{column 3}\\\\\\hline\\hline\naaaaaaaaa & 2.2 & 3 \\\\\nbbbbbbbbbbbbb & -5.5 & 6 \\\\\nccccccc & 8.8 & -9 \\\\\n\\hline\n\\end{tabular}\n```\n\nHeader and column alignment options are supported.\n\n### Wikitable\n\nThe table can be rendered into wikitable markup format, as used for tables in Wikipedia, by\n\n```\ntable.wikitable()\n```\nwhich generates\n```\n{| class=\"wikitable\" col1right col2right col3right\n|-\n! col1 !! column 2 has a big header !! column 3 \n|-\n| aaaaaaaaa || 2.2 || 3 \n|-\n| bbbbbbbbbbbbb || -5.5 || 6 \n|-\n| ccccccc || 8.8 || -9 \n|}\n```\n\nColumn alignment is supported, but wikitable headers are always centred.\n\n### CSV\n\nThe table can be rendered into CSV format by\n\n```\ntable.csv()\n```\nwhich generates\n```\ncol1,column 2 has a big header,column 3\naaaaaaaaa,2.2,3\nbbbbbbbbbbbbb,-5.5,6\nccccccc,8.8,-9\n```\n The delimiter character defaults to comma, but can be set. \n\nCSV format data can be quickly visualized on the desktop using any spreadsheet program,\nor included in ReST documentation using the `csv-table` directive.\n\n## Pandas integration\n\nPandas is THE tool to use for tabular data so we support conversions in both directions.\n\nTo convert a Pandas DataFrame to an ANSItable is just\n\n```\nimport pandas as pd\n\ndf = pd.DataFrame({\"calories\": [420, 380, 390], \"duration\": [50, 40, 45]})\ntable = ANSITable.Pandas(df, border=\"thin\")\ntable.print()\n\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 calories \u2502 duration \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 420 \u2502 50 \u2502\n\u2502 380 \u2502 40 \u2502\n\u2502 390 \u2502 45 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n``Pandas()`` is a static method that acts like a constructor. This is the simplest way to display CSV format data in an ANSItable by using Pandas ``read_csv()`` to load the data into a ``DataFrame``.\n\nTo export an ANSItable as a Pandas DataFrame is simply\n\n```\ntable = ANSITable(\"col1\", \"column 2 has a big header\", \"column 3\")\ntable.row(\"aaaaaaaaa\", 2.2, 3)\ntable.row(\"bbbbbbbbbbbbb\", -5.5, 6)\ntable.row(\"ccccccc\", 8.8, -9)\n\ndf = table.pandas()\nprint(df)\n\n col1 column_2_has_a_big_header column_3\n0 aaaaaaaaa 2.2 3\n1 bbbbbbbbbbbbb -5.5 6\n2 ccccccc 8.8 -9\n```\nNote that the column names have been modified, spaces changed to underscores, which\nallows the columns to be accessed as attributes:\n\n```\nprint(df.column_2_has_a_big_header.to_string())\n\n0 2.2\n1 -5.5\n2 8.8\n```\nwhich shows the column as a Pandas `Series` object. This column name-changing behaviour can be disabled by passing ``underscores=False``.\n\n\n# Matrices\n\nPainless creation of nice-looking matrices for Python.\n\n\nWe can create a formatter for NumPy arrays (1D or 2D)\n\n```python\nfrom ansitable import ANSIMatrix\nformatter = ANSIMatrix(style='thick')\n```\n\nand then use it to format a NumPy array\n\n```python\nm = np.random.rand(4,4) - 0.5\nm[0,0] = 1.23456e-14\nformatter.print(m)\n```\n\nyields\n\n```\n\u250f \u2513\n\u2503 0 -0.385 -0.106 0.296 \u2503\n\u2503 0.0432 0.339 0.119 -0.468 \u2503\n\u2503 0.405 -0.306 0.0165 -0.439 \u2503\n\u2503 0.203 0.4 -0.499 -0.487 \u2503\n\u2517 \u251b\n```\n\nwe can also add suffixes\n\n\n```python\nformatter.print(m, suffix_super='T', suffix_sub='3')\n```\n\nyields\n\n```\n\u250f \u2513T\n\u2503 0 -0.239 0.186 -0.414 \u2503\n\u2503 0.49 0.215 -0.0148 0.0529 \u2503\n\u2503 0.0473 0.0311 0.45 0.394 \u2503\n\u2503-0.192 0.193 -0.455 0.0302 \u2503\n\u2517 \u251b3\n```\n\nBy default output is printed to the console (stdout) but we can also:\n\n* provide a `file` option to `.print()` to allow writing to a specified output stream, the default is `stdout`.\n* obtain a multi-line string version of the entire table using the `.str()` method\ninstead of `.print()`.\n\nThe formatter takes additional arguments to control the numeric format and to \ncontrol the suppression of very small values.\n\n### ANSIMatrix\nThese keyword arguments control the overall styling and operation of the formatter.\n\n| Keyword | Default | Purpose |\n|---- |---- |---- |\nstyle | `\"thin\"` | `\"thin\"`, `\"round\"`, `\"thick\"`, `\"double\"`\nfmt | `\"{:< 10.3g}\"` | format for each element\nsquish | True | set small elements to zero\nsquishtol | 100 | elements less than `squishtol * eps` are set to zero\n\n### Formatter\nA formatter takes additional arguments to the styling for a particular call.\n\n| Keyword | Default | Purpose |\n|---- |---- |---- |\nsuffix_super | `\"\"` | superscript suffix text\nsuffix_sub | `\"\"` | subscript suffix text\n",
"bugtrack_url": null,
"license": null,
"summary": "Quick and easy display of tabular data and matrices with optional ANSI color and borders",
"version": "0.11.4",
"project_urls": {
"Bug Tracker": "https://github.com/petercorke/ansitable/issues",
"Documentation": "https://github.io/petercorke/ansitable",
"Homepage": "https://github.com/petercorke/ansitable",
"Source": "https://github.com/petercorke/ansitable"
},
"split_keywords": [
"table",
" table layout",
" table format",
" tabular",
" tabular layout",
" tabular format",
" pandas",
" ansi",
" ansi art",
" ansi box characters",
" color",
" ansi color",
" matrix display",
" csv",
" markdown table",
" html table",
" latex table",
" restructuredtext table",
" wikitable table"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "01a52de778ffea3cd422d746d294d75f55c840709c0e0ccc84998f59c98cf52b",
"md5": "fa0d28b482101e27d1f20550a8ce79fa",
"sha256": "592be469b0a4fe2341aba806b4c52c3a12f8614ecfa38f29cfd0c48dbeddb614"
},
"downloads": -1,
"filename": "ansitable-0.11.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "fa0d28b482101e27d1f20550a8ce79fa",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 19299,
"upload_time": "2024-12-07T23:04:25",
"upload_time_iso_8601": "2024-12-07T23:04:25.012922Z",
"url": "https://files.pythonhosted.org/packages/01/a5/2de778ffea3cd422d746d294d75f55c840709c0e0ccc84998f59c98cf52b/ansitable-0.11.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cd1dc91feb78afb9faf737f01071626c95d4242924585e600093ccd3af2acfc8",
"md5": "b393a2c65a283d249e99ea31ac07d02d",
"sha256": "5d48d756cf7f11395b6edbd8cfc609a82b0fd4115a8ea40a41f48cf91be6e0ed"
},
"downloads": -1,
"filename": "ansitable-0.11.4.tar.gz",
"has_sig": false,
"md5_digest": "b393a2c65a283d249e99ea31ac07d02d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 27218,
"upload_time": "2024-12-07T23:04:27",
"upload_time_iso_8601": "2024-12-07T23:04:27.173444Z",
"url": "https://files.pythonhosted.org/packages/cd/1d/c91feb78afb9faf737f01071626c95d4242924585e600093ccd3af2acfc8/ansitable-0.11.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-07 23:04:27",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "petercorke",
"github_project": "ansitable",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "ansitable"
}