Skip to main content

A Python library to write a table in various formats: CSV / Elasticsearch / HTML / JavaScript / JSON / Jupyter Notebook / LaTeX / LDJSON / LTSV / Markdown / MediaWiki / NumPy / Excel / Pandas / Python / reStructuredText / SQLite / TOML / TSV.

Project description

**pytablewriter**

.. contents:: Table of Contents
:depth: 2

Summary
=========
A Python library to write a table in various formats: CSV / Elasticsearch / HTML / JavaScript / JSON / Jupyter Notebook / LaTeX / LDJSON / LTSV / Markdown / MediaWiki / NumPy / Excel / Pandas / Python / reStructuredText / SQLite / TOML / TSV.

.. image:: https://badge.fury.io/py/pytablewriter.svg
:target: https://badge.fury.io/py/pytablewriter

.. image:: https://img.shields.io/pypi/pyversions/pytablewriter.svg
:target: https://pypi.python.org/pypi/pytablewriter

.. image:: https://img.shields.io/travis/thombashi/pytablewriter/master.svg?label=Linux/macOS
:target: https://travis-ci.org/thombashi/pytablewriter

.. image:: https://img.shields.io/appveyor/ci/thombashi/pytablewriter/master.svg?label=Windows
:target: https://ci.appveyor.com/project/thombashi/pytablewriter

.. image:: https://coveralls.io/repos/github/thombashi/pytablewriter/badge.svg?branch=master
:target: https://coveralls.io/github/thombashi/pytablewriter?branch=master

.. image:: https://img.shields.io/github/stars/thombashi/pytablewriter.svg?style=social&label=Star
:target: https://github.com/thombashi/pytablewriter

Features
--------
- Write a table in various formats:
- CSV
- `Elasticsearch <https://www.elastic.co/products/elasticsearch>`__
- Microsoft Excel :superscript:`TM` (``.xlsx``/``.xls`` file format)
- HTML
- JSON
- Jupyter Notebook
- `Labeled Tab-separated Values (LTSV) <http://ltsv.org/>`__
- `Line-delimited JSON(LDJSON) <https://en.wikipedia.org/wiki/JSON_streaming#Line-delimited_JSON>`__/NDJSON/JSON Lines
- LaTeX: ``tabular``/``array`` environment
- Markdown
- 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
- JavaScript code (Definition of a nested list variable)
- `NumPy <http://www.numpy.org/>`__ (Definition of a `numpy.array <https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html>`__ variable)
- `Pandas <http://pandas.pydata.org/>`__ (Definition of a `pandas.DataFrame <http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html>`__ variable)
- Python code (Definition of a nested list variable)
- Space aligned values
- SQLite database file
- Tab-separated values (TSV)
- `TOML <https://github.com/toml-lang/toml>`__
- Automatic tabular data formatting
- Alignment
- Padding
- Decimal places of numbers
- Multibyte character support
- Write table to a stream such as a file/standard-output/string-buffer

Examples
==========
Write a Markdown table
------------------------
:Sample Code:
.. code-block:: python

import pytablewriter

