table2string


Nametable2string JSON
Version 2.0.1 PyPI version JSON
download
home_pageNone
SummaryA library to convert tables to string with full support for line breaks and formatting
upload_time2024-09-30 00:22:16
maintainerNone
docs_urlNone
authorNone
requires_python>=3.7
licenseGPL2
keywords string table tools
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # table2string

[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/EgorKhabarov/table2string/tests.yml?style=flat&logo=GitHub&label=Tests)](https://github.com/EgorKhabarov/table2string/actions/workflows/tests.yml)
[![Publish Python Package to PyPI](https://img.shields.io/github/actions/workflow/status/EgorKhabarov/table2string/publish.yml?style=flat&logo=GitHub&label=Publish%20to%20PyPI)](https://github.com/EgorKhabarov/table2string/actions/workflows/publish.yml)

[![PyPi Package Version](https://img.shields.io/pypi/v/table2string.svg?style=flat&logo=pypi)](https://pypi.python.org/pypi/table2string)
[![Supported Python versions](https://img.shields.io/pypi/pyversions/table2string.svg?style=flat&logo=pypi)](https://pypi.python.org/pypi/table2string)
[![PyPi status](https://img.shields.io/pypi/status/table2string.svg?style=flat&logo=pypi)](https://pypi.python.org/pypi/table2string)
[![PyPi downloads](https://img.shields.io/pypi/dm/table2string.svg?style=flat&logo=pypi)](https://pypi.org/project/table2string/)

[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![mypy checked](https://img.shields.io/badge/mypy-checked-blue)](https://github.com/python/mypy)
[![Linting: Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)


## Convert table to string

While there are several libraries available for converting tables to strings in Python, none seemed to meet my specific requirements. 

- **Line Break Support**: Easily include line breaks within cells for enhanced readability.
- **Subtable Support**: Easily include a table within a table for a more flexible presentation.
- **Alignment**: Easily align text in a cell in any direction.
- **Emoji Integration**: Effortlessly incorporate emoji characters into your tables to add visual appeal and context.

---

# Install

## PyPI

```shell
pip install -U table2string
```

## GitHub

```shell
pip install -U git+https://github.com/EgorKhabarov/table2string.git@master
```

---

# Usage example

```pycon
>>> from table2string import Table, Themes, HorizontalAlignment, VerticalAlignment
>>> Table([("1", "2", "3"), ("qwe", "rty\nuio", "")], name="Table Name", column_names=("c1", "c2", "c3")).print()
+----------------+
|   Table Name   |
+-----+-----+----+
| c1  | c2  | c3 |
+-----+-----+----+
|   1 |   2 |  3 |
+-----+-----+----+
| qwe | rty |    |
|     | uio |    |
+-----+-----+----+
>>> from io import StringIO
>>> Table.from_csv(StringIO('c1,c2,c3\n1,2,3\nqwe,"rty\nuio",'), name="Table Name").print()
+----------------+
|   Table Name   |
+-----+-----+----+
| c1  | c2  | c3 |
+-----+-----+----+
|   1 |   2 |  3 |
+-----+-----+----+
| qwe | rty |    |
|     | uio |    |
+-----+-----+----+
>>> import sqlite3
>>> cursor = sqlite3.connect(":memory:").cursor().execute(
...     "CREATE TABLE data (c1 TEXT, c2 TEXT, c3 TEXT);"
... ).executemany(
...     "INSERT INTO data (c1, c2, c3) VALUES (?, ?, ?);",
...     [("1", "2", "3"), ("qwe", "rty\nuio", "")],
... ).execute(
...     "SELECT c1, c2, c3 FROM data;"
... )
>>> Table.from_db_cursor(
...     cursor,
...     name="Table Name",
...     column_names=True,
... ).print()
+----------------+
|   Table Name   |
+-----+-----+----+
| c1  | c2  | c3 |
+-----+-----+----+
|   1 |   2 |  3 |
+-----+-----+----+
| qwe | rty |    |
|     | uio |    |
+-----+-----+----+
>>> Table(
...     [("c1", Table([("1", "2"), ("3", "4")], name="SubTable"))],
...     name="Table Name",
... ).print(v_align=("-",), max_width=(2, 8))
+---------------+
|  Table Name   |
+----+----------+
|    | SubTable |
|    +-----+----+
| c1 |   1 |  2 |
|    +-----+----+
|    |   3 |  4 |
+----+-----+----+

```

## Arguments

| Argument                 | Type                                                                                              | Example                         | Description                                                                                                                                                 |
|:-------------------------|:--------------------------------------------------------------------------------------------------|:--------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `table`                  | `Sequence[Sequence[Any]]`                                                                         | `[("1", "2"), ("3", "4")]`      | A two-dimensional matrix                                                                                                                                    |
| `h_align`                | <code>tuple[HorizontalAlignment &#x7c; str, ...]</code> &#x7c; `HorizontalAlignment` &#x7c; `str` | `HorizontalAlignment.CENTER`    | Allows you to align text in a cell horizontally                                                                                                             |
| `v_align`                | <code>tuple[VerticalAlignment &#x7c; str, ...]</code> &#x7c; `VerticalAlignment` &#x7c; `str`     | `VerticalAlignment.MIDDLE`      | Allows you to align text in a cell vertically                                                                                                               |
| `name`                   | `str` &#x7c; `None`                                                                               | `"Table Name"`                  | Table name                                                                                                                                                  |
| `name_h_align`           | `HorizontalAlignment` &#x7c; `str`                                                                | `HorizontalAlignment.CENTER`    | Allows you to align table name horizontally                                                                                                                 |
| `name_v_align`           | `VerticalAlignment` &#x7c; `str`                                                                  | `VerticalAlignment.MIDDLE`      | Allows you to align table name vertically                                                                                                                   |
| `column_names`           | `Sequence[str]` &#x7c; `None`                                                                     | `("c1", "c2", ...column_count)` | Sets the names for the table columns                                                                                                                        |
| `column_names_h_align`   | <code>tuple[HorizontalAlignment &#x7c; str, ...]</code> &#x7c; `HorizontalAlignment` &#x7c; `str` | `HorizontalAlignment.CENTER`    | Allows you to align column names horizontally                                                                                                               |
| `column_names_v_align`   | <code>tuple[VerticalAlignment &#x7c; str, ...]</code> &#x7c; `VerticalAlignment` &#x7c; `str`     | `VerticalAlignment.MIDDLE`      | Allows you to align column names vertically                                                                                                                 |
| `max_width`              | `int` &#x7c; `Tuple[int, ...]` &#x7c; `None`                                                      | `120`                           | Allows you to set the width of the entire table or individually for each column                                                                             |
| `max_height`             | `int` &#x7c; `None`                                                                               | `10`                            | Specifies the maximum height for rows                                                                                                                       |
| `maximize_height`        | `bool`                                                                                            | `True`                          | Force height to be taken from max_height                                                                                                                    |
| `line_break_symbol`      | `str`                                                                                             | `"\\"`                          | Line break symbol                                                                                                                                           |
| `cell_break_symbol`      | `str`                                                                                             | `"…"`                           | Symbol indicating the end of text when there is not enough height                                                                                           |
| `sep`                    | `bool` &#x7c; `range` &#x7c; `tuple`                                                              | `(1, 3, 6)`                     | Handles the separators between table rows and can be either a boolean type or possess a `__contains__` method                                               |
| `end`                    | `str` &#x7c; `None`                                                                               | `"\n"`                          | Behaves the same as `print(end=)`                                                                                                                           |
| `file`                   | `TextIOWrapper` &#x7c; `None`                                                                     | `sys.stdout` or `io.StringIO()` | Behaves the same as `print(file=)`                                                                                                                          |
| `theme`                  | `Theme`                                                                                           | `Themes.rounded_thick`          | Allows you to set a specific theme for the table. For example, the border style                                                                             |
| `ignore_width_errors`    | `bool`                                                                                            | `False`                         | Fixes errors in max_width if they exist                                                                                                                     |
| `proportion_coefficient` | `float`                                                                                           | `0.5`                           | Affects the width distribution of the columns. A value of `0.0` corresponds to proportional distribution, `1.0` averages the values, and `2.0` inverts them |


## Text alignment

| Align                                     | Example           | Description                                                                                                                    |
|:------------------------------------------|:------------------|:-------------------------------------------------------------------------------------------------------------------------------|
| `"<align>"` or `("<align>",)`             | `"^"` or `("^",)` | Setting `align` (`"^"`) for all columns                                                                                        |
| `("<align_1>", "<align_2>")`              | `("^", "<")`      | Setting `align_1` (`"^"`) for the first column and `align_2` (`"<"`) for all other columns                                     |
| `("<align_1>", "<align_2>", "<align_3>")` | `("^", "<", ">")` | Setting `align_1` (`"^"`) for the first column and `align_2` (`"<"`) for the second and `align_3` (`">"`) for the third column |

You can also use the corresponding `HorizontalAlignment` or `VerticalAlignment` type

For `name_h_align` and `name_v_align` only the `str` type or the corresponding `HorizontalAlignment` or `VerticalAlignment` type is valid

### HorizontalAlignment

| Align                                      | Description                                                                                                                                          |
|:-------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------|
| `AUTO` or `AUTO_AUTO` or `*` or `**`       | Alignment depends on the type. If this is a number and there are no line breaks in this cell, then align to the right; otherwise, align to the left. |
| `LEFT` or `LEFT_LEFT` or `<` or `<<`       | All lines are left aligned                                                                                                                           |
| `CENTER` or `CENTER_CENTER` or `^` or `^^` | All lines are center aligned                                                                                                                         |
| `RIGHT` or `RIGHT_RIGHT` or `>` or `>>`    | All lines are right aligned                                                                                                                          |
| `LEFT_CENTER` or `<^`                      | The first line is left aligned and the remaining lines are centered                                                                                  |
| `LEFT_RIGHT` or `<>`                       | The first line is left aligned and the remaining lines are right aligned                                                                             |
| `CENTER_LEFT` or `^<`                      | The first line is aligned to the center, and the remaining lines are aligned to the left of the first line.                                          |
| `CENTER_RIGHT` or `^>`                     | The first line is aligned to the center, and the remaining lines are aligned to the right of the first line.                                         |
| `RIGHT_LEFT` or `><`                       | The first line is right aligned and the remaining lines are left aligned                                                                             |
| `RIGHT_CENTER` or `>^`                     | The first line is right aligned and the remaining lines are centered                                                                                 |

### VerticalAlignment

| Align           | Description             |
|:----------------|:------------------------|
| `TOP` or `^`    | Text are top aligned    |
| `MIDDLE` or `-` | Text are centered       |
| `BOTTOM` or `_` | Text are bottom aligned |


<details>
<summary>Example</summary>

```pycon
>>> from functools import partial
>>> sub_table_auto_func = partial(Table, [("123", "text",)], max_height=4, maximize_height=True)
>>> sub_table_func = partial(Table, [("first line\ntext",)], max_height=4, maximize_height=True)
>>> Table(
...     [
...         *(
...             [v_align, sub_table_auto_func(h_align="*", v_align=v_align)] + [
...                 sub_table_func(h_align=h_align, v_align=v_align)
...                 for h_align in ("<", ">", "^", "^<", "^>")
...             ]
...             for v_align in ("^", "-", "_")
...         )
...     ],
...     column_names=(" ", "*", "<", ">", "^", "^<", "^>"),
... ).print(max_width=(1, len("first line")+4), v_align=("-",))
+---+----------------+----------------+----------------+----------------+----------------+----------------+
|   |       *        |       <        |       >        |       ^        |       ^<       |       ^>       |
+---+-------+--------+----------------+----------------+----------------+----------------+----------------+
|   |   123 | text   | first line     |     first line |   first line   |   first line   |   first line   |
| ^ |       |        | text           |           text |      text      |   text         |         text   |
|   |       |        |                |                |                |                |                |
|   |       |        |                |                |                |                |                |
+---+-------+--------+----------------+----------------+----------------+----------------+----------------+
|   |       |        |                |                |                |                |                |
| - |   123 | text   | first line     |     first line |   first line   |   first line   |   first line   |
|   |       |        | text           |           text |      text      |   text         |         text   |
|   |       |        |                |                |                |                |                |
+---+-------+--------+----------------+----------------+----------------+----------------+----------------+
|   |       |        |                |                |                |                |                |
| _ |       |        |                |                |                |                |                |
|   |       |        | first line     |     first line |   first line   |   first line   |   first line   |
|   |   123 | text   | text           |           text |      text      |   text         |         text   |
+---+-------+--------+----------------+----------------+----------------+----------------+----------------+

```
</details>

## Custom width and height settings

| Width                               | Example        | Description                                                                                                                 |
|-------------------------------------|----------------|-----------------------------------------------------------------------------------------------------------------------------|
| `<width>`                           | `10`           | Setting `width` (`10`) for the whole table                                                                                  |
| `(<width>,)`                        | `(10,)`        | Setting `width_1` (`10`) for all column                                                                                     |
| `(<width_1>, <width_2>)`            | `(10, 20)`     | Setting `width_1` (`10`) for the first column and `width_2` (`20`) for all other columns                                    |
| `(<width_1>, <width_2>, <width_3>)` | `(10, 20, 30)` | Setting `width_1` (`10`) for the first column and `width_2` (`20`) for the second and `width_3` (`30`) for the third column |

<details>
<summary>Example</summary>

```pycon
>>> # Width of the entire table with borders
>>> Table([(1, 12345, "example")]).print(max_width=30)
+-----+----------+-----------+
|   1 |    12345 | example   |
+-----+----------+-----------+
>>> # Width of each column individually
>>> Table([(1, 12345, "example")]).print(max_width=(10,))
+------------+------------+------------+
|          1 |      12345 | example    |
+------------+------------+------------+
>>> Table([(1, 12345, "example")]).print(max_width=(1, 8, 6))
+---+----------+--------+
| 1 |    12345 | exampl\|
|   |          | e      |
+---+----------+--------+
>>> Table([(1, 12345, "example")]).print(max_width=(1, 5, 7))
+---+-------+---------+
| 1 | 12345 | example |
+---+-------+---------+
>>> Table([("123456\n\n789000", "example")]).print(max_width=(3, 4), max_height=4)
+-----+------+
| 123\| exam\|
| 456 | ple  |
|     |      |
| 789…|      |
+-----+------+
>>> Table([("123456789",)]).print(max_width=(1,), max_height=1)
+---+
| 1…|
+---+
>>> Table([("123\n456\n789",)]).print(
...     max_width=(3,),
...     max_height=4,
...     maximize_height=True,
... )
+-----+
| 123 |
| 456 |
| 789 |
|     |
+-----+
>>> Table([("123456789",)]).print(
...     max_width=(3,),
...     max_height=4,
...     maximize_height=True,
... )
+-----+
| 123\|
| 456\|
| 789 |
|     |
+-----+

```
</details>

## Separator settings

| Separator              | Description                                |
|------------------------|--------------------------------------------|
| `sep=True`             | All horizontal dividers included           |
| `sep=False`            | All horizontal dividers are disabled       |
| `sep=(1,)`             | Only first delimiter                       |
| `sep=(1, 3, 5)`        | Only first third and fifth separator       |
| `sep=range(1, 100, 5)` | Delimiter every five lines first 100 lines |

<details>
<summary>Example</summary>

```pycon
>>> table_1 = Table([("qwe", "rty\nuio"), ("123456\n\n789000", "example")])
>>> kwargs = {
...     "max_width": (3, 4),
...     "max_height": 4,
... }
>>> table_1.print(**kwargs, sep=True)
+-----+------+
| qwe | rty  |
|     | uio  |
+-----+------+
| 123\| exam\|
| 456 | ple  |
|     |      |
| 789…|      |
+-----+------+
>>> table_1.print(**kwargs, sep=False)
+-----+------+
| qwe | rty  |
|     | uio  |
| 123\| exam\|
| 456 | ple  |
|     |      |
| 789…|      |
+-----+------+
>>> table_2 = Table([("1", "2"), ("3", "4")], name="Name")
>>> table_2.print(sep=True)
+-------+
| Name  |
+---+---+
| 1 | 2 |
+---+---+
| 3 | 4 |
+---+---+
>>> table_2.print(sep=False)
+-------+
| Name  |
+---+---+
| 1 | 2 |
| 3 | 4 |
+---+---+
>>> table_3 = Table([("1", "2"), ("3", "4"), ("5", "6"), ("7", "8")])
>>> table_3.print(sep=(1,))
+---+---+
| 1 | 2 |
+---+---+
| 3 | 4 |
| 5 | 6 |
| 7 | 8 |
+---+---+
>>> table_3.print(sep=(2,))
+---+---+
| 1 | 2 |
| 3 | 4 |
+---+---+
| 5 | 6 |
| 7 | 8 |
+---+---+
>>> table_3.print(sep=(1, 3))
+---+---+
| 1 | 2 |
+---+---+
| 3 | 4 |
| 5 | 6 |
+---+---+
| 7 | 8 |
+---+---+
>>> table_4 = Table([("1", "2"), ("3", "4"), ("5", "6"), ("7", "8")], name="Name")
>>> table_4.print(sep=(1,))
+-------+
| Name  |
+---+---+
| 1 | 2 |
+---+---+
| 3 | 4 |
| 5 | 6 |
| 7 | 8 |
+---+---+
>>> table_4.print(sep=(2,))
+-------+
| Name  |
+---+---+
| 1 | 2 |
| 3 | 4 |
+---+---+
| 5 | 6 |
| 7 | 8 |
+---+---+
>>> table_4.print(sep=(1, 3))
+-------+
| Name  |
+---+---+
| 1 | 2 |
+---+---+
| 3 | 4 |
| 5 | 6 |
+---+---+
| 7 | 8 |
+---+---+

```
</details>

## Themes

### Borders

<details>
<summary>Border types</summary>

```pycon
>>> from table2string import Themes, HorizontalAlignment
>>> table = []
>>> example_table = Table([(" ", " "), (" ", " "), (" ", " ")])
>>> theme_names = (
...     ("ascii_thin", "ascii_thin_double"),
...     ("ascii_double", "ascii_double_thin"),
...     ("thin", "thin_thick"),
...     ("thin_double", "rounded_double"),
...     ("rounded", "rounded_thick"),
...     ("thick", "thick_thin"),
...     ("double", "double_thin"),
...     ("booktabs", "ascii_booktabs"),
...     ("markdown", "None"),
... )
>>> for names in theme_names:
...     table.append([])
...     for name in names:
...         string_table = example_table.stringify(
...             theme=getattr(Themes, name, Themes.ascii_thin)
...         )
...         table[-1].append(f"{name}\n{string_table}")
>>> Table(table).print(theme=Themes.thin, h_align=HorizontalAlignment.CENTER)
┌──────────────┬───────────────────┐
│  ascii_thin  │ ascii_thin_double │
│  +---+---+   │     +---+---+     │
│  |   |   |   │     |   |   |     │
│  +---+---+   │     +===+===+     │
│  |   |   |   │     |   |   |     │
│  +---+---+   │     +---+---+     │
│  |   |   |   │     |   |   |     │
│  +---+---+   │     +---+---+     │
├──────────────┼───────────────────┤
│ ascii_double │ ascii_double_thin │
│  +===+===+   │     +===+===+     │
│  ‖   ‖   ‖   │     ‖   ‖   ‖     │
│  +===+===+   │     +---+---+     │
│  ‖   ‖   ‖   │     ‖   ‖   ‖     │
│  +===+===+   │     +===+===+     │
│  ‖   ‖   ‖   │     ‖   ‖   ‖     │
│  +===+===+   │     +===+===+     │
├──────────────┼───────────────────┤
│     thin     │    thin_thick     │
│  ┌───┬───┐   │     ┌───┬───┐     │
│  │   │   │   │     │   │   │     │
│  ├───┼───┤   │     ┝━━━┿━━━┥     │
│  │   │   │   │     │   │   │     │
│  ├───┼───┤   │     ├───┼───┤     │
│  │   │   │   │     │   │   │     │
│  └───┴───┘   │     └───┴───┘     │
├──────────────┼───────────────────┤
│ thin_double  │  rounded_double   │
│  ┌───┬───┐   │     ╭───┬───╮     │
│  │   │   │   │     │   │   │     │
│  ╞═══╪═══╡   │     ╞═══╪═══╡     │
│  │   │   │   │     │   │   │     │
│  ├───┼───┤   │     ├───┼───┤     │
│  │   │   │   │     │   │   │     │
│  └───┴───┘   │     ╰───┴───╯     │
├──────────────┼───────────────────┤
│   rounded    │   rounded_thick   │
│  ╭───┬───╮   │     ╭───┬───╮     │
│  │   │   │   │     │   │   │     │
│  ├───┼───┤   │     ┝━━━┿━━━┥     │
│  │   │   │   │     │   │   │     │
│  ├───┼───┤   │     ├───┼───┤     │
│  │   │   │   │     │   │   │     │
│  ╰───┴───╯   │     ╰───┴───╯     │
├──────────────┼───────────────────┤
│    thick     │    thick_thin     │
│  ┏━━━┳━━━┓   │     ┏━━━┳━━━┓     │
│  ┃   ┃   ┃   │     ┃   ┃   ┃     │
│  ┣━━━╋━━━┫   │     ┠───╂───┨     │
│  ┃   ┃   ┃   │     ┃   ┃   ┃     │
│  ┣━━━╋━━━┫   │     ┣━━━╋━━━┫     │
│  ┃   ┃   ┃   │     ┃   ┃   ┃     │
│  ┗━━━┻━━━┛   │     ┗━━━┻━━━┛     │
├──────────────┼───────────────────┤
│    double    │    double_thin    │
│  ╔═══╦═══╗   │     ╔═══╦═══╗     │
│  ║   ║   ║   │     ║   ║   ║     │
│  ╠═══╬═══╣   │     ╟───╫───╢     │
│  ║   ║   ║   │     ║   ║   ║     │
│  ╠═══╬═══╣   │     ╠═══╬═══╣     │
│  ║   ║   ║   │     ║   ║   ║     │
│  ╚═══╩═══╝   │     ╚═══╩═══╝     │
├──────────────┼───────────────────┤
│   booktabs   │  ascii_booktabs   │
│   ───────    │      -------      │
│              │                   │
│   ━━━━━━━    │      =======      │
│              │                   │
│   ───────    │      -------      │
│              │                   │
│   ───────    │      -------      │
├──────────────┼───────────────────┤
│   markdown   │       None        │
│  |   |   |   │     +---+---+     │
│  |---|---|   │     |   |   |     │
│  |   |   |   │     +---+---+     │
│  |   |   |   │     |   |   |     │
│              │     +---+---+     │
│              │     |   |   |     │
│              │     +---+---+     │
└──────────────┴───────────────────┘

```
</details>

<details>
<summary>Example</summary>

```pycon
>>> from table2string import Table, Themes
>>> name = "Table Name"
>>> column_names = ("c1", "c2", "3")
>>> table = [("1", "2", "3"), ("qwe", "rty\nuio", "")]
>>> t = Table(table)
>>> t_name = Table(table, name=name)
>>> t_column_names = Table(table, column_names=column_names)
>>> t_name_column_names = Table(table, name=name, column_names=column_names)

```

<details>
<summary>Themes.ascii_thin</summary>

```pycon

>>> t.print(theme=Themes.ascii_thin)
+-----+-----+---+
|   1 |   2 | 3 |
+-----+-----+---+
| qwe | rty |   |
|     | uio |   |
+-----+-----+---+
>>> t_column_names.print(theme=Themes.ascii_thin)
+-----+-----+---+
| c1  | c2  | 3 |
+-----+-----+---+
|   1 |   2 | 3 |
+-----+-----+---+
| qwe | rty |   |
|     | uio |   |
+-----+-----+---+
>>> t_name.print(theme=Themes.ascii_thin)
+---------------+
|  Table Name   |
+-----+-----+---+
|   1 |   2 | 3 |
+-----+-----+---+
| qwe | rty |   |
|     | uio |   |
+-----+-----+---+
>>> t_name_column_names.print(theme=Themes.ascii_thin)
+---------------+
|  Table Name   |
+-----+-----+---+
| c1  | c2  | 3 |
+-----+-----+---+
|   1 |   2 | 3 |
+-----+-----+---+
| qwe | rty |   |
|     | uio |   |
+-----+-----+---+

```
</details>


<details>
<summary>Themes.ascii_thin_double</summary>

```pycon
>>> t.print(theme=Themes.ascii_thin_double)
+-----+-----+---+
|   1 |   2 | 3 |
+=====+=====+===+
| qwe | rty |   |
|     | uio |   |
+-----+-----+---+
>>> t_column_names.print(theme=Themes.ascii_thin_double)
+-----+-----+---+
| c1  | c2  | 3 |
+=====+=====+===+
|   1 |   2 | 3 |
+-----+-----+---+
| qwe | rty |   |
|     | uio |   |
+-----+-----+---+
>>> t_name.print(theme=Themes.ascii_thin_double)
+---------------+
|  Table Name   |
+-----+-----+---+
|   1 |   2 | 3 |
+=====+=====+===+
| qwe | rty |   |
|     | uio |   |
+-----+-----+---+
>>> t_name_column_names.print(theme=Themes.ascii_thin_double)
+---------------+
|  Table Name   |
+-----+-----+---+
| c1  | c2  | 3 |
+=====+=====+===+
|   1 |   2 | 3 |
+-----+-----+---+
| qwe | rty |   |
|     | uio |   |
+-----+-----+---+

```
</details>


<details>
<summary>Themes.ascii_double</summary>

```pycon
>>> t.print(theme=Themes.ascii_double)
+=====+=====+===+
‖   1 ‖   2 ‖ 3 ‖
+=====+=====+===+
‖ qwe ‖ rty ‖   ‖
‖     ‖ uio ‖   ‖
+=====+=====+===+
>>> t_column_names.print(theme=Themes.ascii_double)
+=====+=====+===+
‖ c1  ‖ c2  ‖ 3 ‖
+=====+=====+===+
‖   1 ‖   2 ‖ 3 ‖
+=====+=====+===+
‖ qwe ‖ rty ‖   ‖
‖     ‖ uio ‖   ‖
+=====+=====+===+
>>> t_name.print(theme=Themes.ascii_double)
+===============+
‖  Table Name   ‖
+=====+=====+===+
‖   1 ‖   2 ‖ 3 ‖
+=====+=====+===+
‖ qwe ‖ rty ‖   ‖
‖     ‖ uio ‖   ‖
+=====+=====+===+
>>> t_name_column_names.print(theme=Themes.ascii_double)
+===============+
‖  Table Name   ‖
+=====+=====+===+
‖ c1  ‖ c2  ‖ 3 ‖
+=====+=====+===+
‖   1 ‖   2 ‖ 3 ‖
+=====+=====+===+
‖ qwe ‖ rty ‖   ‖
‖     ‖ uio ‖   ‖
+=====+=====+===+

```
</details>


<details>
<summary>Themes.ascii_double_thin</summary>

```pycon
>>> t.print(theme=Themes.ascii_double_thin)
+=====+=====+===+
‖   1 ‖   2 ‖ 3 ‖
+-----+-----+---+
‖ qwe ‖ rty ‖   ‖
‖     ‖ uio ‖   ‖
+=====+=====+===+
>>> t_column_names.print(theme=Themes.ascii_double_thin)
+=====+=====+===+
‖ c1  ‖ c2  ‖ 3 ‖
+-----+-----+---+
‖   1 ‖   2 ‖ 3 ‖
+=====+=====+===+
‖ qwe ‖ rty ‖   ‖
‖     ‖ uio ‖   ‖
+=====+=====+===+
>>> t_name.print(theme=Themes.ascii_double_thin)
+===============+
‖  Table Name   ‖
+=====+=====+===+
‖   1 ‖   2 ‖ 3 ‖
+-----+-----+---+
‖ qwe ‖ rty ‖   ‖
‖     ‖ uio ‖   ‖
+=====+=====+===+
>>> t_name_column_names.print(theme=Themes.ascii_double_thin)
+===============+
‖  Table Name   ‖
+=====+=====+===+
‖ c1  ‖ c2  ‖ 3 ‖
+-----+-----+---+
‖   1 ‖   2 ‖ 3 ‖
+=====+=====+===+
‖ qwe ‖ rty ‖   ‖
‖     ‖ uio ‖   ‖
+=====+=====+===+

```
</details>


<details>
<summary>Themes.ascii_booktabs</summary>

```pycon
>>> t.print(theme=Themes.ascii_booktabs)
 --------------- 
    1     2   3  
 =============== 
  qwe   rty      
        uio      
 --------------- 
>>> t_column_names.print(theme=Themes.ascii_booktabs)
 --------------- 
  c1    c2    3  
 =============== 
    1     2   3  
 --------------- 
  qwe   rty      
        uio      
 --------------- 
>>> t_name.print(theme=Themes.ascii_booktabs)
 --------------- 
   Table Name    
 --------------- 
    1     2   3  
 =============== 
  qwe   rty      
        uio      
 --------------- 
>>> t_name_column_names.print(theme=Themes.ascii_booktabs)
 --------------- 
   Table Name    
 --------------- 
  c1    c2    3  
 =============== 
    1     2   3  
 --------------- 
  qwe   rty      
        uio      
 --------------- 

```
</details>


<details>
<summary>Themes.thin</summary>

```pycon
>>> t.print(theme=Themes.thin)
┌─────┬─────┬───┐
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
└─────┴─────┴───┘
>>> t_column_names.print(theme=Themes.thin)
┌─────┬─────┬───┐
│ c1  │ c2  │ 3 │
├─────┼─────┼───┤
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
└─────┴─────┴───┘
>>> t_name.print(theme=Themes.thin)
┌───────────────┐
│  Table Name   │
├─────┬─────┬───┤
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
└─────┴─────┴───┘
>>> t_name_column_names.print(theme=Themes.thin)
┌───────────────┐
│  Table Name   │
├─────┬─────┬───┤
│ c1  │ c2  │ 3 │
├─────┼─────┼───┤
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
└─────┴─────┴───┘

```
</details>


<details>
<summary>Themes.thin_thick</summary>

```pycon
>>> t.print(theme=Themes.thin_thick)
┌─────┬─────┬───┐
│   1 │   2 │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│ qwe │ rty │   │
│     │ uio │   │
└─────┴─────┴───┘
>>> t_column_names.print(theme=Themes.thin_thick)
┌─────┬─────┬───┐
│ c1  │ c2  │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
└─────┴─────┴───┘
>>> t_name.print(theme=Themes.thin_thick)
┌───────────────┐
│  Table Name   │
├─────┬─────┬───┤
│   1 │   2 │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│ qwe │ rty │   │
│     │ uio │   │
└─────┴─────┴───┘
>>> t_name_column_names.print(theme=Themes.thin_thick)
┌───────────────┐
│  Table Name   │
├─────┬─────┬───┤
│ c1  │ c2  │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
└─────┴─────┴───┘

```
</details>


<details>
<summary>Themes.thin_double</summary>

```pycon
>>> t.print(theme=Themes.thin_double)
┌─────┬─────┬───┐
│   1 │   2 │ 3 │
╞═════╪═════╪═══╡
│ qwe │ rty │   │
│     │ uio │   │
└─────┴─────┴───┘
>>> t_column_names.print(theme=Themes.thin_double)
┌─────┬─────┬───┐
│ c1  │ c2  │ 3 │
╞═════╪═════╪═══╡
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
└─────┴─────┴───┘
>>> t_name.print(theme=Themes.thin_double)
┌───────────────┐
│  Table Name   │
├─────┬─────┬───┤
│   1 │   2 │ 3 │
╞═════╪═════╪═══╡
│ qwe │ rty │   │
│     │ uio │   │
└─────┴─────┴───┘
>>> t_name_column_names.print(theme=Themes.thin_double)
┌───────────────┐
│  Table Name   │
├─────┬─────┬───┤
│ c1  │ c2  │ 3 │
╞═════╪═════╪═══╡
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
└─────┴─────┴───┘

```
</details>


<details>
<summary>Themes.rounded</summary>

```pycon
>>> t.print(theme=Themes.rounded)
╭─────┬─────┬───╮
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
╰─────┴─────┴───╯
>>> t_column_names.print(theme=Themes.rounded)
╭─────┬─────┬───╮
│ c1  │ c2  │ 3 │
├─────┼─────┼───┤
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
╰─────┴─────┴───╯
>>> t_name.print(theme=Themes.rounded)
╭───────────────╮
│  Table Name   │
├─────┬─────┬───┤
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
╰─────┴─────┴───╯
>>> t_name_column_names.print(theme=Themes.rounded)
╭───────────────╮
│  Table Name   │
├─────┬─────┬───┤
│ c1  │ c2  │ 3 │
├─────┼─────┼───┤
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
╰─────┴─────┴───╯

```
</details>


<details>
<summary>Themes.rounded_thick</summary>

```pycon
>>> t.print(theme=Themes.rounded_thick)
╭─────┬─────┬───╮
│   1 │   2 │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│ qwe │ rty │   │
│     │ uio │   │
╰─────┴─────┴───╯
>>> t_column_names.print(theme=Themes.rounded_thick)
╭─────┬─────┬───╮
│ c1  │ c2  │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
╰─────┴─────┴───╯
>>> t_name.print(theme=Themes.rounded_thick)
╭───────────────╮
│  Table Name   │
├─────┬─────┬───┤
│   1 │   2 │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│ qwe │ rty │   │
│     │ uio │   │
╰─────┴─────┴───╯
>>> t_name_column_names.print(theme=Themes.rounded_thick)
╭───────────────╮
│  Table Name   │
├─────┬─────┬───┤
│ c1  │ c2  │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
╰─────┴─────┴───╯

```
</details>


<details>
<summary>Themes.rounded_double</summary>

```pycon
>>> t.print(theme=Themes.rounded_double)
╭─────┬─────┬───╮
│   1 │   2 │ 3 │
╞═════╪═════╪═══╡
│ qwe │ rty │   │
│     │ uio │   │
╰─────┴─────┴───╯
>>> t_column_names.print(theme=Themes.rounded_double)
╭─────┬─────┬───╮
│ c1  │ c2  │ 3 │
╞═════╪═════╪═══╡
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
╰─────┴─────┴───╯
>>> t_name.print(theme=Themes.rounded_double)
╭───────────────╮
│  Table Name   │
├─────┬─────┬───┤
│   1 │   2 │ 3 │
╞═════╪═════╪═══╡
│ qwe │ rty │   │
│     │ uio │   │
╰─────┴─────┴───╯
>>> t_name_column_names.print(theme=Themes.rounded_double)
╭───────────────╮
│  Table Name   │
├─────┬─────┬───┤
│ c1  │ c2  │ 3 │
╞═════╪═════╪═══╡
│   1 │   2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │   │
│     │ uio │   │
╰─────┴─────┴───╯

```
</details>


<details>
<summary>Themes.thick</summary>

```pycon
>>> t.print(theme=Themes.thick)
┏━━━━━┳━━━━━┳━━━┓
┃   1 ┃   2 ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃ qwe ┃ rty ┃   ┃
┃     ┃ uio ┃   ┃
┗━━━━━┻━━━━━┻━━━┛
>>> t_column_names.print(theme=Themes.thick)
┏━━━━━┳━━━━━┳━━━┓
┃ c1  ┃ c2  ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃   1 ┃   2 ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃ qwe ┃ rty ┃   ┃
┃     ┃ uio ┃   ┃
┗━━━━━┻━━━━━┻━━━┛
>>> t_name.print(theme=Themes.thick)
┏━━━━━━━━━━━━━━━┓
┃  Table Name   ┃
┣━━━━━┳━━━━━┳━━━┫
┃   1 ┃   2 ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃ qwe ┃ rty ┃   ┃
┃     ┃ uio ┃   ┃
┗━━━━━┻━━━━━┻━━━┛
>>> t_name_column_names.print(theme=Themes.thick)
┏━━━━━━━━━━━━━━━┓
┃  Table Name   ┃
┣━━━━━┳━━━━━┳━━━┫
┃ c1  ┃ c2  ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃   1 ┃   2 ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃ qwe ┃ rty ┃   ┃
┃     ┃ uio ┃   ┃
┗━━━━━┻━━━━━┻━━━┛

```
</details>


<details>
<summary>Themes.thick_thin</summary>

```pycon
>>> t.print(theme=Themes.thick_thin)
┏━━━━━┳━━━━━┳━━━┓
┃   1 ┃   2 ┃ 3 ┃
┠─────╂─────╂───┨
┃ qwe ┃ rty ┃   ┃
┃     ┃ uio ┃   ┃
┗━━━━━┻━━━━━┻━━━┛
>>> t_column_names.print(theme=Themes.thick_thin)
┏━━━━━┳━━━━━┳━━━┓
┃ c1  ┃ c2  ┃ 3 ┃
┠─────╂─────╂───┨
┃   1 ┃   2 ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃ qwe ┃ rty ┃   ┃
┃     ┃ uio ┃   ┃
┗━━━━━┻━━━━━┻━━━┛
>>> t_name.print(theme=Themes.thick_thin)
┏━━━━━━━━━━━━━━━┓
┃  Table Name   ┃
┣━━━━━┳━━━━━┳━━━┫
┃   1 ┃   2 ┃ 3 ┃
┠─────╂─────╂───┨
┃ qwe ┃ rty ┃   ┃
┃     ┃ uio ┃   ┃
┗━━━━━┻━━━━━┻━━━┛
>>> t_name_column_names.print(theme=Themes.thick_thin)
┏━━━━━━━━━━━━━━━┓
┃  Table Name   ┃
┣━━━━━┳━━━━━┳━━━┫
┃ c1  ┃ c2  ┃ 3 ┃
┠─────╂─────╂───┨
┃   1 ┃   2 ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃ qwe ┃ rty ┃   ┃
┃     ┃ uio ┃   ┃
┗━━━━━┻━━━━━┻━━━┛

```
</details>


<details>
<summary>Themes.double</summary>

```pycon
>>> t.print(theme=Themes.double)
╔═════╦═════╦═══╗
║   1 ║   2 ║ 3 ║
╠═════╬═════╬═══╣
║ qwe ║ rty ║   ║
║     ║ uio ║   ║
╚═════╩═════╩═══╝
>>> t_column_names.print(theme=Themes.double)
╔═════╦═════╦═══╗
║ c1  ║ c2  ║ 3 ║
╠═════╬═════╬═══╣
║   1 ║   2 ║ 3 ║
╠═════╬═════╬═══╣
║ qwe ║ rty ║   ║
║     ║ uio ║   ║
╚═════╩═════╩═══╝
>>> t_name.print(theme=Themes.double)
╔═══════════════╗
║  Table Name   ║
╠═════╦═════╦═══╣
║   1 ║   2 ║ 3 ║
╠═════╬═════╬═══╣
║ qwe ║ rty ║   ║
║     ║ uio ║   ║
╚═════╩═════╩═══╝
>>> t_name_column_names.print(theme=Themes.double)
╔═══════════════╗
║  Table Name   ║
╠═════╦═════╦═══╣
║ c1  ║ c2  ║ 3 ║
╠═════╬═════╬═══╣
║   1 ║   2 ║ 3 ║
╠═════╬═════╬═══╣
║ qwe ║ rty ║   ║
║     ║ uio ║   ║
╚═════╩═════╩═══╝

```
</details>


<details>
<summary>Themes.double_thin</summary>

```pycon
>>> t.print(theme=Themes.double_thin)
╔═════╦═════╦═══╗
║   1 ║   2 ║ 3 ║
╟─────╫─────╫───╢
║ qwe ║ rty ║   ║
║     ║ uio ║   ║
╚═════╩═════╩═══╝
>>> t_column_names.print(theme=Themes.double_thin)
╔═════╦═════╦═══╗
║ c1  ║ c2  ║ 3 ║
╟─────╫─────╫───╢
║   1 ║   2 ║ 3 ║
╠═════╬═════╬═══╣
║ qwe ║ rty ║   ║
║     ║ uio ║   ║
╚═════╩═════╩═══╝
>>> t_name.print(theme=Themes.double_thin)
╔═══════════════╗
║  Table Name   ║
╠═════╦═════╦═══╣
║   1 ║   2 ║ 3 ║
╟─────╫─────╫───╢
║ qwe ║ rty ║   ║
║     ║ uio ║   ║
╚═════╩═════╩═══╝
>>> t_name_column_names.print(theme=Themes.double_thin)
╔═══════════════╗
║  Table Name   ║
╠═════╦═════╦═══╣
║ c1  ║ c2  ║ 3 ║
╟─────╫─────╫───╢
║   1 ║   2 ║ 3 ║
╠═════╬═════╬═══╣
║ qwe ║ rty ║   ║
║     ║ uio ║   ║
╚═════╩═════╩═══╝

```
</details>


<details>
<summary>Themes.booktabs</summary>

```pycon
>>> t.print(theme=Themes.booktabs)
 ─────────────── 
    1     2   3  
 ━━━━━━━━━━━━━━━ 
  qwe   rty      
        uio      
 ─────────────── 
>>> t_column_names.print(theme=Themes.booktabs)
 ─────────────── 
  c1    c2    3  
 ━━━━━━━━━━━━━━━ 
    1     2   3  
 ─────────────── 
  qwe   rty      
        uio      
 ─────────────── 
>>> t_name.print(theme=Themes.booktabs)
 ─────────────── 
   Table Name    
 ─────────────── 
    1     2   3  
 ━━━━━━━━━━━━━━━ 
  qwe   rty      
        uio      
 ─────────────── 
>>> t_name_column_names.print(theme=Themes.booktabs)
 ─────────────── 
   Table Name    
 ─────────────── 
  c1    c2    3  
 ━━━━━━━━━━━━━━━ 
    1     2   3  
 ─────────────── 
  qwe   rty      
        uio      
 ─────────────── 

```
</details>


<details>
<summary>Themes.markdown</summary>

```pycon
>>> t.print(theme=Themes.markdown)
|   1 |   2 | 3 |
|-----|-----|---|
| qwe | rty |   |
|     | uio |   |
>>> t_column_names.print(theme=Themes.markdown)
| c1  | c2  | 3 |
|-----|-----|---|
|   1 |   2 | 3 |
| qwe | rty |   |
|     | uio |   |
>>> t_name.print(theme=Themes.markdown)
|  Table Name   |
|   1 |   2 | 3 |
|-----|-----|---|
| qwe | rty |   |
|     | uio |   |
>>> t_name_column_names.print(theme=Themes.markdown)
|  Table Name   |
| c1  | c2  | 3 |
|-----|-----|---|
|   1 |   2 | 3 |
| qwe | rty |   |
|     | uio |   |

```
</details>
</details>

## Emojis

<details>
<summary>Example</summary>

```python
from prettytable import PrettyTable
from table2string import Table

names = ("plain text", "emoji")
table = [
    (
        "text\ntext",
        "👨‍👩‍👧‍👦👨‍👩‍👦‍👦👨‍👩‍👧‍👧\n"
        "👨‍👨‍👧‍👦👨‍👨‍👧‍👧👨‍👩‍👧👩‍❤️‍👨\n"
        "👨‍❤️‍👨👯👩‍🦼👭👨‍👩‍👧‍👦\n"
        "👨‍👨‍👧‍👦👨‍👨‍👦👩‍👩‍👧\n"
        "👨‍👨‍👧‍👧👨‍👩‍👦‍👦",
    ),
]
t = PrettyTable(title="prettytable", field_names=names, h_align="c")
t.add_rows(table)
print(t)

t = Table(table, name="table2string", column_names=names)
t.print(h_align="^", sep=(1,))
```

<details>
<summary>Windows Terminal</summary>

![emoji_example_1.png](images/emoji_example_Windows_Terminal.png)
</details>

<details>
<summary>Windows 10</summary>

![emoji_example_windows_10_terminal.png](images/emoji_example_windows_10_terminal.png)
</details>

<details>
<summary>Windows 11</summary>

![emoji_example_windows_11_terminal.png](images/emoji_example_windows_11_terminal.png)
</details>

<details>
<summary>VT100 terminal emulator</summary>

![emoji_example_VT100_terminal_emulator.png](images/emoji_example_VT100_terminal_emulator.png)
</details>
</details>


## Subtable

<details>
<summary>Example</summary>

```pycon
>>> Table(
...     [
...         ("1",),
...         (Table([("2", "3")]),),
...     ]
... ).print()
+-------+
|     1 |
+---+---+
| 2 | 3 |
+---+---+
>>> Table([(
...     Table([(
...         Table([(
...             Table([(
...                 Table([(
...                     Table([(
...                         Table([(
...                             Table(
...                                 [
...                                     ("1",),
...                                     (Table([("2", "3")]),),
...                                 ]
...                             ),
...                         )]),
...                     )]),
...                 )]),
...             )]),
...         )]),
...     )]),
... )]).print()
+-------+
|     1 |
+---+---+
| 2 | 3 |
+---+---+
>>> Table(
...     [
...         (
...             "123",
...             Table(
...                 [
...                     ("456",),
...                     (Table([("789", "101")]),),
...                 ]
...             ),
...         ),
...     ]
... ).print()
+-----+-----------+
| 123 |       456 |
|     +-----+-----+
|     | 789 | 101 |
+-----+-----+-----+

```
</details>

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "table2string",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "string, table, tools",
    "author": null,
    "author_email": "EgorKhabarov <not.a.fan.of.broccoli@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/37/da/975e339714ad97703965972766bb12857d26f8a4a7f1f18819cdbba6fad9/table2string-2.0.1.tar.gz",
    "platform": null,
    "description": "# table2string\n\n[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/EgorKhabarov/table2string/tests.yml?style=flat&logo=GitHub&label=Tests)](https://github.com/EgorKhabarov/table2string/actions/workflows/tests.yml)\n[![Publish Python Package to PyPI](https://img.shields.io/github/actions/workflow/status/EgorKhabarov/table2string/publish.yml?style=flat&logo=GitHub&label=Publish%20to%20PyPI)](https://github.com/EgorKhabarov/table2string/actions/workflows/publish.yml)\n\n[![PyPi Package Version](https://img.shields.io/pypi/v/table2string.svg?style=flat&logo=pypi)](https://pypi.python.org/pypi/table2string)\n[![Supported Python versions](https://img.shields.io/pypi/pyversions/table2string.svg?style=flat&logo=pypi)](https://pypi.python.org/pypi/table2string)\n[![PyPi status](https://img.shields.io/pypi/status/table2string.svg?style=flat&logo=pypi)](https://pypi.python.org/pypi/table2string)\n[![PyPi downloads](https://img.shields.io/pypi/dm/table2string.svg?style=flat&logo=pypi)](https://pypi.org/project/table2string/)\n\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![mypy checked](https://img.shields.io/badge/mypy-checked-blue)](https://github.com/python/mypy)\n[![Linting: Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n\n\n## Convert table to string\n\nWhile there are several libraries available for converting tables to strings in Python, none seemed to meet my specific requirements. \n\n- **Line Break Support**: Easily include line breaks within cells for enhanced readability.\n- **Subtable Support**: Easily include a table within a table for a more flexible presentation.\n- **Alignment**: Easily align text in a cell in any direction.\n- **Emoji Integration**: Effortlessly incorporate emoji characters into your tables to add visual appeal and context.\n\n---\n\n# Install\n\n## PyPI\n\n```shell\npip install -U table2string\n```\n\n## GitHub\n\n```shell\npip install -U git+https://github.com/EgorKhabarov/table2string.git@master\n```\n\n---\n\n# Usage example\n\n```pycon\n>>> from table2string import Table, Themes, HorizontalAlignment, VerticalAlignment\n>>> Table([(\"1\", \"2\", \"3\"), (\"qwe\", \"rty\\nuio\", \"\")], name=\"Table Name\", column_names=(\"c1\", \"c2\", \"c3\")).print()\n+----------------+\n|   Table Name   |\n+-----+-----+----+\n| c1  | c2  | c3 |\n+-----+-----+----+\n|   1 |   2 |  3 |\n+-----+-----+----+\n| qwe | rty |    |\n|     | uio |    |\n+-----+-----+----+\n>>> from io import StringIO\n>>> Table.from_csv(StringIO('c1,c2,c3\\n1,2,3\\nqwe,\"rty\\nuio\",'), name=\"Table Name\").print()\n+----------------+\n|   Table Name   |\n+-----+-----+----+\n| c1  | c2  | c3 |\n+-----+-----+----+\n|   1 |   2 |  3 |\n+-----+-----+----+\n| qwe | rty |    |\n|     | uio |    |\n+-----+-----+----+\n>>> import sqlite3\n>>> cursor = sqlite3.connect(\":memory:\").cursor().execute(\n...     \"CREATE TABLE data (c1 TEXT, c2 TEXT, c3 TEXT);\"\n... ).executemany(\n...     \"INSERT INTO data (c1, c2, c3) VALUES (?, ?, ?);\",\n...     [(\"1\", \"2\", \"3\"), (\"qwe\", \"rty\\nuio\", \"\")],\n... ).execute(\n...     \"SELECT c1, c2, c3 FROM data;\"\n... )\n>>> Table.from_db_cursor(\n...     cursor,\n...     name=\"Table Name\",\n...     column_names=True,\n... ).print()\n+----------------+\n|   Table Name   |\n+-----+-----+----+\n| c1  | c2  | c3 |\n+-----+-----+----+\n|   1 |   2 |  3 |\n+-----+-----+----+\n| qwe | rty |    |\n|     | uio |    |\n+-----+-----+----+\n>>> Table(\n...     [(\"c1\", Table([(\"1\", \"2\"), (\"3\", \"4\")], name=\"SubTable\"))],\n...     name=\"Table Name\",\n... ).print(v_align=(\"-\",), max_width=(2, 8))\n+---------------+\n|  Table Name   |\n+----+----------+\n|    | SubTable |\n|    +-----+----+\n| c1 |   1 |  2 |\n|    +-----+----+\n|    |   3 |  4 |\n+----+-----+----+\n\n```\n\n## Arguments\n\n| Argument                 | Type                                                                                              | Example                         | Description                                                                                                                                                 |\n|:-------------------------|:--------------------------------------------------------------------------------------------------|:--------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `table`                  | `Sequence[Sequence[Any]]`                                                                         | `[(\"1\", \"2\"), (\"3\", \"4\")]`      | A two-dimensional matrix                                                                                                                                    |\n| `h_align`                | <code>tuple[HorizontalAlignment &#x7c; str, ...]</code> &#x7c; `HorizontalAlignment` &#x7c; `str` | `HorizontalAlignment.CENTER`    | Allows you to align text in a cell horizontally                                                                                                             |\n| `v_align`                | <code>tuple[VerticalAlignment &#x7c; str, ...]</code> &#x7c; `VerticalAlignment` &#x7c; `str`     | `VerticalAlignment.MIDDLE`      | Allows you to align text in a cell vertically                                                                                                               |\n| `name`                   | `str` &#x7c; `None`                                                                               | `\"Table Name\"`                  | Table name                                                                                                                                                  |\n| `name_h_align`           | `HorizontalAlignment` &#x7c; `str`                                                                | `HorizontalAlignment.CENTER`    | Allows you to align table name horizontally                                                                                                                 |\n| `name_v_align`           | `VerticalAlignment` &#x7c; `str`                                                                  | `VerticalAlignment.MIDDLE`      | Allows you to align table name vertically                                                                                                                   |\n| `column_names`           | `Sequence[str]` &#x7c; `None`                                                                     | `(\"c1\", \"c2\", ...column_count)` | Sets the names for the table columns                                                                                                                        |\n| `column_names_h_align`   | <code>tuple[HorizontalAlignment &#x7c; str, ...]</code> &#x7c; `HorizontalAlignment` &#x7c; `str` | `HorizontalAlignment.CENTER`    | Allows you to align column names horizontally                                                                                                               |\n| `column_names_v_align`   | <code>tuple[VerticalAlignment &#x7c; str, ...]</code> &#x7c; `VerticalAlignment` &#x7c; `str`     | `VerticalAlignment.MIDDLE`      | Allows you to align column names vertically                                                                                                                 |\n| `max_width`              | `int` &#x7c; `Tuple[int, ...]` &#x7c; `None`                                                      | `120`                           | Allows you to set the width of the entire table or individually for each column                                                                             |\n| `max_height`             | `int` &#x7c; `None`                                                                               | `10`                            | Specifies the maximum height for rows                                                                                                                       |\n| `maximize_height`        | `bool`                                                                                            | `True`                          | Force height to be taken from max_height                                                                                                                    |\n| `line_break_symbol`      | `str`                                                                                             | `\"\\\\\"`                          | Line break symbol                                                                                                                                           |\n| `cell_break_symbol`      | `str`                                                                                             | `\"\u2026\"`                           | Symbol indicating the end of text when there is not enough height                                                                                           |\n| `sep`                    | `bool` &#x7c; `range` &#x7c; `tuple`                                                              | `(1, 3, 6)`                     | Handles the separators between table rows and can be either a boolean type or possess a `__contains__` method                                               |\n| `end`                    | `str` &#x7c; `None`                                                                               | `\"\\n\"`                          | Behaves the same as `print(end=)`                                                                                                                           |\n| `file`                   | `TextIOWrapper` &#x7c; `None`                                                                     | `sys.stdout` or `io.StringIO()` | Behaves the same as `print(file=)`                                                                                                                          |\n| `theme`                  | `Theme`                                                                                           | `Themes.rounded_thick`          | Allows you to set a specific theme for the table. For example, the border style                                                                             |\n| `ignore_width_errors`    | `bool`                                                                                            | `False`                         | Fixes errors in max_width if they exist                                                                                                                     |\n| `proportion_coefficient` | `float`                                                                                           | `0.5`                           | Affects the width distribution of the columns. A value of `0.0` corresponds to proportional distribution, `1.0` averages the values, and `2.0` inverts them |\n\n\n## Text alignment\n\n| Align                                     | Example           | Description                                                                                                                    |\n|:------------------------------------------|:------------------|:-------------------------------------------------------------------------------------------------------------------------------|\n| `\"<align>\"` or `(\"<align>\",)`             | `\"^\"` or `(\"^\",)` | Setting `align` (`\"^\"`) for all columns                                                                                        |\n| `(\"<align_1>\", \"<align_2>\")`              | `(\"^\", \"<\")`      | Setting `align_1` (`\"^\"`) for the first column and `align_2` (`\"<\"`) for all other columns                                     |\n| `(\"<align_1>\", \"<align_2>\", \"<align_3>\")` | `(\"^\", \"<\", \">\")` | Setting `align_1` (`\"^\"`) for the first column and `align_2` (`\"<\"`) for the second and `align_3` (`\">\"`) for the third column |\n\nYou can also use the corresponding `HorizontalAlignment` or `VerticalAlignment` type\n\nFor `name_h_align` and `name_v_align` only the `str` type or the corresponding `HorizontalAlignment` or `VerticalAlignment` type is valid\n\n### HorizontalAlignment\n\n| Align                                      | Description                                                                                                                                          |\n|:-------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------|\n| `AUTO` or `AUTO_AUTO` or `*` or `**`       | Alignment depends on the type. If this is a number and there are no line breaks in this cell, then align to the right; otherwise, align to the left. |\n| `LEFT` or `LEFT_LEFT` or `<` or `<<`       | All lines are left aligned                                                                                                                           |\n| `CENTER` or `CENTER_CENTER` or `^` or `^^` | All lines are center aligned                                                                                                                         |\n| `RIGHT` or `RIGHT_RIGHT` or `>` or `>>`    | All lines are right aligned                                                                                                                          |\n| `LEFT_CENTER` or `<^`                      | The first line is left aligned and the remaining lines are centered                                                                                  |\n| `LEFT_RIGHT` or `<>`                       | The first line is left aligned and the remaining lines are right aligned                                                                             |\n| `CENTER_LEFT` or `^<`                      | The first line is aligned to the center, and the remaining lines are aligned to the left of the first line.                                          |\n| `CENTER_RIGHT` or `^>`                     | The first line is aligned to the center, and the remaining lines are aligned to the right of the first line.                                         |\n| `RIGHT_LEFT` or `><`                       | The first line is right aligned and the remaining lines are left aligned                                                                             |\n| `RIGHT_CENTER` or `>^`                     | The first line is right aligned and the remaining lines are centered                                                                                 |\n\n### VerticalAlignment\n\n| Align           | Description             |\n|:----------------|:------------------------|\n| `TOP` or `^`    | Text are top aligned    |\n| `MIDDLE` or `-` | Text are centered       |\n| `BOTTOM` or `_` | Text are bottom aligned |\n\n\n<details>\n<summary>Example</summary>\n\n```pycon\n>>> from functools import partial\n>>> sub_table_auto_func = partial(Table, [(\"123\", \"text\",)], max_height=4, maximize_height=True)\n>>> sub_table_func = partial(Table, [(\"first line\\ntext\",)], max_height=4, maximize_height=True)\n>>> Table(\n...     [\n...         *(\n...             [v_align, sub_table_auto_func(h_align=\"*\", v_align=v_align)] + [\n...                 sub_table_func(h_align=h_align, v_align=v_align)\n...                 for h_align in (\"<\", \">\", \"^\", \"^<\", \"^>\")\n...             ]\n...             for v_align in (\"^\", \"-\", \"_\")\n...         )\n...     ],\n...     column_names=(\" \", \"*\", \"<\", \">\", \"^\", \"^<\", \"^>\"),\n... ).print(max_width=(1, len(\"first line\")+4), v_align=(\"-\",))\n+---+----------------+----------------+----------------+----------------+----------------+----------------+\n|   |       *        |       <        |       >        |       ^        |       ^<       |       ^>       |\n+---+-------+--------+----------------+----------------+----------------+----------------+----------------+\n|   |   123 | text   | first line     |     first line |   first line   |   first line   |   first line   |\n| ^ |       |        | text           |           text |      text      |   text         |         text   |\n|   |       |        |                |                |                |                |                |\n|   |       |        |                |                |                |                |                |\n+---+-------+--------+----------------+----------------+----------------+----------------+----------------+\n|   |       |        |                |                |                |                |                |\n| - |   123 | text   | first line     |     first line |   first line   |   first line   |   first line   |\n|   |       |        | text           |           text |      text      |   text         |         text   |\n|   |       |        |                |                |                |                |                |\n+---+-------+--------+----------------+----------------+----------------+----------------+----------------+\n|   |       |        |                |                |                |                |                |\n| _ |       |        |                |                |                |                |                |\n|   |       |        | first line     |     first line |   first line   |   first line   |   first line   |\n|   |   123 | text   | text           |           text |      text      |   text         |         text   |\n+---+-------+--------+----------------+----------------+----------------+----------------+----------------+\n\n```\n</details>\n\n## Custom width and height settings\n\n| Width                               | Example        | Description                                                                                                                 |\n|-------------------------------------|----------------|-----------------------------------------------------------------------------------------------------------------------------|\n| `<width>`                           | `10`           | Setting `width` (`10`) for the whole table                                                                                  |\n| `(<width>,)`                        | `(10,)`        | Setting `width_1` (`10`) for all column                                                                                     |\n| `(<width_1>, <width_2>)`            | `(10, 20)`     | Setting `width_1` (`10`) for the first column and `width_2` (`20`) for all other columns                                    |\n| `(<width_1>, <width_2>, <width_3>)` | `(10, 20, 30)` | Setting `width_1` (`10`) for the first column and `width_2` (`20`) for the second and `width_3` (`30`) for the third column |\n\n<details>\n<summary>Example</summary>\n\n```pycon\n>>> # Width of the entire table with borders\n>>> Table([(1, 12345, \"example\")]).print(max_width=30)\n+-----+----------+-----------+\n|   1 |    12345 | example   |\n+-----+----------+-----------+\n>>> # Width of each column individually\n>>> Table([(1, 12345, \"example\")]).print(max_width=(10,))\n+------------+------------+------------+\n|          1 |      12345 | example    |\n+------------+------------+------------+\n>>> Table([(1, 12345, \"example\")]).print(max_width=(1, 8, 6))\n+---+----------+--------+\n| 1 |    12345 | exampl\\|\n|   |          | e      |\n+---+----------+--------+\n>>> Table([(1, 12345, \"example\")]).print(max_width=(1, 5, 7))\n+---+-------+---------+\n| 1 | 12345 | example |\n+---+-------+---------+\n>>> Table([(\"123456\\n\\n789000\", \"example\")]).print(max_width=(3, 4), max_height=4)\n+-----+------+\n| 123\\| exam\\|\n| 456 | ple  |\n|     |      |\n| 789\u2026|      |\n+-----+------+\n>>> Table([(\"123456789\",)]).print(max_width=(1,), max_height=1)\n+---+\n| 1\u2026|\n+---+\n>>> Table([(\"123\\n456\\n789\",)]).print(\n...     max_width=(3,),\n...     max_height=4,\n...     maximize_height=True,\n... )\n+-----+\n| 123 |\n| 456 |\n| 789 |\n|     |\n+-----+\n>>> Table([(\"123456789\",)]).print(\n...     max_width=(3,),\n...     max_height=4,\n...     maximize_height=True,\n... )\n+-----+\n| 123\\|\n| 456\\|\n| 789 |\n|     |\n+-----+\n\n```\n</details>\n\n## Separator settings\n\n| Separator              | Description                                |\n|------------------------|--------------------------------------------|\n| `sep=True`             | All horizontal dividers included           |\n| `sep=False`            | All horizontal dividers are disabled       |\n| `sep=(1,)`             | Only first delimiter                       |\n| `sep=(1, 3, 5)`        | Only first third and fifth separator       |\n| `sep=range(1, 100, 5)` | Delimiter every five lines first 100 lines |\n\n<details>\n<summary>Example</summary>\n\n```pycon\n>>> table_1 = Table([(\"qwe\", \"rty\\nuio\"), (\"123456\\n\\n789000\", \"example\")])\n>>> kwargs = {\n...     \"max_width\": (3, 4),\n...     \"max_height\": 4,\n... }\n>>> table_1.print(**kwargs, sep=True)\n+-----+------+\n| qwe | rty  |\n|     | uio  |\n+-----+------+\n| 123\\| exam\\|\n| 456 | ple  |\n|     |      |\n| 789\u2026|      |\n+-----+------+\n>>> table_1.print(**kwargs, sep=False)\n+-----+------+\n| qwe | rty  |\n|     | uio  |\n| 123\\| exam\\|\n| 456 | ple  |\n|     |      |\n| 789\u2026|      |\n+-----+------+\n>>> table_2 = Table([(\"1\", \"2\"), (\"3\", \"4\")], name=\"Name\")\n>>> table_2.print(sep=True)\n+-------+\n| Name  |\n+---+---+\n| 1 | 2 |\n+---+---+\n| 3 | 4 |\n+---+---+\n>>> table_2.print(sep=False)\n+-------+\n| Name  |\n+---+---+\n| 1 | 2 |\n| 3 | 4 |\n+---+---+\n>>> table_3 = Table([(\"1\", \"2\"), (\"3\", \"4\"), (\"5\", \"6\"), (\"7\", \"8\")])\n>>> table_3.print(sep=(1,))\n+---+---+\n| 1 | 2 |\n+---+---+\n| 3 | 4 |\n| 5 | 6 |\n| 7 | 8 |\n+---+---+\n>>> table_3.print(sep=(2,))\n+---+---+\n| 1 | 2 |\n| 3 | 4 |\n+---+---+\n| 5 | 6 |\n| 7 | 8 |\n+---+---+\n>>> table_3.print(sep=(1, 3))\n+---+---+\n| 1 | 2 |\n+---+---+\n| 3 | 4 |\n| 5 | 6 |\n+---+---+\n| 7 | 8 |\n+---+---+\n>>> table_4 = Table([(\"1\", \"2\"), (\"3\", \"4\"), (\"5\", \"6\"), (\"7\", \"8\")], name=\"Name\")\n>>> table_4.print(sep=(1,))\n+-------+\n| Name  |\n+---+---+\n| 1 | 2 |\n+---+---+\n| 3 | 4 |\n| 5 | 6 |\n| 7 | 8 |\n+---+---+\n>>> table_4.print(sep=(2,))\n+-------+\n| Name  |\n+---+---+\n| 1 | 2 |\n| 3 | 4 |\n+---+---+\n| 5 | 6 |\n| 7 | 8 |\n+---+---+\n>>> table_4.print(sep=(1, 3))\n+-------+\n| Name  |\n+---+---+\n| 1 | 2 |\n+---+---+\n| 3 | 4 |\n| 5 | 6 |\n+---+---+\n| 7 | 8 |\n+---+---+\n\n```\n</details>\n\n## Themes\n\n### Borders\n\n<details>\n<summary>Border types</summary>\n\n```pycon\n>>> from table2string import Themes, HorizontalAlignment\n>>> table = []\n>>> example_table = Table([(\" \", \" \"), (\" \", \" \"), (\" \", \" \")])\n>>> theme_names = (\n...     (\"ascii_thin\", \"ascii_thin_double\"),\n...     (\"ascii_double\", \"ascii_double_thin\"),\n...     (\"thin\", \"thin_thick\"),\n...     (\"thin_double\", \"rounded_double\"),\n...     (\"rounded\", \"rounded_thick\"),\n...     (\"thick\", \"thick_thin\"),\n...     (\"double\", \"double_thin\"),\n...     (\"booktabs\", \"ascii_booktabs\"),\n...     (\"markdown\", \"None\"),\n... )\n>>> for names in theme_names:\n...     table.append([])\n...     for name in names:\n...         string_table = example_table.stringify(\n...             theme=getattr(Themes, name, Themes.ascii_thin)\n...         )\n...         table[-1].append(f\"{name}\\n{string_table}\")\n>>> Table(table).print(theme=Themes.thin, h_align=HorizontalAlignment.CENTER)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  ascii_thin  \u2502 ascii_thin_double \u2502\n\u2502  +---+---+   \u2502     +---+---+     \u2502\n\u2502  |   |   |   \u2502     |   |   |     \u2502\n\u2502  +---+---+   \u2502     +===+===+     \u2502\n\u2502  |   |   |   \u2502     |   |   |     \u2502\n\u2502  +---+---+   \u2502     +---+---+     \u2502\n\u2502  |   |   |   \u2502     |   |   |     \u2502\n\u2502  +---+---+   \u2502     +---+---+     \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 ascii_double \u2502 ascii_double_thin \u2502\n\u2502  +===+===+   \u2502     +===+===+     \u2502\n\u2502  \u2016   \u2016   \u2016   \u2502     \u2016   \u2016   \u2016     \u2502\n\u2502  +===+===+   \u2502     +---+---+     \u2502\n\u2502  \u2016   \u2016   \u2016   \u2502     \u2016   \u2016   \u2016     \u2502\n\u2502  +===+===+   \u2502     +===+===+     \u2502\n\u2502  \u2016   \u2016   \u2016   \u2502     \u2016   \u2016   \u2016     \u2502\n\u2502  +===+===+   \u2502     +===+===+     \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502     thin     \u2502    thin_thick     \u2502\n\u2502  \u250c\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510   \u2502     \u250c\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510     \u2502\n\u2502  \u2502   \u2502   \u2502   \u2502     \u2502   \u2502   \u2502     \u2502\n\u2502  \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524   \u2502     \u251d\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525     \u2502\n\u2502  \u2502   \u2502   \u2502   \u2502     \u2502   \u2502   \u2502     \u2502\n\u2502  \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524   \u2502     \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524     \u2502\n\u2502  \u2502   \u2502   \u2502   \u2502     \u2502   \u2502   \u2502     \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518   \u2502     \u2514\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518     \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 thin_double  \u2502  rounded_double   \u2502\n\u2502  \u250c\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510   \u2502     \u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e     \u2502\n\u2502  \u2502   \u2502   \u2502   \u2502     \u2502   \u2502   \u2502     \u2502\n\u2502  \u255e\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561   \u2502     \u255e\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561     \u2502\n\u2502  \u2502   \u2502   \u2502   \u2502     \u2502   \u2502   \u2502     \u2502\n\u2502  \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524   \u2502     \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524     \u2502\n\u2502  \u2502   \u2502   \u2502   \u2502     \u2502   \u2502   \u2502     \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518   \u2502     \u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f     \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502   rounded    \u2502   rounded_thick   \u2502\n\u2502  \u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e   \u2502     \u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e     \u2502\n\u2502  \u2502   \u2502   \u2502   \u2502     \u2502   \u2502   \u2502     \u2502\n\u2502  \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524   \u2502     \u251d\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525     \u2502\n\u2502  \u2502   \u2502   \u2502   \u2502     \u2502   \u2502   \u2502     \u2502\n\u2502  \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524   \u2502     \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524     \u2502\n\u2502  \u2502   \u2502   \u2502   \u2502     \u2502   \u2502   \u2502     \u2502\n\u2502  \u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f   \u2502     \u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f     \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502    thick     \u2502    thick_thin     \u2502\n\u2502  \u250f\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2513   \u2502     \u250f\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2513     \u2502\n\u2502  \u2503   \u2503   \u2503   \u2502     \u2503   \u2503   \u2503     \u2502\n\u2502  \u2523\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b   \u2502     \u2520\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2528     \u2502\n\u2502  \u2503   \u2503   \u2503   \u2502     \u2503   \u2503   \u2503     \u2502\n\u2502  \u2523\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b   \u2502     \u2523\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b     \u2502\n\u2502  \u2503   \u2503   \u2503   \u2502     \u2503   \u2503   \u2503     \u2502\n\u2502  \u2517\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b   \u2502     \u2517\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b     \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502    double    \u2502    double_thin    \u2502\n\u2502  \u2554\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2557   \u2502     \u2554\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2557     \u2502\n\u2502  \u2551   \u2551   \u2551   \u2502     \u2551   \u2551   \u2551     \u2502\n\u2502  \u2560\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563   \u2502     \u255f\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2562     \u2502\n\u2502  \u2551   \u2551   \u2551   \u2502     \u2551   \u2551   \u2551     \u2502\n\u2502  \u2560\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563   \u2502     \u2560\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563     \u2502\n\u2502  \u2551   \u2551   \u2551   \u2502     \u2551   \u2551   \u2551     \u2502\n\u2502  \u255a\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d   \u2502     \u255a\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d     \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502   booktabs   \u2502  ascii_booktabs   \u2502\n\u2502   \u2500\u2500\u2500\u2500\u2500\u2500\u2500    \u2502      -------      \u2502\n\u2502              \u2502                   \u2502\n\u2502   \u2501\u2501\u2501\u2501\u2501\u2501\u2501    \u2502      =======      \u2502\n\u2502              \u2502                   \u2502\n\u2502   \u2500\u2500\u2500\u2500\u2500\u2500\u2500    \u2502      -------      \u2502\n\u2502              \u2502                   \u2502\n\u2502   \u2500\u2500\u2500\u2500\u2500\u2500\u2500    \u2502      -------      \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502   markdown   \u2502       None        \u2502\n\u2502  |   |   |   \u2502     +---+---+     \u2502\n\u2502  |---|---|   \u2502     |   |   |     \u2502\n\u2502  |   |   |   \u2502     +---+---+     \u2502\n\u2502  |   |   |   \u2502     |   |   |     \u2502\n\u2502              \u2502     +---+---+     \u2502\n\u2502              \u2502     |   |   |     \u2502\n\u2502              \u2502     +---+---+     \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n```\n</details>\n\n<details>\n<summary>Example</summary>\n\n```pycon\n>>> from table2string import Table, Themes\n>>> name = \"Table Name\"\n>>> column_names = (\"c1\", \"c2\", \"3\")\n>>> table = [(\"1\", \"2\", \"3\"), (\"qwe\", \"rty\\nuio\", \"\")]\n>>> t = Table(table)\n>>> t_name = Table(table, name=name)\n>>> t_column_names = Table(table, column_names=column_names)\n>>> t_name_column_names = Table(table, name=name, column_names=column_names)\n\n```\n\n<details>\n<summary>Themes.ascii_thin</summary>\n\n```pycon\n\n>>> t.print(theme=Themes.ascii_thin)\n+-----+-----+---+\n|   1 |   2 | 3 |\n+-----+-----+---+\n| qwe | rty |   |\n|     | uio |   |\n+-----+-----+---+\n>>> t_column_names.print(theme=Themes.ascii_thin)\n+-----+-----+---+\n| c1  | c2  | 3 |\n+-----+-----+---+\n|   1 |   2 | 3 |\n+-----+-----+---+\n| qwe | rty |   |\n|     | uio |   |\n+-----+-----+---+\n>>> t_name.print(theme=Themes.ascii_thin)\n+---------------+\n|  Table Name   |\n+-----+-----+---+\n|   1 |   2 | 3 |\n+-----+-----+---+\n| qwe | rty |   |\n|     | uio |   |\n+-----+-----+---+\n>>> t_name_column_names.print(theme=Themes.ascii_thin)\n+---------------+\n|  Table Name   |\n+-----+-----+---+\n| c1  | c2  | 3 |\n+-----+-----+---+\n|   1 |   2 | 3 |\n+-----+-----+---+\n| qwe | rty |   |\n|     | uio |   |\n+-----+-----+---+\n\n```\n</details>\n\n\n<details>\n<summary>Themes.ascii_thin_double</summary>\n\n```pycon\n>>> t.print(theme=Themes.ascii_thin_double)\n+-----+-----+---+\n|   1 |   2 | 3 |\n+=====+=====+===+\n| qwe | rty |   |\n|     | uio |   |\n+-----+-----+---+\n>>> t_column_names.print(theme=Themes.ascii_thin_double)\n+-----+-----+---+\n| c1  | c2  | 3 |\n+=====+=====+===+\n|   1 |   2 | 3 |\n+-----+-----+---+\n| qwe | rty |   |\n|     | uio |   |\n+-----+-----+---+\n>>> t_name.print(theme=Themes.ascii_thin_double)\n+---------------+\n|  Table Name   |\n+-----+-----+---+\n|   1 |   2 | 3 |\n+=====+=====+===+\n| qwe | rty |   |\n|     | uio |   |\n+-----+-----+---+\n>>> t_name_column_names.print(theme=Themes.ascii_thin_double)\n+---------------+\n|  Table Name   |\n+-----+-----+---+\n| c1  | c2  | 3 |\n+=====+=====+===+\n|   1 |   2 | 3 |\n+-----+-----+---+\n| qwe | rty |   |\n|     | uio |   |\n+-----+-----+---+\n\n```\n</details>\n\n\n<details>\n<summary>Themes.ascii_double</summary>\n\n```pycon\n>>> t.print(theme=Themes.ascii_double)\n+=====+=====+===+\n\u2016   1 \u2016   2 \u2016 3 \u2016\n+=====+=====+===+\n\u2016 qwe \u2016 rty \u2016   \u2016\n\u2016     \u2016 uio \u2016   \u2016\n+=====+=====+===+\n>>> t_column_names.print(theme=Themes.ascii_double)\n+=====+=====+===+\n\u2016 c1  \u2016 c2  \u2016 3 \u2016\n+=====+=====+===+\n\u2016   1 \u2016   2 \u2016 3 \u2016\n+=====+=====+===+\n\u2016 qwe \u2016 rty \u2016   \u2016\n\u2016     \u2016 uio \u2016   \u2016\n+=====+=====+===+\n>>> t_name.print(theme=Themes.ascii_double)\n+===============+\n\u2016  Table Name   \u2016\n+=====+=====+===+\n\u2016   1 \u2016   2 \u2016 3 \u2016\n+=====+=====+===+\n\u2016 qwe \u2016 rty \u2016   \u2016\n\u2016     \u2016 uio \u2016   \u2016\n+=====+=====+===+\n>>> t_name_column_names.print(theme=Themes.ascii_double)\n+===============+\n\u2016  Table Name   \u2016\n+=====+=====+===+\n\u2016 c1  \u2016 c2  \u2016 3 \u2016\n+=====+=====+===+\n\u2016   1 \u2016   2 \u2016 3 \u2016\n+=====+=====+===+\n\u2016 qwe \u2016 rty \u2016   \u2016\n\u2016     \u2016 uio \u2016   \u2016\n+=====+=====+===+\n\n```\n</details>\n\n\n<details>\n<summary>Themes.ascii_double_thin</summary>\n\n```pycon\n>>> t.print(theme=Themes.ascii_double_thin)\n+=====+=====+===+\n\u2016   1 \u2016   2 \u2016 3 \u2016\n+-----+-----+---+\n\u2016 qwe \u2016 rty \u2016   \u2016\n\u2016     \u2016 uio \u2016   \u2016\n+=====+=====+===+\n>>> t_column_names.print(theme=Themes.ascii_double_thin)\n+=====+=====+===+\n\u2016 c1  \u2016 c2  \u2016 3 \u2016\n+-----+-----+---+\n\u2016   1 \u2016   2 \u2016 3 \u2016\n+=====+=====+===+\n\u2016 qwe \u2016 rty \u2016   \u2016\n\u2016     \u2016 uio \u2016   \u2016\n+=====+=====+===+\n>>> t_name.print(theme=Themes.ascii_double_thin)\n+===============+\n\u2016  Table Name   \u2016\n+=====+=====+===+\n\u2016   1 \u2016   2 \u2016 3 \u2016\n+-----+-----+---+\n\u2016 qwe \u2016 rty \u2016   \u2016\n\u2016     \u2016 uio \u2016   \u2016\n+=====+=====+===+\n>>> t_name_column_names.print(theme=Themes.ascii_double_thin)\n+===============+\n\u2016  Table Name   \u2016\n+=====+=====+===+\n\u2016 c1  \u2016 c2  \u2016 3 \u2016\n+-----+-----+---+\n\u2016   1 \u2016   2 \u2016 3 \u2016\n+=====+=====+===+\n\u2016 qwe \u2016 rty \u2016   \u2016\n\u2016     \u2016 uio \u2016   \u2016\n+=====+=====+===+\n\n```\n</details>\n\n\n<details>\n<summary>Themes.ascii_booktabs</summary>\n\n```pycon\n>>> t.print(theme=Themes.ascii_booktabs)\n --------------- \n    1     2   3  \n =============== \n  qwe   rty      \n        uio      \n --------------- \n>>> t_column_names.print(theme=Themes.ascii_booktabs)\n --------------- \n  c1    c2    3  \n =============== \n    1     2   3  \n --------------- \n  qwe   rty      \n        uio      \n --------------- \n>>> t_name.print(theme=Themes.ascii_booktabs)\n --------------- \n   Table Name    \n --------------- \n    1     2   3  \n =============== \n  qwe   rty      \n        uio      \n --------------- \n>>> t_name_column_names.print(theme=Themes.ascii_booktabs)\n --------------- \n   Table Name    \n --------------- \n  c1    c2    3  \n =============== \n    1     2   3  \n --------------- \n  qwe   rty      \n        uio      \n --------------- \n\n```\n</details>\n\n\n<details>\n<summary>Themes.thin</summary>\n\n```pycon\n>>> t.print(theme=Themes.thin)\n\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_column_names.print(theme=Themes.thin)\n\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510\n\u2502 c1  \u2502 c2  \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_name.print(theme=Themes.thin)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  Table Name   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_name_column_names.print(theme=Themes.thin)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  Table Name   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 c1  \u2502 c2  \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n\n```\n</details>\n\n\n<details>\n<summary>Themes.thin_thick</summary>\n\n```pycon\n>>> t.print(theme=Themes.thin_thick)\n\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_column_names.print(theme=Themes.thin_thick)\n\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510\n\u2502 c1  \u2502 c2  \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_name.print(theme=Themes.thin_thick)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  Table Name   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_name_column_names.print(theme=Themes.thin_thick)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  Table Name   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 c1  \u2502 c2  \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n\n```\n</details>\n\n\n<details>\n<summary>Themes.thin_double</summary>\n\n```pycon\n>>> t.print(theme=Themes.thin_double)\n\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_column_names.print(theme=Themes.thin_double)\n\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510\n\u2502 c1  \u2502 c2  \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_name.print(theme=Themes.thin_double)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  Table Name   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_name_column_names.print(theme=Themes.thin_double)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  Table Name   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 c1  \u2502 c2  \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n\n```\n</details>\n\n\n<details>\n<summary>Themes.rounded</summary>\n\n```pycon\n>>> t.print(theme=Themes.rounded)\n\u256d\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_column_names.print(theme=Themes.rounded)\n\u256d\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e\n\u2502 c1  \u2502 c2  \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_name.print(theme=Themes.rounded)\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502  Table Name   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_name_column_names.print(theme=Themes.rounded)\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502  Table Name   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 c1  \u2502 c2  \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n\n```\n</details>\n\n\n<details>\n<summary>Themes.rounded_thick</summary>\n\n```pycon\n>>> t.print(theme=Themes.rounded_thick)\n\u256d\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_column_names.print(theme=Themes.rounded_thick)\n\u256d\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e\n\u2502 c1  \u2502 c2  \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_name.print(theme=Themes.rounded_thick)\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502  Table Name   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_name_column_names.print(theme=Themes.rounded_thick)\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502  Table Name   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 c1  \u2502 c2  \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n\n```\n</details>\n\n\n<details>\n<summary>Themes.rounded_double</summary>\n\n```pycon\n>>> t.print(theme=Themes.rounded_double)\n\u256d\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_column_names.print(theme=Themes.rounded_double)\n\u256d\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e\n\u2502 c1  \u2502 c2  \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_name.print(theme=Themes.rounded_double)\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502  Table Name   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_name_column_names.print(theme=Themes.rounded_double)\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502  Table Name   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 c1  \u2502 c2  \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502   1 \u2502   2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502   \u2502\n\u2502     \u2502 uio \u2502   \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n\n```\n</details>\n\n\n<details>\n<summary>Themes.thick</summary>\n\n```pycon\n>>> t.print(theme=Themes.thick)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2513\n\u2503   1 \u2503   2 \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503 qwe \u2503 rty \u2503   \u2503\n\u2503     \u2503 uio \u2503   \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n>>> t_column_names.print(theme=Themes.thick)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2513\n\u2503 c1  \u2503 c2  \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503   1 \u2503   2 \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503 qwe \u2503 rty \u2503   \u2503\n\u2503     \u2503 uio \u2503   \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n>>> t_name.print(theme=Themes.thick)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503  Table Name   \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u252b\n\u2503   1 \u2503   2 \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503 qwe \u2503 rty \u2503   \u2503\n\u2503     \u2503 uio \u2503   \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n>>> t_name_column_names.print(theme=Themes.thick)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503  Table Name   \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u252b\n\u2503 c1  \u2503 c2  \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503   1 \u2503   2 \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503 qwe \u2503 rty \u2503   \u2503\n\u2503     \u2503 uio \u2503   \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n\n```\n</details>\n\n\n<details>\n<summary>Themes.thick_thin</summary>\n\n```pycon\n>>> t.print(theme=Themes.thick_thin)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2513\n\u2503   1 \u2503   2 \u2503 3 \u2503\n\u2520\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2528\n\u2503 qwe \u2503 rty \u2503   \u2503\n\u2503     \u2503 uio \u2503   \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n>>> t_column_names.print(theme=Themes.thick_thin)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2513\n\u2503 c1  \u2503 c2  \u2503 3 \u2503\n\u2520\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2528\n\u2503   1 \u2503   2 \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503 qwe \u2503 rty \u2503   \u2503\n\u2503     \u2503 uio \u2503   \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n>>> t_name.print(theme=Themes.thick_thin)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503  Table Name   \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u252b\n\u2503   1 \u2503   2 \u2503 3 \u2503\n\u2520\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2528\n\u2503 qwe \u2503 rty \u2503   \u2503\n\u2503     \u2503 uio \u2503   \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n>>> t_name_column_names.print(theme=Themes.thick_thin)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503  Table Name   \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u252b\n\u2503 c1  \u2503 c2  \u2503 3 \u2503\n\u2520\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2528\n\u2503   1 \u2503   2 \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503 qwe \u2503 rty \u2503   \u2503\n\u2503     \u2503 uio \u2503   \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n\n```\n</details>\n\n\n<details>\n<summary>Themes.double</summary>\n\n```pycon\n>>> t.print(theme=Themes.double)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2557\n\u2551   1 \u2551   2 \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551 qwe \u2551 rty \u2551   \u2551\n\u2551     \u2551 uio \u2551   \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n>>> t_column_names.print(theme=Themes.double)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2557\n\u2551 c1  \u2551 c2  \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551   1 \u2551   2 \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551 qwe \u2551 rty \u2551   \u2551\n\u2551     \u2551 uio \u2551   \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n>>> t_name.print(theme=Themes.double)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551  Table Name   \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2563\n\u2551   1 \u2551   2 \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551 qwe \u2551 rty \u2551   \u2551\n\u2551     \u2551 uio \u2551   \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n>>> t_name_column_names.print(theme=Themes.double)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551  Table Name   \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2563\n\u2551 c1  \u2551 c2  \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551   1 \u2551   2 \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551 qwe \u2551 rty \u2551   \u2551\n\u2551     \u2551 uio \u2551   \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n\n```\n</details>\n\n\n<details>\n<summary>Themes.double_thin</summary>\n\n```pycon\n>>> t.print(theme=Themes.double_thin)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2557\n\u2551   1 \u2551   2 \u2551 3 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2562\n\u2551 qwe \u2551 rty \u2551   \u2551\n\u2551     \u2551 uio \u2551   \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n>>> t_column_names.print(theme=Themes.double_thin)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2557\n\u2551 c1  \u2551 c2  \u2551 3 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2562\n\u2551   1 \u2551   2 \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551 qwe \u2551 rty \u2551   \u2551\n\u2551     \u2551 uio \u2551   \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n>>> t_name.print(theme=Themes.double_thin)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551  Table Name   \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2563\n\u2551   1 \u2551   2 \u2551 3 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2562\n\u2551 qwe \u2551 rty \u2551   \u2551\n\u2551     \u2551 uio \u2551   \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n>>> t_name_column_names.print(theme=Themes.double_thin)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551  Table Name   \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2563\n\u2551 c1  \u2551 c2  \u2551 3 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2562\n\u2551   1 \u2551   2 \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551 qwe \u2551 rty \u2551   \u2551\n\u2551     \u2551 uio \u2551   \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n\n```\n</details>\n\n\n<details>\n<summary>Themes.booktabs</summary>\n\n```pycon\n>>> t.print(theme=Themes.booktabs)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n    1     2   3  \n \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n  qwe   rty      \n        uio      \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n>>> t_column_names.print(theme=Themes.booktabs)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n  c1    c2    3  \n \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n    1     2   3  \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n  qwe   rty      \n        uio      \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n>>> t_name.print(theme=Themes.booktabs)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n   Table Name    \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n    1     2   3  \n \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n  qwe   rty      \n        uio      \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n>>> t_name_column_names.print(theme=Themes.booktabs)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n   Table Name    \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n  c1    c2    3  \n \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n    1     2   3  \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n  qwe   rty      \n        uio      \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n\n```\n</details>\n\n\n<details>\n<summary>Themes.markdown</summary>\n\n```pycon\n>>> t.print(theme=Themes.markdown)\n|   1 |   2 | 3 |\n|-----|-----|---|\n| qwe | rty |   |\n|     | uio |   |\n>>> t_column_names.print(theme=Themes.markdown)\n| c1  | c2  | 3 |\n|-----|-----|---|\n|   1 |   2 | 3 |\n| qwe | rty |   |\n|     | uio |   |\n>>> t_name.print(theme=Themes.markdown)\n|  Table Name   |\n|   1 |   2 | 3 |\n|-----|-----|---|\n| qwe | rty |   |\n|     | uio |   |\n>>> t_name_column_names.print(theme=Themes.markdown)\n|  Table Name   |\n| c1  | c2  | 3 |\n|-----|-----|---|\n|   1 |   2 | 3 |\n| qwe | rty |   |\n|     | uio |   |\n\n```\n</details>\n</details>\n\n## Emojis\n\n<details>\n<summary>Example</summary>\n\n```python\nfrom prettytable import PrettyTable\nfrom table2string import Table\n\nnames = (\"plain text\", \"emoji\")\ntable = [\n    (\n        \"text\\ntext\",\n        \"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67\\n\"\n        \"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc68\\n\"\n        \"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83d\udc6f\ud83d\udc69\u200d\ud83e\uddbc\ud83d\udc6d\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66\\n\"\n        \"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\\n\"\n        \"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66\",\n    ),\n]\nt = PrettyTable(title=\"prettytable\", field_names=names, h_align=\"c\")\nt.add_rows(table)\nprint(t)\n\nt = Table(table, name=\"table2string\", column_names=names)\nt.print(h_align=\"^\", sep=(1,))\n```\n\n<details>\n<summary>Windows Terminal</summary>\n\n![emoji_example_1.png](images/emoji_example_Windows_Terminal.png)\n</details>\n\n<details>\n<summary>Windows 10</summary>\n\n![emoji_example_windows_10_terminal.png](images/emoji_example_windows_10_terminal.png)\n</details>\n\n<details>\n<summary>Windows 11</summary>\n\n![emoji_example_windows_11_terminal.png](images/emoji_example_windows_11_terminal.png)\n</details>\n\n<details>\n<summary>VT100 terminal emulator</summary>\n\n![emoji_example_VT100_terminal_emulator.png](images/emoji_example_VT100_terminal_emulator.png)\n</details>\n</details>\n\n\n## Subtable\n\n<details>\n<summary>Example</summary>\n\n```pycon\n>>> Table(\n...     [\n...         (\"1\",),\n...         (Table([(\"2\", \"3\")]),),\n...     ]\n... ).print()\n+-------+\n|     1 |\n+---+---+\n| 2 | 3 |\n+---+---+\n>>> Table([(\n...     Table([(\n...         Table([(\n...             Table([(\n...                 Table([(\n...                     Table([(\n...                         Table([(\n...                             Table(\n...                                 [\n...                                     (\"1\",),\n...                                     (Table([(\"2\", \"3\")]),),\n...                                 ]\n...                             ),\n...                         )]),\n...                     )]),\n...                 )]),\n...             )]),\n...         )]),\n...     )]),\n... )]).print()\n+-------+\n|     1 |\n+---+---+\n| 2 | 3 |\n+---+---+\n>>> Table(\n...     [\n...         (\n...             \"123\",\n...             Table(\n...                 [\n...                     (\"456\",),\n...                     (Table([(\"789\", \"101\")]),),\n...                 ]\n...             ),\n...         ),\n...     ]\n... ).print()\n+-----+-----------+\n| 123 |       456 |\n|     +-----+-----+\n|     | 789 | 101 |\n+-----+-----+-----+\n\n```\n</details>\n",
    "bugtrack_url": null,
    "license": "GPL2",
    "summary": "A library to convert tables to string with full support for line breaks and formatting",
    "version": "2.0.1",
    "project_urls": {
        "Documentation": "https://github.com/EgorKhabarov/table2string",
        "Homepage": "https://github.com/EgorKhabarov/table2string",
        "Issues": "https://github.com/EgorKhabarov/table2string/issues",
        "Repository": "https://github.com/EgorKhabarov/table2string"
    },
    "split_keywords": [
        "string",
        " table",
        " tools"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2350c359bd557327d7ff812ebe36957e4c9bd44138104a81266fb6d77f691987",
                "md5": "034734df8a6df6f8b5e27d59b7fcf5f8",
                "sha256": "47fb19351d1e925cdfdfa9f42b69c1a81954a7189cffc58b4c30fb974d57325f"
            },
            "downloads": -1,
            "filename": "table2string-2.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "034734df8a6df6f8b5e27d59b7fcf5f8",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 28441,
            "upload_time": "2024-09-30T00:22:14",
            "upload_time_iso_8601": "2024-09-30T00:22:14.296704Z",
            "url": "https://files.pythonhosted.org/packages/23/50/c359bd557327d7ff812ebe36957e4c9bd44138104a81266fb6d77f691987/table2string-2.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "37da975e339714ad97703965972766bb12857d26f8a4a7f1f18819cdbba6fad9",
                "md5": "590a6e73cb29bed4d40c400170e8b2e9",
                "sha256": "bae2be24df5a031a55bf5b3f4e0e016d5b45ddfbfb29ff72c21fdc68e517a1c4"
            },
            "downloads": -1,
            "filename": "table2string-2.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "590a6e73cb29bed4d40c400170e8b2e9",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 421305,
            "upload_time": "2024-09-30T00:22:16",
            "upload_time_iso_8601": "2024-09-30T00:22:16.381847Z",
            "url": "https://files.pythonhosted.org/packages/37/da/975e339714ad97703965972766bb12857d26f8a4a7f1f18819cdbba6fad9/table2string-2.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-09-30 00:22:16",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "EgorKhabarov",
    "github_project": "table2string",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "table2string"
}
        
Elapsed time: 0.78187s