Skip to main content

Format Python data as aligned terminal tables with no dependencies.

Project description

philiprehberger-cli-table

Tests PyPI version Last updated

philiprehberger-cli-table

Format Python data as aligned terminal tables with no dependencies.

Installation

pip install philiprehberger-cli-table

Usage

Dict list mode

from philiprehberger_cli_table import table

data = [
    {"name": "Alice", "age": 30, "city": "Berlin"},
    {"name": "Bob", "age": 25, "city": "Vienna"},
    {"name": "Charlie", "age": 35, "city": "Zurich"},
]

table(data)
# name     age  city
# -------  ---  ------
# Alice    30   Berlin
# Bob      25   Vienna
# Charlie  35   Zurich

Headers + rows mode

from philiprehberger_cli_table import table

table(
    headers=["Product", "Price", "Stock"],
    rows=[
        ["Widget", "9.99", "142"],
        ["Gadget", "24.99", "38"],
    ],
)
# Product  Price  Stock
# -------  -----  -----
# Widget   9.99   142
# Gadget   24.99  38

Column alignment

Numeric columns auto-right-align — no align config needed. Pass align only when you want to override the inferred alignment.

from philiprehberger_cli_table import table

table(
    data=[
        {"item": "Coffee", "qty": 3, "price": "4.50"},
        {"item": "Tea", "qty": 12, "price": "2.00"},
    ],
)
# item    qty  price
# ------  ---  -----
# Coffee    3   4.50
# Tea      12   2.00

# Override inferred alignment when needed
table(
    data=[{"item": "Coffee", "qty": 3}],
    align={"qty": "center"},
)

Styles

from philiprehberger_cli_table import format_table

# Markdown style
print(format_table(
    headers=["Name", "Score"],
    rows=[["Alice", "95"], ["Bob", "87"]],
    style="markdown",
))
# | Name  | Score |
# | ----- | ----- |
# | Alice | 95    |
# | Bob   | 87    |

# No borders
print(format_table(
    headers=["Name", "Score"],
    rows=[["Alice", "95"], ["Bob", "87"]],
    style="none",
))
# Name   Score
# Alice  95
# Bob    87

# Grid style with Unicode box-drawing borders
print(format_table(
    headers=["Name", "Score"],
    rows=[["Alice", "95"], ["Bob", "87"]],
    style="grid",
))
# ┌───────┬───────┐
# │ Name  │ Score │
# ├───────┼───────┤
# │ Alice │ 95    │
# │ Bob   │ 87    │
# └───────┴───────┘

Cell truncation

from philiprehberger_cli_table import table

table(
    data=[{"description": "A very long description that goes on and on"}],
    max_width=20,
)

Wide character support

Supports CJK and other wide Unicode characters with correct column alignment.

Footer / totals row

from philiprehberger_cli_table import table

table(
    headers=["Item", "Qty", "Total"],
    rows=[
        ["Coffee", "3", "12.00"],
        ["Tea", "2", "4.00"],
    ],
    footer=["Total", "5", "16.00"],
)
# Item    Qty  Total
# ------  ---  -----
# Coffee  3    12.00
# Tea     2     4.00
# ------  ---  -----
# Total   5    16.00

A footer can also be passed as a dict keyed by header name:

table(
    data=[{"item": "Coffee", "n": 3}, {"item": "Tea", "n": 2}],
    footer={"item": "Total", "n": 5},
)

API

Function Description
format_table(headers, rows, *, data, align, max_width, style, footer) Returns a formatted table as a string
table(data, headers, rows, **kwargs) Prints a formatted table to stdout

Parameters

Parameter Type Default Description
headers list[str] | None None Column header names
rows list[list[Any]] | None None List of row value lists
data list[dict[str, Any]] | None None List of dicts (keys become headers)
align dict[str, Align] | None None Per-column alignment: "left", "right", "center"
max_width int | None None Truncate cell values to this width
style Style "simple" Border style: "simple", "markdown", "none", "grid"
footer list | dict | None None Footer row rendered below a divider (totals/summary)

Development

pip install -e .
python -m pytest tests/ -v

Support

If you find this project useful:

Star the repo

🐛 Report issues

💡 Suggest features

❤️ Sponsor development

🌐 All Open Source Projects

💻 GitHub Profile

🔗 LinkedIn Profile

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

philiprehberger_cli_table-0.4.0.tar.gz (189.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

philiprehberger_cli_table-0.4.0-py3-none-any.whl (6.7 kB view details)

Uploaded Python 3

File details

Details for the file philiprehberger_cli_table-0.4.0.tar.gz.

File metadata

File hashes

Hashes for philiprehberger_cli_table-0.4.0.tar.gz
Algorithm Hash digest
SHA256 ecba8aab1fc54c6455517dad662d67a0339e33ad1822271a33c38573cfbf297e
MD5 9b7f8b5b88f9af9e619fd1e9493efd6b
BLAKE2b-256 80d864f9f2d0d884f3f7889ed3a09ac8d540e0374c24dda1b745ec5ecadc7ca8

See more details on using hashes here.

File details

Details for the file philiprehberger_cli_table-0.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for philiprehberger_cli_table-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d82c0953eb7167688c5ff622fed17db9f3dc186fce8d123bbf6af8f164280bf3
MD5 ea1d7a77e29eed44fb8fd03fcb954822
BLAKE2b-256 60745618717d914a6f62289006ecd078f11012c0bef51c9fb17374234b58ab6a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page