writer = pytablewriter.MarkdownTableWriter()
writer.table_name = "example_table"
writer.header_list = ["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 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()

: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:: ss/markdown.png
:scale: 80%
:alt: markdown_ss

Rendered markdown at GitHub

Write a Markdown table with a margin
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:Sample Code:
.. code-block:: python

import pytablewriter

writer = pytablewriter.MarkdownTableWriter()
writer.table_name = "write example with a margin"
writer.header_list = ["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 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.margin = 1 # add a whitespace for both sides of each cell

writer.write_table()

:Output:
.. code-block::

# write example with a margin
| 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 reStructuredText table (Grid Tables)
----------------------------------------------
:Sample Code:
.. code-block:: python

import pytablewriter

writer = pytablewriter.RstGridTableWriter()
writer.table_name = "example_table"
writer.header_list = ["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 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()

:Output:
.. code-block:: ReST

.. table:: 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:
.. table:: 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|
+---+-----+----+-----+--------+------------------------+

Write a table with JavaScript format (as a nested list variable definition)
-----------------------------------------------------------------------------
:Sample Code:
.. code-block:: python

import pytablewriter

writer = pytablewriter.JavaScriptTableWriter()
writer.table_name = "example_table"
writer.header_list = ["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 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()


:Output:
.. code-block:: js

const 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, null, "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 to an Excel sheet
---------------------------------
:Sample Code:
.. code-block:: python

import pytablewriter

writer = pytablewriter.ExcelXlsxTableWriter()
writer.open("sample.xlsx")

writer.make_worksheet("example")
writer.header_list = ["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.write_table()

writer.close()

:Output:
.. figure:: ss/excel_single.png
:scale: 100%
:alt: excel_single

Output excel file (``sample_single.xlsx``)

Write a Markdown table from ``pandas.DataFrame`` instance
-----------------------------------------------------------
:Sample Code:
.. code-block:: python

from textwrap import dedent
import pandas as pd
import pytablewriter
import six

csv_data = six.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 = pytablewriter.MarkdownTableWriter()
writer.from_dataframe(df)
writer.write_table()

: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|

Write a markdown table from a space-separated values
------------------------------------------------------
:Sample Code:
.. code-block:: python

from textwrap import dedent
import pytablewriter

writer = pytablewriter.MarkdownTableWriter()
writer.table_name = "ps"
writer.from_csv(
dedent("""\
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()

: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] |

Set alignment for each column
-------------------------------
``pytablewriter`` will automatically set alignment for each column by data types.
You can set alignment for each column manually by ``align_list`` attribute of writer classes.

:Sample Code:
.. code-block:: python

from pytablewriter import Align, MarkdownTableWriter

writer = MarkdownTableWriter()
writer.table_name = "specify alignment for each column manually"
writer.header_list = ["left", "right", "center", "auto (int)", "auto (str)", "None (auto)"]
writer.value_matrix = [
[0, "r", "center align", 0, "a", "n"],
[11, "right align", "c", 11, "auto", "none"],
]
writer.align_list = [Align.LEFT, Align.RIGHT, Align.CENTER, Align.AUTO, Align.AUTO, None]
writer.write_table()

:Output:
.. code-block::

# specify alignment for each column manually
|left| right | center |auto (int)|auto (str)|None (auto)|
|----|----------:|:----------:|---------:|----------|-----------|
|0 | r|center align| 0|a |n |
|11 |right align| c | 11|auto |none |

`Rendering result <https://github.com/thombashi/pytablewriter/tree/master/docs/pages/examples/alignment/output.md>`__

Create Elasticsearch index and put data
-----------------------------------------
:Sample Code:
.. code-block:: python

import datetime
import json

from elasticsearch import Elasticsearch
import pytablewriter as ptw

es = Elasticsearch(hosts="localhost:9200")

writer = ptw.ElasticsearchWriter()
writer.stream = es
writer.index_name = "es writer example"
writer.header_list = [
"str", "byte", "short", "int", "long", "float", "date", "bool", "ip",
]
writer.value_matrix = [
[
"abc", 100, 10000, 2000000000, 200000000000, 0.1,
datetime.datetime(2017, 1, 2, 3, 4, 5), True, "127.0.0.1",
],
[
"def", -10, -1000, -200000000, -20000000000, 100.1,
datetime.datetime(2017, 6, 5, 4, 5, 2), False, "::1",
],
]

# delete existing index ---
es.indices.delete(index=writer.index_name, ignore=404)

# create an index and put data ---
writer.write_table()

# display the result ---
es.indices.refresh(index=writer.index_name)

print("----- mappings -----")
response = es.indices.get_mapping(index=writer.index_name, doc_type="table")
print("{}\n".format(json.dumps(response, indent=4)))

print("----- documents -----")
response = es.search(
index=writer.index_name,
doc_type="table",
body={
"query": {"match_all": {}}
}
)
for hit in response["hits"]["hits"]:
print(json.dumps(hit["_source"], indent=4))


:Output:
.. code-block:: json

----- mappings -----
{
"es_writer_example": {
"mappings": {
"table": {
"properties": {
"bool": {
"type": "boolean"
},
"byte": {
"type": "byte"
},
"date": {
"type": "date",
"format": "date_optional_time"
},
"float": {
"type": "double"
},
"int": {
"type": "integer"
},
"ip": {
"type": "text"
},
"long": {
"type": "long"
},
"short": {
"type": "short"
},
"str": {
"type": "text"
}
}
}
}
}
}

----- documents -----
{
"str": "def",
"byte": -10,
"short": -1000,
"int": -200000000,
"long": -20000000000,
"float": 100.1,
"date": "2017-06-05T04:05:02",
"bool": false,
"ip": "::1"
}
{
"str": "abc",
"byte": 100,
"short": 10000,
"int": 2000000000,
"long": 200000000000,
"float": 0.1,
"date": "2017-01-02T03:04:05",
"bool": true,
"ip": "127.0.0.1"
}

Formatting a table for Jupyter Notebook
-----------------------------------------
http://nbviewer.jupyter.org/github/thombashi/pytablewriter/blob/master/examples/ipynb/jupyter_notebook_example.ipynb

.. figure:: ss/jupyter_notebook.png
:scale: 100%
:alt: jupyter_notebook_table

Table formatting for Jupyter Notebook

Write a table using multibyte character
-----------------------------------------
You can use multibyte characters as table data.
Multibyte characters also properly padded and aligned.

:Sample Code:
.. code-block:: python

import pytablewriter

writer = pytablewriter.RstSimpleTableWriter()
writer.table_name = "生成に関するパターン"
writer.header_list = ["パターン名", "概要", "GoF", "Code Complete[1]"]
writer.value_matrix = [
["Abstract Factory", "関連する一連のインスタンスを状況に応じて、適切に生成する方法を提供する。", "Yes", "Yes"],
["Builder", "複合化されたインスタンスの生成過程を隠蔽する。", "Yes", "No"],
["Factory Method", "実際に生成されるインスタンスに依存しない、インスタンスの生成方法を提供する。", "Yes", "Yes"],
["Prototype", "同様のインスタンスを生成するために、原型のインスタンスを複製する。", "Yes", "No"],
["Singleton", "あるクラスについて、インスタンスが単一であることを保証する。", "Yes", "Yes"],
]
writer.write_table()

:Output:
.. figure:: ss/multi_byte_char.png
:scale: 100%
:alt: multi_byte_char_table

Output of multi-byte character table

For more information
----------------------
More examples are available at
http://pytablewriter.rtfd.io/en/latest/pages/examples/index.html

Installation
============
::

pip install pytablewriter


Dependencies
============
Python 2.7+ or 3.4+

- `DataPropery <https://github.com/thombashi/DataProperty>`__
- `dominate <http://github.com/Knio/dominate/>`__
- `logbook <http://logbook.readthedocs.io/en/stable/>`__
- `mbstrdecoder <https://github.com/thombashi/mbstrdecoder>`__
- `msgfy <https://github.com/thombashi/msgfy>`__
- `pathvalidate <https://github.com/thombashi/pathvalidate>`__
- `simplejson <https://github.com/simplejson/simplejson>`__
- `SimpleSQLite <https://github.com/thombashi/SimpleSQLite>`__
- `six <https://pypi.python.org/pypi/six/>`__
- `tabledata <https://github.com/thombashi/tabledata>`__
- `toml <https://github.com/uiri/toml>`__
- `typepy <https://github.com/thombashi/typepy>`__
- `XlsxWriter <http://xlsxwriter.readthedocs.io/>`__

Optional Dependencies
----------------------------------
- `pytablereader <https://github.com/thombashi/pytablereader>`__
- `xlwt <http://www.python-excel.org/>`__
- `elasticsearch <https://github.com/elastic/elasticsearch-py>`__


Test dependencies
-----------------
- `pytest <http://pytest.org/latest/>`__
- `pytest-runner <https://pypi.python.org/pypi/pytest-runner>`__
- `tox <https://testrun.org/tox/latest/>`__

Documentation
===============
http://pytablewriter.rtfd.io/

Related Project
=================
- `pytablereader <https://github.com/thombashi/pytablereader>`__
- Tabular data loaded by ``pytablereader`` can be written another tabular data format with ``pytablewriter``.



Project details


Release history Release notifications | RSS feed

Download files

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

Source Distribution

pytablewriter-0.31.0.tar.gz (114.2 kB view details)

Uploaded Source

Built Distribution

pytablewriter-0.31.0-py2.py3-none-any.whl (50.3 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file pytablewriter-0.31.0.tar.gz.

File metadata

File hashes

Hashes for pytablewriter-0.31.0.tar.gz
Algorithm Hash digest
SHA256 c44d53b8bc8fa738bf1a66a3694c80e6be8dbc3438329bbec7ca307c4cf25a2b
MD5 f1e51e8ad59cb0ebae0f58fff390793b
BLAKE2b-256 eea0c8c4e8bf64051f983ae7a4bd6eac0753a4ff2feaa078d6b77be3c38c4454

See more details on using hashes here.

File details

Details for the file pytablewriter-0.31.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for pytablewriter-0.31.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 d1aa3ef9eecf03cc875fcd2a0b3593f1158f4a986f82897a335cc781ceb2da74
MD5 6d4d057a06611e30b8f80a5935ee4a3b
BLAKE2b-256 2213a7dd7089f97d69b6367111dedc1fbb49e9cfefb165c260b6573fd6bfcfca

See more details on using hashes here.

Supported by

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