.. contents:: **pytablewriter**
:backlinks: top
:depth: 2
Summary
=========
`pytablewriter <https://github.com/thombashi/pytablewriter>`__ is a Python library to write a table in various formats: AsciiDoc / CSV / Elasticsearch / HTML / JavaScript / JSON / LaTeX / LDJSON / LTSV / Markdown / MediaWiki / NumPy / Excel / Pandas / Python / reStructuredText / SQLite / TOML / TSV / YAML.
.. image:: https://badge.fury.io/py/pytablewriter.svg
:target: https://badge.fury.io/py/pytablewriter
:alt: PyPI package version
.. image:: https://anaconda.org/conda-forge/pytablewriter/badges/version.svg
:target: https://anaconda.org/conda-forge/pytablewriter
:alt: conda-forge package version
.. image:: https://img.shields.io/pypi/pyversions/pytablewriter.svg
:target: https://pypi.org/project/pytablewriter/
:alt: Supported Python versions
.. image:: https://img.shields.io/pypi/implementation/pytablewriter.svg
:target: https://pypi.org/project/pytablewriter
:alt: Supported Python implementations
.. image:: https://github.com/thombashi/pytablewriter/actions/workflows/ci.yml/badge.svg
:target: https://github.com/thombashi/pytablewriter/actions/workflows/ci.yml
:alt: CI status of Linux/macOS/Windows
.. image:: https://coveralls.io/repos/github/thombashi/pytablewriter/badge.svg?branch=master
:target: https://coveralls.io/github/thombashi/pytablewriter?branch=master
:alt: Test coverage
.. image:: https://github.com/thombashi/pytablewriter/actions/workflows/github-code-scanning/codeql/badge.svg
:target: https://github.com/thombashi/pytablewriter/actions/workflows/github-code-scanning/codeql
:alt: CodeQL
Features
--------
- Write a table in various formats:
- Text formats:
- `AsciiDoc <https://asciidoc.org/>`__
- CSV / Tab-separated values (TSV) / Space-separated values (SSV)
- HTML / CSS
- JSON / `Line-delimited JSON(LDJSON) <https://en.wikipedia.org/wiki/JSON_streaming#Line-delimited_JSON>`__
- `Labeled Tab-separated Values (LTSV) <http://ltsv.org/>`__
- LaTeX: ``tabular``/``array`` environment
- Markdown: CommonMark / `GitHub Flavored Markdown (GFM) <https://github.github.com/gfm/>`__ / `kramdown <https://kramdown.gettalong.org/>`__
- `MediaWiki <https://www.mediawiki.org/wiki/MediaWiki>`__
- reStructuredText: `Grid Tables <http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#grid-tables>`__/`Simple Tables <http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#simple-tables>`__/`CSV Table <http://docutils.sourceforge.net/docs/ref/rst/directives.html#id4>`__
- Source code (definition of a variable that represents tabular data)
- JavaScript / `NumPy <https://www.numpy.org/>`__ (`numpy.array <https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html>`__) / `Pandas <https://pandas.pydata.org/>`__ (`pandas.DataFrame <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html>`__) / Python
- `TOML <https://github.com/toml-lang/toml>`__
- `YAML <https://yaml.org/>`__
- Unicode
- Binary file formats:
- Microsoft Excel :superscript:`TM` (``.xlsx``/``.xls`` file format)
- `pandas.DataFrame <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html>`__ pickle file
- `SQLite <https://www.sqlite.org/index.html>`__ database
- Application-specific formats:
- `Elasticsearch <https://www.elastic.co/products/elasticsearch>`__
- Automatic table cell formatting:
- Alignment
- Padding
- Decimal places of numbers
- Customize table cell styles:
- Text/Background color
- Text alignment
- Font size/weight
- Thousand separator for numbers: e.g. ``1,000``/``1 000``
- Configure output:
- Write a table to a stream such as a file/standard-output/string-buffer/Jupyter-Notebook
- Get rendered tabular text
- Data sources:
- nested list
- CSV
- `pandas.DataFrame <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html>`__ / `pandas.Series <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.html>`__
- etc.
- Multibyte character support
- ANSI color support
Installation
============
Installation: pip
------------------------------
::
pip install pytablewriter
Some of the formats require additional dependency packages, you can install these packages as follows:
.. csv-table:: Installation of optional dependencies
:header: Installation example, Remark
``pip install pytablewriter[es]``, Elasticsearch
``pip install pytablewriter[excel]``, Excel
``pip install pytablewriter[html]``, HTML
``pip install pytablewriter[sqlite]``, SQLite database
``pip install pytablewriter[toml]``, TOML
``pip install pytablewriter[theme]``, pytablewriter theme plugins
``pip install pytablewriter[all]``, Install all of the optional dependencies
Installation: conda
------------------------------
::
conda install -c conda-forge pytablewriter
Installation: apt
------------------------------
::
sudo add-apt-repository ppa:thombashi/ppa
sudo apt update
sudo apt install python3-pytablewriter
Examples
==========
Write tables
--------------
Write a Markdown table
~~~~~~~~~~~~~~~~~~~~~~~~
:Sample Code:
.. code-block:: python
from pytablewriter import MarkdownTableWriter
def main():
writer = MarkdownTableWriter(
table_name="example_table",
headers=["int", "float", "str", "bool", "mix", "time"],
value_matrix=[
[0, 0.1, "hoge", True, 0, "2017-01-01 03:04:05+0900"],
[2, "-2.23", "foo", False, None, "2017-12-23 45:01:23+0900"],
[3, 0, "bar", "true", "inf", "2017-03-03 33:44:55+0900"],
[-10, -9.9, "", "FALSE", "nan", "2017-01-01 00:00:00+0900"],
],
)
writer.write_table()
if __name__ == "__main__":
main()
:Output:
.. code-block::
# example_table
|int|float|str |bool | mix | time |
|--:|----:|----|-----|-------:|------------------------|
| 0| 0.10|hoge|True | 0|2017-01-01 03:04:05+0900|
| 2|-2.23|foo |False| |2017-12-23 12:34:51+0900|
| 3| 0.00|bar |True |Infinity|2017-03-03 22:44:55+0900|
|-10|-9.90| |False| NaN|2017-01-01 00:00:00+0900|
:Rendering Result:
.. figure:: https://cdn.jsdelivr.net/gh/thombashi/pytablewriter@master/docs/pages/examples/table_format/text/ss/markdown.png
:scale: 80%
:alt: https://github.com/thombashi/pytablewriter/blob/master/docs/pages/examples/table_format/text/ss/markdown.png
Rendered markdown at GitHub
Write a Markdown table with margins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:Sample Code:
.. code-block:: python
from pytablewriter import MarkdownTableWriter
def main():
writer = MarkdownTableWriter(
table_name="write a table with margins",
headers=["int", "float", "str", "bool", "mix", "time"],
value_matrix=[
[0, 0.1, "hoge", True, 0, "2017-01-01 03:04:05+0900"],
[2, "-2.23", "foo", False, None, "2017-12-23 45:01:23+0900"],
[3, 0, "bar", "true", "inf", "2017-03-03 33:44:55+0900"],
[-10, -9.9, "", "FALSE", "nan", "2017-01-01 00:00:00+0900"],
],
margin=1 # add a whitespace for both sides of each cell
)
writer.write_table()
if __name__ == "__main__":
main()
:Output:
.. code-block::
# write a table with margins
| int | float | str | bool | mix | time |
| --: | ----: | ---- | ----- | -------: | ------------------------ |
| 0 | 0.10 | hoge | True | 0 | 2017-01-01 03:04:05+0900 |
| 2 | -2.23 | foo | False | | 2017-12-23 12:34:51+0900 |
| 3 | 0.00 | bar | True | Infinity | 2017-03-03 22:44:55+0900 |
| -10 | -9.90 | | False | NaN | 2017-01-01 00:00:00+0900 |
``margin`` attribute can be available for all of the text format writer classes.
Write a GitHub Flavored Markdown (GFM) table
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
If you set ``flavor`` keyword argument of ``MarkdownTableWriter`` class to ``"github"`` or ``"gfm"``, the writer will output markdown tables with GitHub flavor.
GFM can apply some additional styles to tables such as ``fg_color`` (text color).
:Sample Code:
.. code-block:: python
from pytablewriter import MarkdownTableWriter
from pytablewriter.style import Style
writer = MarkdownTableWriter(
column_styles=[
Style(fg_color="red"),
Style(fg_color="green", decoration_line="underline"),
],
headers=["A", "B"],
value_matrix=[
["abc", 1],
["efg", 2],
],
margin=1,
flavor="github",
enable_ansi_escape=False,
)
writer.write_table()
Rendered results can be found at `here <https://github.com/thombashi/pytablewriter/blob/master/docs/pages/examples/output/markdown/gfm.md>`__
Apply styles to GFM table with programmatically
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Applying style filters to GFM allows for more flexible style settings for cells.
See also the `example <#style-filter>`_
Write a Markdown table to a stream or a file
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
`Refer an example <https://github.com/thombashi/pytablewriter/blob/master/examples/py/stream/configure_stream.py>`__
Write a table to an Excel sheet
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:Sample Code:
.. code-block:: python
from pytablewriter import ExcelXlsxTableWriter
def main():
writer = ExcelXlsxTableWriter()
writer.table_name = "example"
writer.headers = ["int", "float", "str", "bool", "mix", "time"]
writer.value_matrix = [
[0, 0.1, "hoge", True, 0, "2017-01-01 03:04:05+0900"],
[2, "-2.23", "foo", False, None, "2017-12-23 12:34:51+0900"],
[3, 0, "bar", "true", "inf", "2017-03-03 22:44:55+0900"],
[-10, -9.9, "", "FALSE", "nan", "2017-01-01 00:00:00+0900"],
]
writer.dump("sample.xlsx")
if __name__ == "__main__":
main()
:Output:
.. figure:: https://cdn.jsdelivr.net/gh/thombashi/pytablewriter@master/docs/pages/examples/table_format/binary/spreadsheet/ss/excel_single.png
:scale: 100%
:alt: https://github.com/thombashi/pytablewriter/blob/master/docs/pages/examples/table_format/binary/spreadsheet/ss/excel_single.png
Output excel file (``sample_single.xlsx``)
Write a Unicode table
~~~~~~~~~~~~~~~~~~~~~~~
:Sample Code:
.. code-block:: python
from pytablewriter import UnicodeTableWriter
def main():
writer = UnicodeTableWriter(
table_name="example_table",
headers=["int", "float", "str", "bool", "mix", "time"],
value_matrix=[
[0, 0.1, "hoge", True, 0, "2017-01-01 03:04:05+0900"],
[2, "-2.23", "foo", False, None, "2017-12-23 45:01:23+0900"],
[3, 0, "bar", "true", "inf", "2017-03-03 33:44:55+0900"],
[-10, -9.9, "", "FALSE", "nan", "2017-01-01 00:00:00+0900"],
]
)
writer.write_table()
if __name__ == "__main__":
main()
:Output:
.. code-block::
┌───┬─────┬────┬─────┬────────┬────────────────────────┐
│int│float│str │bool │ mix │ time │
├───┼─────┼────┼─────┼────────┼────────────────────────┤
│ 0│ 0.10│hoge│True │ 0│2017-01-01 03:04:05+0900│
├───┼─────┼────┼─────┼────────┼────────────────────────┤
│ 2│-2.23│foo │False│ │2017-12-23 12:34:51+0900│
├───┼─────┼────┼─────┼────────┼────────────────────────┤
│ 3│ 0.00│bar │True │Infinity│2017-03-03 22:44:55+0900│
├───┼─────┼────┼─────┼────────┼────────────────────────┤
│-10│-9.90│ │False│ NaN│2017-01-01 00:00:00+0900│
└───┴─────┴────┴─────┴────────┴────────────────────────┘
Write a table with JavaScript format (as a nested list variable definition)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:Sample Code:
.. code-block:: python
import pytablewriter as ptw
def main():
writer = ptw.JavaScriptTableWriter(
table_name="js_variable",
headers=["int", "float", "str", "bool", "mix", "time"],
value_matrix=[
[0, 0.1, "hoge", True, 0, "2017-01-01 03:04:05+0900"],
[2, "-2.23", "foo", False, None, "2017-12-23 45:01:23+0900"],
[3, 0, "bar", "true", "inf", "2017-03-03 33:44:55+0900"],
[-10, -9.9, "", "FALSE", "nan", "2017-01-01 00:00:00+0900"],
],
)
writer.write_table()
if __name__ == "__main__":
main()
:Output:
.. code-block:: js
const js_variable = [
["int", "float", "str", "bool", "mix", "time"],
[0, 0.1, "hoge", true, 0, "2017-01-01 03:04:05+0900"],
[2, -2.23, "foo", false, null, "2017-12-23 45:01:23+0900"],
[3, 0, "bar", true, Infinity, "2017-03-03 33:44:55+0900"],
[-10, -9.9, "", "FALSE", NaN, "2017-01-01 00:00:00+0900"]
];
Write a Markdown table from ``pandas.DataFrame`` instance
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
``from_dataframe`` method of writer classes will set up tabular data from ``pandas.DataFrame``:
:Sample Code:
.. code-block:: python
from textwrap import dedent
import pandas as pd
import io
from pytablewriter import MarkdownTableWriter
def main():
csv_data = io.StringIO(dedent("""\
"i","f","c","if","ifc","bool","inf","nan","mix_num","time"
1,1.10,"aa",1.0,"1",True,Infinity,NaN,1,"2017-01-01 00:00:00+09:00"
2,2.20,"bbb",2.2,"2.2",False,Infinity,NaN,Infinity,"2017-01-02 03:04:05+09:00"
3,3.33,"cccc",-3.0,"ccc",True,Infinity,NaN,NaN,"2017-01-01 00:00:00+09:00"
"""))
df = pd.read_csv(csv_data, sep=',')
writer = MarkdownTableWriter(dataframe=df)
writer.write_table()
if __name__ == "__main__":
main()
:Output:
.. code-block::
| i | f | c | if |ifc|bool | inf |nan|mix_num | time |
|--:|---:|----|---:|---|-----|--------|---|-------:|-------------------------|
| 1|1.10|aa | 1.0| 1|True |Infinity|NaN| 1|2017-01-01 00:00:00+09:00|
| 2|2.20|bbb | 2.2|2.2|False|Infinity|NaN|Infinity|2017-01-02 03:04:05+09:00|
| 3|3.33|cccc|-3.0|ccc|True |Infinity|NaN| NaN|2017-01-01 00:00:00+09:00|
Adding a column of the DataFrame index if you specify ``add_index_column=True``:
:Sample Code:
.. code-block:: python
import pandas as pd
import pytablewriter as ptw
def main():
writer = ptw.MarkdownTableWriter(table_name="add_index_column")
writer.from_dataframe(
pd.DataFrame({"A": [1, 2], "B": [10, 11]}, index=["a", "b"]),
add_index_column=True,
)
writer.write_table()
if __name__ == "__main__":
main()
:Output:
.. code-block::
# add_index_column
| | A | B |
|---|--:|--:|
|a | 1| 10|
|b | 2| 11|
Write a Markdown table from space-separated values
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:Sample Code:
.. code-block:: python
import pytablewriter as ptw
def main():
writer = ptw.MarkdownTableWriter(table_name="ps")
writer.from_csv(
"""
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 77664 8784 ? Ss May11 0:02 /sbin/init
root 2 0.0 0.0 0 0 ? S May11 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? I< May11 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? I< May11 0:00 [mm_percpu_wq]
root 7 0.0 0.0 0 0 ? S May11 0:01 [ksoftirqd/0]
""",
delimiter=" ",
)
writer.write_table()
if __name__ == "__main__":
main()
:Output:
.. code-block::
# ps
|USER|PID|%CPU|%MEM| VSZ |RSS |TTY|STAT|START|TIME| COMMAND |
|----|--:|---:|---:|----:|---:|---|----|-----|----|--------------|
|root| 1| 0| 0.4|77664|8784|? |Ss |May11|0:02|/sbin/init |
|root| 2| 0| 0.0| 0| 0|? |S |May11|0:00|[kthreadd] |
|root| 4| 0| 0.0| 0| 0|? |I< |May11|0:00|[kworker/0:0H]|
|root| 6| 0| 0.0| 0| 0|? |I< |May11|0:00|[mm_percpu_wq]|
|root| 7| 0| 0.0| 0| 0|? |S |May11|0:01|[ksoftirqd/0] |
Get rendered tabular text as str
----------------------------------
``dumps`` method returns rendered tabular text.
``dumps`` only available for text format writers.
:Sample Code:
.. code-block:: python
import pytablewriter as ptw
def main():
writer = ptw.MarkdownTableWriter(
headers=["int", "float", "str", "bool", "mix", "time"],
value_matrix=[
[0, 0.1, "hoge", True, 0, "2017-01-01 03:04:05+0900"],
[2, "-2.23", "foo", False, None, "2017-12-23 45:01:23+0900"],
[3, 0, "bar", "true", "inf", "2017-03-03 33:44:55+0900"],
[-10, -9.9, "", "FALSE", "nan", "2017-01-01 00:00:00+0900"],
],
)
print(writer.dumps())
if __name__ == "__main__":
main()
:Output:
.. code-block::
|int|float|str |bool | mix | time |
|--:|----:|----|-----|-------:|------------------------|
| 0| 0.10|hoge|True | 0|2017-01-01 03:04:05+0900|
| 2|-2.23|foo |False| |2017-12-23 45:01:23+0900|
| 3| 0.00|bar |True |Infinity|2017-03-03 33:44:55+0900|
|-10|-9.90| |False| NaN|2017-01-01 00:00:00+0900|
Configure table styles
------------------------
Column styles
~~~~~~~~~~~~~~~
Writers can specify
`Style <https://pytablewriter.rtfd.io/en/latest/pages/reference/style.html>`__
for each column by ``column_styles`` attribute of writer classes.
:Sample Code:
.. code-block:: python
import pytablewriter as ptw
from pytablewriter.style import Style
def main():
writer = ptw.MarkdownTableWriter(
table_name="set style by column_styles",
headers=[
"auto align",
"left align",
"center align",
"bold",
"italic",
"bold italic ts",
],
value_matrix=[
[11, 11, 11, 11, 11, 11],
[1234, 1234, 1234, 1234, 1234, 1234],
],
column_styles=[
Style(),
Style(align="left"),
Style(align="center"),
Style(font_weight="bold"),
Style(font_style="italic"),
Style(font_weight="bold", font_style="italic", thousand_separator=","),
], # specify styles for each column
)
writer.write_table()
if __name__ == "__main__":
main()
:Output:
.. code-block::
# set style by styles
|auto align|left align|center align| bold |italic|bold italic ts|
|---------:|----------|:----------:|-------:|-----:|-------------:|
| 11|11 | 11 | **11**| _11_| _**11**_|
| 1234|1234 | 1234 |**1234**|_1234_| _**1,234**_|
`Rendering result <https://github.com/thombashi/pytablewriter/tree/master/docs/pages/examples/style/output.md>`__
You can also set ``Style`` to a specific column with an index or header by using ``set_style`` method:
:Sample Code:
.. code-block:: python
from pytablewriter import MarkdownTableWriter
from pytablewriter.style import Style
def main():
writer = MarkdownTableWriter()
writer.headers = ["A", "B", "C",]
writer.value_matrix = [[11, 11, 11], [1234, 1234, 1234]]
writer.table_name = "set style by column index"
writer.set_style(1, Style(align="center", font_weight="bold"))
writer.set_style(2, Style(thousand_separator=" "))
writer.write_table()
writer.write_null_line()
writer.table_name = "set style by header"
writer.set_style("B", Style(font_style="italic"))
writer.write_table()
if __name__ == "__main__":
main()
:Output:
.. code-block::
# set style by column index
| A | B | C |
|---:|:------:|----:|
| 11| **11** | 11|
|1234|**1234**|1 234|
# set style by header
| A | B | C |
|---:|-----:|----:|
| 11| _11_| 11|
|1234|_1234_|1 234|
Style filter
~~~~~~~~~~~~~~
You can apply styles to specific cells by using style filters.
Style filters will be written as Python functions.
Examples of a style filter function and how you apply it are as follows:
:Sample Code:
.. code-block:: python
from typing import Any, Optional
from pytablewriter import MarkdownTableWriter
from pytablewriter.style import Cell, Style
def style_filter(cell: Cell, **kwargs: Any) -> Optional[Style]:
if cell.is_header_row():
return None
if cell.col == 0:
return Style(font_weight="bold")
value = int(cell.value)
if value > 80:
return Style(fg_color="red", font_weight="bold", decoration_line="underline")
elif value > 50:
return Style(fg_color="yellow", font_weight="bold")
elif value > 20:
return Style(fg_color="green")
return Style(fg_color="lightblue")
writer = MarkdownTableWriter(
table_name="style filter example",
headers=["Key", "Value 1", "Value 2"],
value_matrix=[
["A", 95, 40],
["B", 55, 5],
["C", 30, 85],
["D", 0, 69],
],
flavor="github",
enable_ansi_escape=False,
)
writer.add_style_filter(style_filter)
writer.write_table()
Rendered results can be found at `here <https://github.com/thombashi/pytablewriter/blob/master/docs/pages/examples/output/markdown/style_filter.md>`__
Theme
~~~~~~~
Themes consists of a set of style filters.
The following command will install external predefined themes:
::
pip install pytablewriter[theme]
Themes can be set via the constructor of the writer classes or the ``set_theme`` method.
The following is an example of setting the ``altrow`` theme via the constructor.
``altrow`` theme will be colored rows alternatively:
:Sample Code:
.. code-block:: python
import pytablewriter as ptw
writer = ptw.TableWriterFactory.create_from_format_name(
"markdown",
headers=["INT", "STR"],
value_matrix=[[1, "hoge"], [2, "foo"], [3, "bar"]],
margin=1,
theme="altrow",
)
writer.write_table()
:Output:
.. figure:: https://cdn.jsdelivr.net/gh/thombashi/pytablewriter-altrow-theme@master/ss/ptw-altrow-theme_example_default.png
:scale: 100%
:alt: https://github.com/thombashi/pytablewriter-altrow-theme/blob/master/ss/ptw-altrow-theme_example_default.png
`[theme]` extras includes the following themes:
- `pytablewriter-altrow-theme <https://github.com/thombashi/pytablewriter-altrow-theme>`__
- `Generated HTML table example <https://thombashi.github.io/pytablewriter-altrow-theme/example.html>`__
- `pytablewriter-altcol-theme <https://github.com/thombashi/pytablewriter-altcol-theme>`__
- `Generated HTML table example <https://thombashi.github.io/pytablewriter-altcol-theme/example.html>`__
Make tables for specific applications
---------------------------------------
Render a table on Jupyter Notebook
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
All table writer class instances in ``pytablewriter`` can render in Jupyter Notebook.
To render writers at notebook cells, you will require the dependency packages to be installed either by:
- ``pip install pytablewriter[html]`` or
- ``pip install pytablewriter[all]``
Jupyter Notebook code examples can be found `here <https://nbviewer.jupyter.org/github/thombashi/pytablewriter/blob/master/examples/ipynb/jupyter_notebook_example.ipynb>`__:
.. figure:: https://cdn.jsdelivr.net/gh/thombashi/pytablewriter@master/ss/jupyter_notebook.png
:scale: 100%
:alt: https://github.com/thombashi/pytablewriter/blob/master/ss/jupyter_notebook.png
Table rendering results of Jupyter Notebook
Multibyte character support
-----------------------------
Write a table using multibyte character
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can use multibyte characters as table data.
Multibyte characters are also properly padded and aligned.
:Sample Code:
.. code-block:: python
import pytablewriter as ptw
def main():
writer = ptw.RstSimpleTableWriter(
table_name="生成に関するパターン",
headers=["パターン名", "概要", "GoF", "Code Complete[1]"],
value_matrix=[
["Abstract Factory", "関連する一連のインスタンスを状況に応じて、適切に生成する方法を提供する。", "Yes", "Yes"],
["Builder", "複合化されたインスタンスの生成過程を隠蔽する。", "Yes", "No"],
["Factory Method", "実際に生成されるインスタンスに依存しない、インスタンスの生成方法を提供する。", "Yes", "Yes"],
["Prototype", "同様のインスタンスを生成するために、原型のインスタンスを複製する。", "Yes", "No"],
["Singleton", "あるクラスについて、インスタンスが単一であることを保証する。", "Yes", "Yes"],
],
)
writer.write_table()
if __name__ == "__main__":
main()
:Output:
.. figure:: https://cdn.jsdelivr.net/gh/thombashi/pytablewriter@master/docs/pages/examples/multibyte/ss/multi_byte_char.png
:scale: 100%
:alt: https://github.com/thombashi/pytablewriter/blob/master/docs/pages/examples/multibyte/ss/multi_byte_char.png
Output of multi-byte character table
Multiprocessing
-----------------
You can increase the number of workers to process table data via ``max_workers`` attribute of a writer.
The more ``max_workers`` the less processing time when tabular data is large and the execution environment has available cores.
If you increase ``max_workers`` larger than one, recommend using main guarded as follows to avoid problems caused by multi-processing:
.. code-block:: python
from multiprocessing import cpu_count
import pytablewriter as ptw
def main():
writer = ptw.MarkdownTableWriter()
writer.max_workers = cpu_count()
...
if __name__ == "__main__":
main()
For more information
----------------------
More examples are available at
https://pytablewriter.rtfd.io/en/latest/pages/examples/index.html
Dependencies
============
- Python 3.7+
- `Python package dependencies (automatically installed) <https://github.com/thombashi/pytablewriter/network/dependencies>`__
Optional dependencies
---------------------
- ``logging`` extras
- `loguru <https://github.com/Delgan/loguru>`__: Used for logging if the package installed
- ``from`` extras
- `pytablereader <https://github.com/thombashi/pytablereader>`__
- ``es`` extra
- `elasticsearch <https://github.com/elastic/elasticsearch-py>`__
- ``excel`` extras
- `xlwt <http://www.python-excel.org/>`__
- `XlsxWriter <https://github.com/jmcnamara/XlsxWriter>`__
- ``html`` extras
- `dominate <https://github.com/Knio/dominate/>`__
- ``sqlite`` extras
- `SimpleSQLite <https://github.com/thombashi/SimpleSQLite>`__
- ``theme`` extras
- `pytablewriter-altrow-theme <https://github.com/thombashi/pytablewriter-altrow-theme>`__
- `pytablewriter-altcol-theme <https://github.com/thombashi/pytablewriter-altcol-theme>`__
- ``toml`` extras
- `toml <https://github.com/uiri/toml>`__
Documentation
===============
https://pytablewriter.rtfd.io/
Projects using pytablewriter
==================================
- `pytest-md-report <https://github.com/thombashi/pytest-md-report>`__
Related Projects
==================================
- `pytablereader <https://github.com/thombashi/pytablereader>`__
- Tabular data loaded by ``pytablereader`` can be written another tabular data format with ``pytablewriter``.
Sponsors
====================================
.. image:: https://avatars.githubusercontent.com/u/44389260?s=48&u=6da7176e51ae2654bcfd22564772ef8a3bb22318&v=4
:target: https://github.com/chasbecker
:alt: Charles Becker (chasbecker)
.. image:: https://avatars.githubusercontent.com/u/46711571?s=48&u=57687c0e02d5d6e8eeaf9177f7b7af4c9f275eb5&v=4
:target: https://github.com/Arturi0
:alt: onetime: Arturi0
.. image:: https://avatars.githubusercontent.com/u/3658062?s=48&v=4
:target: https://github.com/b4tman
:alt: onetime: Dmitry Belyaev (b4tman)
`Become a sponsor <https://github.com/sponsors/thombashi>`__
Raw data
{
"_id": null,
"home_page": "https://github.com/thombashi/pytablewriter",
"name": "pytablewriter",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": "",
"keywords": "AsciiDoc,table,CSV,Excel,JavaScript,JSON,LaTeX,LTSV,Markdown,MediaWiki,HTML,pandas,reStructuredText,SQLite,TSV,TOML",
"author": "Tsuyoshi Hombashi",
"author_email": "tsuyoshi.hombashi@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/cc/a9/76aa4430d32ae10b23e4347006dc4c67a3e2a00621e4bb38a60c1a77f15e/pytablewriter-1.2.0.tar.gz",
"platform": null,
"description": ".. contents:: **pytablewriter**\n :backlinks: top\n :depth: 2\n\nSummary\n=========\n`pytablewriter <https://github.com/thombashi/pytablewriter>`__ is a Python library to write a table in various formats: AsciiDoc / CSV / Elasticsearch / HTML / JavaScript / JSON / LaTeX / LDJSON / LTSV / Markdown / MediaWiki / NumPy / Excel / Pandas / Python / reStructuredText / SQLite / TOML / TSV / YAML.\n\n.. image:: https://badge.fury.io/py/pytablewriter.svg\n :target: https://badge.fury.io/py/pytablewriter\n :alt: PyPI package version\n\n.. image:: https://anaconda.org/conda-forge/pytablewriter/badges/version.svg\n :target: https://anaconda.org/conda-forge/pytablewriter\n :alt: conda-forge package version\n\n.. image:: https://img.shields.io/pypi/pyversions/pytablewriter.svg\n :target: https://pypi.org/project/pytablewriter/\n :alt: Supported Python versions\n\n.. image:: https://img.shields.io/pypi/implementation/pytablewriter.svg\n :target: https://pypi.org/project/pytablewriter\n :alt: Supported Python implementations\n\n.. image:: https://github.com/thombashi/pytablewriter/actions/workflows/ci.yml/badge.svg\n :target: https://github.com/thombashi/pytablewriter/actions/workflows/ci.yml\n :alt: CI status of Linux/macOS/Windows\n\n.. image:: https://coveralls.io/repos/github/thombashi/pytablewriter/badge.svg?branch=master\n :target: https://coveralls.io/github/thombashi/pytablewriter?branch=master\n :alt: Test coverage\n\n.. image:: https://github.com/thombashi/pytablewriter/actions/workflows/github-code-scanning/codeql/badge.svg\n :target: https://github.com/thombashi/pytablewriter/actions/workflows/github-code-scanning/codeql\n :alt: CodeQL\n\nFeatures\n--------\n- Write a table in various formats:\n - Text formats:\n - `AsciiDoc <https://asciidoc.org/>`__\n - CSV / Tab-separated values (TSV) / Space-separated values (SSV)\n - HTML / CSS\n - JSON / `Line-delimited JSON(LDJSON) <https://en.wikipedia.org/wiki/JSON_streaming#Line-delimited_JSON>`__\n - `Labeled Tab-separated Values (LTSV) <http://ltsv.org/>`__\n - LaTeX: ``tabular``/``array`` environment\n - Markdown: CommonMark / `GitHub Flavored Markdown (GFM) <https://github.github.com/gfm/>`__ / `kramdown <https://kramdown.gettalong.org/>`__\n - `MediaWiki <https://www.mediawiki.org/wiki/MediaWiki>`__\n - reStructuredText: `Grid Tables <http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#grid-tables>`__/`Simple Tables <http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#simple-tables>`__/`CSV Table <http://docutils.sourceforge.net/docs/ref/rst/directives.html#id4>`__\n - Source code (definition of a variable that represents tabular data)\n - JavaScript / `NumPy <https://www.numpy.org/>`__ (`numpy.array <https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html>`__) / `Pandas <https://pandas.pydata.org/>`__ (`pandas.DataFrame <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html>`__) / Python\n - `TOML <https://github.com/toml-lang/toml>`__\n - `YAML <https://yaml.org/>`__\n - Unicode\n - Binary file formats:\n - Microsoft Excel :superscript:`TM` (``.xlsx``/``.xls`` file format)\n - `pandas.DataFrame <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html>`__ pickle file\n - `SQLite <https://www.sqlite.org/index.html>`__ database\n - Application-specific formats:\n - `Elasticsearch <https://www.elastic.co/products/elasticsearch>`__\n- Automatic table cell formatting:\n - Alignment\n - Padding\n - Decimal places of numbers\n- Customize table cell styles:\n - Text/Background color\n - Text alignment\n - Font size/weight\n - Thousand separator for numbers: e.g. ``1,000``/``1 000``\n- Configure output:\n - Write a table to a stream such as a file/standard-output/string-buffer/Jupyter-Notebook\n - Get rendered tabular text\n- Data sources:\n - nested list\n - CSV\n - `pandas.DataFrame <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html>`__ / `pandas.Series <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.html>`__\n - etc.\n- Multibyte character support\n- ANSI color support\n\nInstallation\n============\n\nInstallation: pip\n------------------------------\n::\n\n pip install pytablewriter\n\nSome of the formats require additional dependency packages, you can install these packages as follows:\n\n.. csv-table:: Installation of optional dependencies\n :header: Installation example, Remark\n\n ``pip install pytablewriter[es]``, Elasticsearch\n ``pip install pytablewriter[excel]``, Excel\n ``pip install pytablewriter[html]``, HTML\n ``pip install pytablewriter[sqlite]``, SQLite database\n ``pip install pytablewriter[toml]``, TOML\n ``pip install pytablewriter[theme]``, pytablewriter theme plugins\n ``pip install pytablewriter[all]``, Install all of the optional dependencies\n\nInstallation: conda\n------------------------------\n::\n\n conda install -c conda-forge pytablewriter\n\nInstallation: apt\n------------------------------\n::\n\n sudo add-apt-repository ppa:thombashi/ppa\n sudo apt update\n sudo apt install python3-pytablewriter\n\nExamples\n==========\nWrite tables\n--------------\nWrite a Markdown table\n~~~~~~~~~~~~~~~~~~~~~~~~\n:Sample Code:\n .. code-block:: python\n\n from pytablewriter import MarkdownTableWriter\n\n def main():\n writer = MarkdownTableWriter(\n table_name=\"example_table\",\n headers=[\"int\", \"float\", \"str\", \"bool\", \"mix\", \"time\"],\n value_matrix=[\n [0, 0.1, \"hoge\", True, 0, \"2017-01-01 03:04:05+0900\"],\n [2, \"-2.23\", \"foo\", False, None, \"2017-12-23 45:01:23+0900\"],\n [3, 0, \"bar\", \"true\", \"inf\", \"2017-03-03 33:44:55+0900\"],\n [-10, -9.9, \"\", \"FALSE\", \"nan\", \"2017-01-01 00:00:00+0900\"],\n ],\n )\n writer.write_table()\n\n if __name__ == \"__main__\":\n main()\n\n:Output:\n .. code-block::\n\n # example_table\n |int|float|str |bool | mix | time |\n |--:|----:|----|-----|-------:|------------------------|\n | 0| 0.10|hoge|True | 0|2017-01-01 03:04:05+0900|\n | 2|-2.23|foo |False| |2017-12-23 12:34:51+0900|\n | 3| 0.00|bar |True |Infinity|2017-03-03 22:44:55+0900|\n |-10|-9.90| |False| NaN|2017-01-01 00:00:00+0900|\n\n:Rendering Result:\n .. figure:: https://cdn.jsdelivr.net/gh/thombashi/pytablewriter@master/docs/pages/examples/table_format/text/ss/markdown.png\n :scale: 80%\n :alt: https://github.com/thombashi/pytablewriter/blob/master/docs/pages/examples/table_format/text/ss/markdown.png\n\n Rendered markdown at GitHub\n\nWrite a Markdown table with margins\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n:Sample Code:\n .. code-block:: python\n\n from pytablewriter import MarkdownTableWriter\n\n def main():\n writer = MarkdownTableWriter(\n table_name=\"write a table with margins\",\n headers=[\"int\", \"float\", \"str\", \"bool\", \"mix\", \"time\"],\n value_matrix=[\n [0, 0.1, \"hoge\", True, 0, \"2017-01-01 03:04:05+0900\"],\n [2, \"-2.23\", \"foo\", False, None, \"2017-12-23 45:01:23+0900\"],\n [3, 0, \"bar\", \"true\", \"inf\", \"2017-03-03 33:44:55+0900\"],\n [-10, -9.9, \"\", \"FALSE\", \"nan\", \"2017-01-01 00:00:00+0900\"],\n ],\n margin=1 # add a whitespace for both sides of each cell\n )\n writer.write_table()\n\n if __name__ == \"__main__\":\n main()\n\n:Output:\n .. code-block::\n\n # write a table with margins\n | int | float | str | bool | mix | time |\n | --: | ----: | ---- | ----- | -------: | ------------------------ |\n | 0 | 0.10 | hoge | True | 0 | 2017-01-01 03:04:05+0900 |\n | 2 | -2.23 | foo | False | | 2017-12-23 12:34:51+0900 |\n | 3 | 0.00 | bar | True | Infinity | 2017-03-03 22:44:55+0900 |\n | -10 | -9.90 | | False | NaN | 2017-01-01 00:00:00+0900 |\n\n``margin`` attribute can be available for all of the text format writer classes.\n\nWrite a GitHub Flavored Markdown (GFM) table\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nIf you set ``flavor`` keyword argument of ``MarkdownTableWriter`` class to ``\"github\"`` or ``\"gfm\"``, the writer will output markdown tables with GitHub flavor.\nGFM can apply some additional styles to tables such as ``fg_color`` (text color).\n\n:Sample Code:\n .. code-block:: python\n\n from pytablewriter import MarkdownTableWriter\n from pytablewriter.style import Style\n\n writer = MarkdownTableWriter(\n column_styles=[\n Style(fg_color=\"red\"),\n Style(fg_color=\"green\", decoration_line=\"underline\"),\n ],\n headers=[\"A\", \"B\"],\n value_matrix=[\n [\"abc\", 1],\n [\"efg\", 2],\n ],\n margin=1,\n flavor=\"github\",\n enable_ansi_escape=False,\n )\n writer.write_table()\n\nRendered results can be found at `here <https://github.com/thombashi/pytablewriter/blob/master/docs/pages/examples/output/markdown/gfm.md>`__\n\nApply styles to GFM table with programmatically\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nApplying style filters to GFM allows for more flexible style settings for cells.\nSee also the `example <#style-filter>`_\n\nWrite a Markdown table to a stream or a file\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n`Refer an example <https://github.com/thombashi/pytablewriter/blob/master/examples/py/stream/configure_stream.py>`__\n\nWrite a table to an Excel sheet\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n:Sample Code:\n .. code-block:: python\n\n from pytablewriter import ExcelXlsxTableWriter\n\n def main():\n writer = ExcelXlsxTableWriter()\n writer.table_name = \"example\"\n writer.headers = [\"int\", \"float\", \"str\", \"bool\", \"mix\", \"time\"]\n writer.value_matrix = [\n [0, 0.1, \"hoge\", True, 0, \"2017-01-01 03:04:05+0900\"],\n [2, \"-2.23\", \"foo\", False, None, \"2017-12-23 12:34:51+0900\"],\n [3, 0, \"bar\", \"true\", \"inf\", \"2017-03-03 22:44:55+0900\"],\n [-10, -9.9, \"\", \"FALSE\", \"nan\", \"2017-01-01 00:00:00+0900\"],\n ]\n writer.dump(\"sample.xlsx\")\n\n if __name__ == \"__main__\":\n main()\n\n:Output:\n .. figure:: https://cdn.jsdelivr.net/gh/thombashi/pytablewriter@master/docs/pages/examples/table_format/binary/spreadsheet/ss/excel_single.png\n :scale: 100%\n :alt: https://github.com/thombashi/pytablewriter/blob/master/docs/pages/examples/table_format/binary/spreadsheet/ss/excel_single.png\n\n Output excel file (``sample_single.xlsx``)\n\nWrite a Unicode table\n~~~~~~~~~~~~~~~~~~~~~~~\n:Sample Code:\n .. code-block:: python\n\n from pytablewriter import UnicodeTableWriter\n\n def main():\n writer = UnicodeTableWriter(\n table_name=\"example_table\",\n headers=[\"int\", \"float\", \"str\", \"bool\", \"mix\", \"time\"],\n value_matrix=[\n [0, 0.1, \"hoge\", True, 0, \"2017-01-01 03:04:05+0900\"],\n [2, \"-2.23\", \"foo\", False, None, \"2017-12-23 45:01:23+0900\"],\n [3, 0, \"bar\", \"true\", \"inf\", \"2017-03-03 33:44:55+0900\"],\n [-10, -9.9, \"\", \"FALSE\", \"nan\", \"2017-01-01 00:00:00+0900\"],\n ]\n )\n writer.write_table()\n\n if __name__ == \"__main__\":\n main()\n\n:Output:\n .. code-block::\n\n \u250c\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\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\u2500\u2500\u2500\u2500\u2500\u2510\n \u2502int\u2502float\u2502str \u2502bool \u2502 mix \u2502 time \u2502\n \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\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\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 0\u2502 0.10\u2502hoge\u2502True \u2502 0\u25022017-01-01 03:04:05+0900\u2502\n \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\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\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 2\u2502-2.23\u2502foo \u2502False\u2502 \u25022017-12-23 12:34:51+0900\u2502\n \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\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\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 3\u2502 0.00\u2502bar \u2502True \u2502Infinity\u25022017-03-03 22:44:55+0900\u2502\n \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\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\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502-10\u2502-9.90\u2502 \u2502False\u2502 NaN\u25022017-01-01 00:00:00+0900\u2502\n \u2514\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\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\u2500\u2500\u2500\u2500\u2500\u2518\n\nWrite a table with JavaScript format (as a nested list variable definition)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n:Sample Code:\n .. code-block:: python\n\n import pytablewriter as ptw\n\n\n def main():\n writer = ptw.JavaScriptTableWriter(\n table_name=\"js_variable\",\n headers=[\"int\", \"float\", \"str\", \"bool\", \"mix\", \"time\"],\n value_matrix=[\n [0, 0.1, \"hoge\", True, 0, \"2017-01-01 03:04:05+0900\"],\n [2, \"-2.23\", \"foo\", False, None, \"2017-12-23 45:01:23+0900\"],\n [3, 0, \"bar\", \"true\", \"inf\", \"2017-03-03 33:44:55+0900\"],\n [-10, -9.9, \"\", \"FALSE\", \"nan\", \"2017-01-01 00:00:00+0900\"],\n ],\n )\n\n writer.write_table()\n\n\n if __name__ == \"__main__\":\n main()\n\n:Output:\n .. code-block:: js\n\n const js_variable = [\n [\"int\", \"float\", \"str\", \"bool\", \"mix\", \"time\"],\n [0, 0.1, \"hoge\", true, 0, \"2017-01-01 03:04:05+0900\"],\n [2, -2.23, \"foo\", false, null, \"2017-12-23 45:01:23+0900\"],\n [3, 0, \"bar\", true, Infinity, \"2017-03-03 33:44:55+0900\"],\n [-10, -9.9, \"\", \"FALSE\", NaN, \"2017-01-01 00:00:00+0900\"]\n ];\n\nWrite a Markdown table from ``pandas.DataFrame`` instance\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n``from_dataframe`` method of writer classes will set up tabular data from ``pandas.DataFrame``:\n\n:Sample Code:\n .. code-block:: python\n\n from textwrap import dedent\n import pandas as pd\n import io\n from pytablewriter import MarkdownTableWriter\n\n def main():\n csv_data = io.StringIO(dedent(\"\"\"\\\n \"i\",\"f\",\"c\",\"if\",\"ifc\",\"bool\",\"inf\",\"nan\",\"mix_num\",\"time\"\n 1,1.10,\"aa\",1.0,\"1\",True,Infinity,NaN,1,\"2017-01-01 00:00:00+09:00\"\n 2,2.20,\"bbb\",2.2,\"2.2\",False,Infinity,NaN,Infinity,\"2017-01-02 03:04:05+09:00\"\n 3,3.33,\"cccc\",-3.0,\"ccc\",True,Infinity,NaN,NaN,\"2017-01-01 00:00:00+09:00\"\n \"\"\"))\n df = pd.read_csv(csv_data, sep=',')\n\n writer = MarkdownTableWriter(dataframe=df)\n writer.write_table()\n\n if __name__ == \"__main__\":\n main()\n\n:Output:\n .. code-block::\n\n | i | f | c | if |ifc|bool | inf |nan|mix_num | time |\n |--:|---:|----|---:|---|-----|--------|---|-------:|-------------------------|\n | 1|1.10|aa | 1.0| 1|True |Infinity|NaN| 1|2017-01-01 00:00:00+09:00|\n | 2|2.20|bbb | 2.2|2.2|False|Infinity|NaN|Infinity|2017-01-02 03:04:05+09:00|\n | 3|3.33|cccc|-3.0|ccc|True |Infinity|NaN| NaN|2017-01-01 00:00:00+09:00|\n\n\nAdding a column of the DataFrame index if you specify ``add_index_column=True``:\n\n:Sample Code:\n .. code-block:: python\n\n import pandas as pd\n import pytablewriter as ptw\n\n def main():\n writer = ptw.MarkdownTableWriter(table_name=\"add_index_column\")\n writer.from_dataframe(\n pd.DataFrame({\"A\": [1, 2], \"B\": [10, 11]}, index=[\"a\", \"b\"]),\n add_index_column=True,\n )\n writer.write_table()\n\n if __name__ == \"__main__\":\n main()\n\n:Output:\n .. code-block::\n\n # add_index_column\n | | A | B |\n |---|--:|--:|\n |a | 1| 10|\n |b | 2| 11|\n\nWrite a Markdown table from space-separated values\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n:Sample Code:\n .. code-block:: python\n\n import pytablewriter as ptw\n\n\n def main():\n writer = ptw.MarkdownTableWriter(table_name=\"ps\")\n writer.from_csv(\n \"\"\"\n USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND\n root 1 0.0 0.4 77664 8784 ? Ss May11 0:02 /sbin/init\n root 2 0.0 0.0 0 0 ? S May11 0:00 [kthreadd]\n root 4 0.0 0.0 0 0 ? I< May11 0:00 [kworker/0:0H]\n root 6 0.0 0.0 0 0 ? I< May11 0:00 [mm_percpu_wq]\n root 7 0.0 0.0 0 0 ? S May11 0:01 [ksoftirqd/0]\n \"\"\",\n delimiter=\" \",\n )\n writer.write_table()\n\n\n if __name__ == \"__main__\":\n main()\n\n:Output:\n .. code-block::\n\n # ps\n |USER|PID|%CPU|%MEM| VSZ |RSS |TTY|STAT|START|TIME| COMMAND |\n |----|--:|---:|---:|----:|---:|---|----|-----|----|--------------|\n |root| 1| 0| 0.4|77664|8784|? |Ss |May11|0:02|/sbin/init |\n |root| 2| 0| 0.0| 0| 0|? |S |May11|0:00|[kthreadd] |\n |root| 4| 0| 0.0| 0| 0|? |I< |May11|0:00|[kworker/0:0H]|\n |root| 6| 0| 0.0| 0| 0|? |I< |May11|0:00|[mm_percpu_wq]|\n |root| 7| 0| 0.0| 0| 0|? |S |May11|0:01|[ksoftirqd/0] |\n\nGet rendered tabular text as str\n----------------------------------\n``dumps`` method returns rendered tabular text.\n``dumps`` only available for text format writers.\n\n:Sample Code:\n .. code-block:: python\n\n import pytablewriter as ptw\n\n\n def main():\n writer = ptw.MarkdownTableWriter(\n headers=[\"int\", \"float\", \"str\", \"bool\", \"mix\", \"time\"],\n value_matrix=[\n [0, 0.1, \"hoge\", True, 0, \"2017-01-01 03:04:05+0900\"],\n [2, \"-2.23\", \"foo\", False, None, \"2017-12-23 45:01:23+0900\"],\n [3, 0, \"bar\", \"true\", \"inf\", \"2017-03-03 33:44:55+0900\"],\n [-10, -9.9, \"\", \"FALSE\", \"nan\", \"2017-01-01 00:00:00+0900\"],\n ],\n )\n\n print(writer.dumps())\n\n\n if __name__ == \"__main__\":\n main()\n\n:Output:\n .. code-block::\n\n |int|float|str |bool | mix | time |\n |--:|----:|----|-----|-------:|------------------------|\n | 0| 0.10|hoge|True | 0|2017-01-01 03:04:05+0900|\n | 2|-2.23|foo |False| |2017-12-23 45:01:23+0900|\n | 3| 0.00|bar |True |Infinity|2017-03-03 33:44:55+0900|\n |-10|-9.90| |False| NaN|2017-01-01 00:00:00+0900|\n\nConfigure table styles\n------------------------\nColumn styles\n~~~~~~~~~~~~~~~\nWriters can specify\n`Style <https://pytablewriter.rtfd.io/en/latest/pages/reference/style.html>`__\nfor each column by ``column_styles`` attribute of writer classes.\n\n:Sample Code:\n .. code-block:: python\n\n import pytablewriter as ptw\n from pytablewriter.style import Style\n\n\n def main():\n writer = ptw.MarkdownTableWriter(\n table_name=\"set style by column_styles\",\n headers=[\n \"auto align\",\n \"left align\",\n \"center align\",\n \"bold\",\n \"italic\",\n \"bold italic ts\",\n ],\n value_matrix=[\n [11, 11, 11, 11, 11, 11],\n [1234, 1234, 1234, 1234, 1234, 1234],\n ],\n column_styles=[\n Style(),\n Style(align=\"left\"),\n Style(align=\"center\"),\n Style(font_weight=\"bold\"),\n Style(font_style=\"italic\"),\n Style(font_weight=\"bold\", font_style=\"italic\", thousand_separator=\",\"),\n ], # specify styles for each column\n )\n writer.write_table()\n\n\n if __name__ == \"__main__\":\n main()\n\n:Output:\n .. code-block::\n\n # set style by styles\n |auto align|left align|center align| bold |italic|bold italic ts|\n |---------:|----------|:----------:|-------:|-----:|-------------:|\n | 11|11 | 11 | **11**| _11_| _**11**_|\n | 1234|1234 | 1234 |**1234**|_1234_| _**1,234**_|\n\n `Rendering result <https://github.com/thombashi/pytablewriter/tree/master/docs/pages/examples/style/output.md>`__\n\n\nYou can also set ``Style`` to a specific column with an index or header by using ``set_style`` method:\n\n:Sample Code:\n .. code-block:: python\n\n from pytablewriter import MarkdownTableWriter\n from pytablewriter.style import Style\n\n def main():\n writer = MarkdownTableWriter()\n writer.headers = [\"A\", \"B\", \"C\",]\n writer.value_matrix = [[11, 11, 11], [1234, 1234, 1234]]\n\n writer.table_name = \"set style by column index\"\n writer.set_style(1, Style(align=\"center\", font_weight=\"bold\"))\n writer.set_style(2, Style(thousand_separator=\" \"))\n writer.write_table()\n writer.write_null_line()\n\n writer.table_name = \"set style by header\"\n writer.set_style(\"B\", Style(font_style=\"italic\"))\n writer.write_table()\n\n if __name__ == \"__main__\":\n main()\n\n:Output:\n .. code-block::\n\n # set style by column index\n | A | B | C |\n |---:|:------:|----:|\n | 11| **11** | 11|\n |1234|**1234**|1 234|\n\n # set style by header\n | A | B | C |\n |---:|-----:|----:|\n | 11| _11_| 11|\n |1234|_1234_|1 234|\n\nStyle filter\n~~~~~~~~~~~~~~\nYou can apply styles to specific cells by using style filters.\nStyle filters will be written as Python functions.\nExamples of a style filter function and how you apply it are as follows:\n\n:Sample Code:\n .. code-block:: python\n\n from typing import Any, Optional\n\n from pytablewriter import MarkdownTableWriter\n from pytablewriter.style import Cell, Style\n\n\n def style_filter(cell: Cell, **kwargs: Any) -> Optional[Style]:\n if cell.is_header_row():\n return None\n\n if cell.col == 0:\n return Style(font_weight=\"bold\")\n\n value = int(cell.value)\n\n if value > 80:\n return Style(fg_color=\"red\", font_weight=\"bold\", decoration_line=\"underline\")\n elif value > 50:\n return Style(fg_color=\"yellow\", font_weight=\"bold\")\n elif value > 20:\n return Style(fg_color=\"green\")\n\n return Style(fg_color=\"lightblue\")\n\n\n writer = MarkdownTableWriter(\n table_name=\"style filter example\",\n headers=[\"Key\", \"Value 1\", \"Value 2\"],\n value_matrix=[\n [\"A\", 95, 40],\n [\"B\", 55, 5],\n [\"C\", 30, 85],\n [\"D\", 0, 69],\n ],\n flavor=\"github\",\n enable_ansi_escape=False,\n )\n writer.add_style_filter(style_filter)\n writer.write_table()\n\nRendered results can be found at `here <https://github.com/thombashi/pytablewriter/blob/master/docs/pages/examples/output/markdown/style_filter.md>`__\n\nTheme\n~~~~~~~\nThemes consists of a set of style filters.\nThe following command will install external predefined themes:\n\n::\n\n pip install pytablewriter[theme]\n\nThemes can be set via the constructor of the writer classes or the ``set_theme`` method.\nThe following is an example of setting the ``altrow`` theme via the constructor.\n``altrow`` theme will be colored rows alternatively:\n\n:Sample Code:\n .. code-block:: python\n\n import pytablewriter as ptw\n\n writer = ptw.TableWriterFactory.create_from_format_name(\n \"markdown\",\n headers=[\"INT\", \"STR\"],\n value_matrix=[[1, \"hoge\"], [2, \"foo\"], [3, \"bar\"]],\n margin=1,\n theme=\"altrow\",\n )\n writer.write_table()\n\n:Output:\n .. figure:: https://cdn.jsdelivr.net/gh/thombashi/pytablewriter-altrow-theme@master/ss/ptw-altrow-theme_example_default.png\n :scale: 100%\n :alt: https://github.com/thombashi/pytablewriter-altrow-theme/blob/master/ss/ptw-altrow-theme_example_default.png\n\n`[theme]` extras includes the following themes:\n\n- `pytablewriter-altrow-theme <https://github.com/thombashi/pytablewriter-altrow-theme>`__\n - `Generated HTML table example <https://thombashi.github.io/pytablewriter-altrow-theme/example.html>`__\n- `pytablewriter-altcol-theme <https://github.com/thombashi/pytablewriter-altcol-theme>`__\n - `Generated HTML table example <https://thombashi.github.io/pytablewriter-altcol-theme/example.html>`__\n\nMake tables for specific applications\n---------------------------------------\nRender a table on Jupyter Notebook\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nAll table writer class instances in ``pytablewriter`` can render in Jupyter Notebook.\nTo render writers at notebook cells, you will require the dependency packages to be installed either by:\n\n- ``pip install pytablewriter[html]`` or\n- ``pip install pytablewriter[all]``\n\nJupyter Notebook code examples can be found `here <https://nbviewer.jupyter.org/github/thombashi/pytablewriter/blob/master/examples/ipynb/jupyter_notebook_example.ipynb>`__:\n\n.. figure:: https://cdn.jsdelivr.net/gh/thombashi/pytablewriter@master/ss/jupyter_notebook.png\n :scale: 100%\n :alt: https://github.com/thombashi/pytablewriter/blob/master/ss/jupyter_notebook.png\n\n Table rendering results of Jupyter Notebook\n\nMultibyte character support\n-----------------------------\nWrite a table using multibyte character\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nYou can use multibyte characters as table data.\nMultibyte characters are also properly padded and aligned.\n\n:Sample Code:\n .. code-block:: python\n\n import pytablewriter as ptw\n\n\n def main():\n writer = ptw.RstSimpleTableWriter(\n table_name=\"\u751f\u6210\u306b\u95a2\u3059\u308b\u30d1\u30bf\u30fc\u30f3\",\n headers=[\"\u30d1\u30bf\u30fc\u30f3\u540d\", \"\u6982\u8981\", \"GoF\", \"Code Complete[1]\"],\n value_matrix=[\n [\"Abstract Factory\", \"\u95a2\u9023\u3059\u308b\u4e00\u9023\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u72b6\u6cc1\u306b\u5fdc\u3058\u3066\u3001\u9069\u5207\u306b\u751f\u6210\u3059\u308b\u65b9\u6cd5\u3092\u63d0\u4f9b\u3059\u308b\u3002\", \"Yes\", \"Yes\"],\n [\"Builder\", \"\u8907\u5408\u5316\u3055\u308c\u305f\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u751f\u6210\u904e\u7a0b\u3092\u96a0\u853d\u3059\u308b\u3002\", \"Yes\", \"No\"],\n [\"Factory Method\", \"\u5b9f\u969b\u306b\u751f\u6210\u3055\u308c\u308b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306b\u4f9d\u5b58\u3057\u306a\u3044\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u751f\u6210\u65b9\u6cd5\u3092\u63d0\u4f9b\u3059\u308b\u3002\", \"Yes\", \"Yes\"],\n [\"Prototype\", \"\u540c\u69d8\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u751f\u6210\u3059\u308b\u305f\u3081\u306b\u3001\u539f\u578b\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u8907\u88fd\u3059\u308b\u3002\", \"Yes\", \"No\"],\n [\"Singleton\", \"\u3042\u308b\u30af\u30e9\u30b9\u306b\u3064\u3044\u3066\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u5358\u4e00\u3067\u3042\u308b\u3053\u3068\u3092\u4fdd\u8a3c\u3059\u308b\u3002\", \"Yes\", \"Yes\"],\n ],\n )\n writer.write_table()\n\n\n if __name__ == \"__main__\":\n main()\n\n:Output:\n .. figure:: https://cdn.jsdelivr.net/gh/thombashi/pytablewriter@master/docs/pages/examples/multibyte/ss/multi_byte_char.png\n :scale: 100%\n :alt: https://github.com/thombashi/pytablewriter/blob/master/docs/pages/examples/multibyte/ss/multi_byte_char.png\n\n Output of multi-byte character table\n\nMultiprocessing\n-----------------\nYou can increase the number of workers to process table data via ``max_workers`` attribute of a writer.\nThe more ``max_workers`` the less processing time when tabular data is large and the execution environment has available cores.\n\nIf you increase ``max_workers`` larger than one, recommend using main guarded as follows to avoid problems caused by multi-processing:\n\n.. code-block:: python\n\n from multiprocessing import cpu_count\n import pytablewriter as ptw\n\n def main():\n writer = ptw.MarkdownTableWriter()\n writer.max_workers = cpu_count()\n ...\n\n if __name__ == \"__main__\":\n main()\n\nFor more information\n----------------------\nMore examples are available at \nhttps://pytablewriter.rtfd.io/en/latest/pages/examples/index.html\n\nDependencies\n============\n- Python 3.7+\n- `Python package dependencies (automatically installed) <https://github.com/thombashi/pytablewriter/network/dependencies>`__\n\n\nOptional dependencies\n---------------------\n- ``logging`` extras\n - `loguru <https://github.com/Delgan/loguru>`__: Used for logging if the package installed\n- ``from`` extras\n - `pytablereader <https://github.com/thombashi/pytablereader>`__\n- ``es`` extra\n - `elasticsearch <https://github.com/elastic/elasticsearch-py>`__\n- ``excel`` extras\n - `xlwt <http://www.python-excel.org/>`__\n - `XlsxWriter <https://github.com/jmcnamara/XlsxWriter>`__\n- ``html`` extras\n - `dominate <https://github.com/Knio/dominate/>`__\n- ``sqlite`` extras\n - `SimpleSQLite <https://github.com/thombashi/SimpleSQLite>`__\n- ``theme`` extras\n - `pytablewriter-altrow-theme <https://github.com/thombashi/pytablewriter-altrow-theme>`__\n - `pytablewriter-altcol-theme <https://github.com/thombashi/pytablewriter-altcol-theme>`__\n- ``toml`` extras\n - `toml <https://github.com/uiri/toml>`__\n\nDocumentation\n===============\nhttps://pytablewriter.rtfd.io/\n\nProjects using pytablewriter\n==================================\n- `pytest-md-report <https://github.com/thombashi/pytest-md-report>`__\n\n\nRelated Projects\n==================================\n- `pytablereader <https://github.com/thombashi/pytablereader>`__\n - Tabular data loaded by ``pytablereader`` can be written another tabular data format with ``pytablewriter``.\n\nSponsors\n====================================\n.. image:: https://avatars.githubusercontent.com/u/44389260?s=48&u=6da7176e51ae2654bcfd22564772ef8a3bb22318&v=4\n :target: https://github.com/chasbecker\n :alt: Charles Becker (chasbecker)\n.. image:: https://avatars.githubusercontent.com/u/46711571?s=48&u=57687c0e02d5d6e8eeaf9177f7b7af4c9f275eb5&v=4\n :target: https://github.com/Arturi0\n :alt: onetime: Arturi0\n.. image:: https://avatars.githubusercontent.com/u/3658062?s=48&v=4\n :target: https://github.com/b4tman\n :alt: onetime: Dmitry Belyaev (b4tman)\n\n`Become a sponsor <https://github.com/sponsors/thombashi>`__\n\n",
"bugtrack_url": null,
"license": "MIT License",
"summary": "pytablewriter is a Python library to write a table in various formats: AsciiDoc / CSV / Elasticsearch / HTML / JavaScript / JSON / LaTeX / LDJSON / LTSV / Markdown / MediaWiki / NumPy / Excel / Pandas / Python / reStructuredText / SQLite / TOML / TSV / YAML.",
"version": "1.2.0",
"project_urls": {
"Changlog": "https://github.com/thombashi/pytablewriter/releases",
"Documentation": "https://pytablewriter.rtfd.io/",
"Funding": "https://github.com/sponsors/thombashi",
"Homepage": "https://github.com/thombashi/pytablewriter",
"Source": "https://github.com/thombashi/pytablewriter",
"Tracker": "https://github.com/thombashi/pytablewriter/issues"
},
"split_keywords": [
"asciidoc",
"table",
"csv",
"excel",
"javascript",
"json",
"latex",
"ltsv",
"markdown",
"mediawiki",
"html",
"pandas",
"restructuredtext",
"sqlite",
"tsv",
"toml"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "0674b39b823ee7dba155b117634e62733a0dfdfe5aa100a553b435062cee2062",
"md5": "9a416f9d34173ce63dc4d5c55ac5d9a6",
"sha256": "4a30e2bb4bf5bc1069b1d2b2bc41947577c4517ab0875b23a5b194d296f543d8"
},
"downloads": -1,
"filename": "pytablewriter-1.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9a416f9d34173ce63dc4d5c55ac5d9a6",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 111097,
"upload_time": "2023-10-08T12:50:26",
"upload_time_iso_8601": "2023-10-08T12:50:26.456482Z",
"url": "https://files.pythonhosted.org/packages/06/74/b39b823ee7dba155b117634e62733a0dfdfe5aa100a553b435062cee2062/pytablewriter-1.2.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cca976aa4430d32ae10b23e4347006dc4c67a3e2a00621e4bb38a60c1a77f15e",
"md5": "4e3d421d026f30fadec4ac1670e524ee",
"sha256": "0204a4bb684a22140d640f2599f09e137bcdc18b3dd49426f4a555016e246b46"
},
"downloads": -1,
"filename": "pytablewriter-1.2.0.tar.gz",
"has_sig": false,
"md5_digest": "4e3d421d026f30fadec4ac1670e524ee",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 230439,
"upload_time": "2023-10-08T12:50:28",
"upload_time_iso_8601": "2023-10-08T12:50:28.729774Z",
"url": "https://files.pythonhosted.org/packages/cc/a9/76aa4430d32ae10b23e4347006dc4c67a3e2a00621e4bb38a60c1a77f15e/pytablewriter-1.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-10-08 12:50:28",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "thombashi",
"github_project": "pytablewriter",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "pytablewriter"
}