933 lines
37 KiB
Plaintext
933 lines
37 KiB
Plaintext
Metadata-Version: 2.1
|
|
Name: pytablewriter
|
|
Version: 1.2.1
|
|
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.
|
|
Home-page: https://github.com/thombashi/pytablewriter
|
|
Author: Tsuyoshi Hombashi
|
|
Author-email: tsuyoshi.hombashi@gmail.com
|
|
License: MIT License
|
|
Project-URL: Changelog, https://github.com/thombashi/pytablewriter/blob/master/CHANGELOG.md
|
|
Project-URL: Documentation, https://pytablewriter.rtfd.io/
|
|
Project-URL: Funding, https://github.com/sponsors/thombashi
|
|
Project-URL: Source, https://github.com/thombashi/pytablewriter
|
|
Project-URL: Tracker, https://github.com/thombashi/pytablewriter/issues
|
|
Keywords: AsciiDoc,table,CSV,Excel,JavaScript,JSON,LaTeX,LTSV,Markdown,MediaWiki,HTML,pandas,reStructuredText,SQLite,TSV,TOML
|
|
Classifier: Development Status :: 5 - Production/Stable
|
|
Classifier: Intended Audience :: Developers
|
|
Classifier: Intended Audience :: Information Technology
|
|
Classifier: License :: OSI Approved :: MIT License
|
|
Classifier: Operating System :: OS Independent
|
|
Classifier: Programming Language :: Python :: 3
|
|
Classifier: Programming Language :: Python :: 3.9
|
|
Classifier: Programming Language :: Python :: 3.10
|
|
Classifier: Programming Language :: Python :: 3.11
|
|
Classifier: Programming Language :: Python :: 3.12
|
|
Classifier: Programming Language :: Python :: 3.13
|
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
Classifier: Topic :: Software Development :: Code Generators
|
|
Classifier: Topic :: Software Development :: Libraries
|
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
Classifier: Topic :: Text Processing
|
|
Classifier: Topic :: Text Processing :: Markup :: HTML
|
|
Classifier: Topic :: Text Processing :: Markup :: LaTeX
|
|
Classifier: Topic :: Text Processing :: Markup :: Markdown
|
|
Classifier: Topic :: Text Processing :: Markup :: reStructuredText
|
|
Classifier: Typing :: Typed
|
|
Requires-Python: >=3.9
|
|
Description-Content-Type: text/x-rst
|
|
License-File: LICENSE
|
|
Requires-Dist: setuptools>=38.3.0
|
|
Requires-Dist: DataProperty<2,>=1.1.0
|
|
Requires-Dist: mbstrdecoder<2,>=1.0.0
|
|
Requires-Dist: pathvalidate<4,>=2.3.0
|
|
Requires-Dist: tabledata<2,>=1.3.1
|
|
Requires-Dist: tcolorpy<1,>=0.0.5
|
|
Requires-Dist: typepy[datetime]<2,>=1.3.2
|
|
Provides-Extra: all
|
|
Requires-Dist: xlwt; extra == "all"
|
|
Requires-Dist: XlsxWriter<4,>=0.9.6; extra == "all"
|
|
Requires-Dist: elasticsearch<9,>=8.0.1; extra == "all"
|
|
Requires-Dist: pytablereader<2,>=0.31.3; extra == "all"
|
|
Requires-Dist: dominate<3,>=2.1.5; extra == "all"
|
|
Requires-Dist: loguru<1,>=0.4.1; extra == "all"
|
|
Requires-Dist: SimpleSQLite<2,>=1.3.2; extra == "all"
|
|
Requires-Dist: pytablewriter-altrow-theme<1,>=0.2.0; extra == "all"
|
|
Requires-Dist: pytablewriter-altcol-theme<1,>=0.1.0; extra == "all"
|
|
Requires-Dist: toml<1,>=0.9.3; extra == "all"
|
|
Requires-Dist: PyYAML<7,>=3.11; extra == "all"
|
|
Requires-Dist: simplejson<4,>=3.8.1; extra == "all"
|
|
Requires-Dist: pandas<3,>=0.25.3; extra == "all"
|
|
Provides-Extra: docs
|
|
Requires-Dist: sphinx_rtd_theme>=1.2.2; extra == "docs"
|
|
Requires-Dist: Sphinx>=2.4; extra == "docs"
|
|
Requires-Dist: xlwt; extra == "docs"
|
|
Requires-Dist: XlsxWriter<4,>=0.9.6; extra == "docs"
|
|
Requires-Dist: elasticsearch<9,>=8.0.1; extra == "docs"
|
|
Requires-Dist: pytablereader<2,>=0.31.3; extra == "docs"
|
|
Requires-Dist: dominate<3,>=2.1.5; extra == "docs"
|
|
Requires-Dist: loguru<1,>=0.4.1; extra == "docs"
|
|
Requires-Dist: SimpleSQLite<2,>=1.3.2; extra == "docs"
|
|
Requires-Dist: pytablewriter-altrow-theme<1,>=0.2.0; extra == "docs"
|
|
Requires-Dist: pytablewriter-altcol-theme<1,>=0.1.0; extra == "docs"
|
|
Requires-Dist: toml<1,>=0.9.3; extra == "docs"
|
|
Requires-Dist: PyYAML<7,>=3.11; extra == "docs"
|
|
Requires-Dist: simplejson<4,>=3.8.1; extra == "docs"
|
|
Requires-Dist: pandas<3,>=0.25.3; extra == "docs"
|
|
Provides-Extra: es
|
|
Requires-Dist: elasticsearch<9,>=8.0.1; extra == "es"
|
|
Provides-Extra: es8
|
|
Requires-Dist: elasticsearch<9,>=8.0.1; extra == "es8"
|
|
Provides-Extra: excel
|
|
Requires-Dist: xlwt; extra == "excel"
|
|
Requires-Dist: XlsxWriter<4,>=0.9.6; extra == "excel"
|
|
Provides-Extra: from
|
|
Requires-Dist: pytablereader<2,>=0.31.3; extra == "from"
|
|
Provides-Extra: html
|
|
Requires-Dist: dominate<3,>=2.1.5; extra == "html"
|
|
Provides-Extra: logging
|
|
Requires-Dist: loguru<1,>=0.4.1; extra == "logging"
|
|
Provides-Extra: pandas
|
|
Requires-Dist: pandas<3,>=0.25.3; extra == "pandas"
|
|
Provides-Extra: sqlite
|
|
Requires-Dist: SimpleSQLite<2,>=1.3.2; extra == "sqlite"
|
|
Provides-Extra: test
|
|
Requires-Dist: pytest-md-report>=0.6.2; extra == "test"
|
|
Requires-Dist: pytablewriter-altcol-theme<1,>=0.1.0; extra == "test"
|
|
Requires-Dist: PyYAML<7,>=3.11; extra == "test"
|
|
Requires-Dist: pytablereader[excel,sqlite]>=0.31.3; extra == "test"
|
|
Requires-Dist: dominate<3,>=2.1.5; extra == "test"
|
|
Requires-Dist: pytablewriter-altrow-theme<1,>=0.2.0; extra == "test"
|
|
Requires-Dist: toml<1,>=0.9.3; extra == "test"
|
|
Requires-Dist: simplejson<4,>=3.8.1; extra == "test"
|
|
Requires-Dist: pytest>=6.0.1; extra == "test"
|
|
Requires-Dist: beautifulsoup4>=4.10; extra == "test"
|
|
Requires-Dist: SimpleSQLite<2,>=1.3.2; extra == "test"
|
|
Requires-Dist: pytablereader<2,>=0.31.3; extra == "test"
|
|
Requires-Dist: elasticsearch<9,>=8.0.1; extra == "test"
|
|
Requires-Dist: xlwt; extra == "test"
|
|
Requires-Dist: tablib>=3.2.0; extra == "test"
|
|
Requires-Dist: sqliteschema>=2; extra == "test"
|
|
Requires-Dist: loguru<1,>=0.4.1; extra == "test"
|
|
Requires-Dist: XlsxWriter<4,>=0.9.6; extra == "test"
|
|
Requires-Dist: pandas<3,>=0.25.3; extra == "test"
|
|
Provides-Extra: theme
|
|
Requires-Dist: pytablewriter-altrow-theme<1,>=0.2.0; extra == "theme"
|
|
Requires-Dist: pytablewriter-altcol-theme<1,>=0.1.0; extra == "theme"
|
|
Provides-Extra: toml
|
|
Requires-Dist: toml<1,>=0.9.3; extra == "toml"
|
|
Provides-Extra: yaml
|
|
Requires-Dist: PyYAML<7,>=3.11; extra == "yaml"
|
|
|
|
.. 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
|
|
: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
|
|
: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
|
|
~~~~~~~
|
|
`Theme <https://pytablewriter.readthedocs.io/en/latest/pages/reference/theme.html#pytablewriter.style.Theme>`
|
|
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
|
|
: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
|
|
: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
|
|
: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.9+
|
|
- `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
|
|
====================================
|
|
|chasbecker| |shiguredo| |b4tman| |Arturi0| |github|
|
|
|
|
.. |chasbecker| image:: https://avatars.githubusercontent.com/u/44389260?s=48&u=6da7176e51ae2654bcfd22564772ef8a3bb22318&v=4
|
|
:target: https://github.com/chasbecker
|
|
:alt: ex-sponsor: Charles Becker (chasbecker)
|
|
.. |shiguredo| image:: https://avatars.githubusercontent.com/u/2549434?s=48&v=4
|
|
:target: https://github.com/shiguredo
|
|
:alt: ex-sponsor: 時雨堂 (shiguredo)
|
|
.. |b4tman| image:: https://avatars.githubusercontent.com/u/3658062?s=48&v=4
|
|
:target: https://github.com/b4tman
|
|
:alt: onetime: Dmitry Belyaev (b4tman)
|
|
.. |Arturi0| image:: https://avatars.githubusercontent.com/u/46711571?s=48&u=57687c0e02d5d6e8eeaf9177f7b7af4c9f275eb5&v=4
|
|
:target: https://github.com/Arturi0
|
|
:alt: onetime: Arturi0
|
|
.. |github| image:: https://avatars.githubusercontent.com/u/9919?s=48&v=4
|
|
:target: https://github.com/github
|
|
:alt: onetime: GitHub (github)
|
|
|
|
`Become a sponsor <https://github.com/sponsors/thombashi>`__
|
|
|