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.
Project description
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.
Features
- Write a table in various formats:
- Text formats:
CSV / Tab-separated values (TSV) / Space-separated values (SSV)
HTML / CSS
JSON / Line-delimited JSON(LDJSON)
LaTeX: tabular/array environment
Markdown: CommonMark / GitHub Flavored Markdown (GFM) / kramdown
reStructuredText: Grid Tables/Simple Tables/CSV Table
- Source code (definition of a variable that represents tabular data)
JavaScript / NumPy (numpy.array) / Pandas (pandas.DataFrame) / Python
Unicode
- Binary file formats:
Microsoft Excel TM (.xlsx/.xls file format)
pandas.DataFrame pickle file
SQLite database
- Application specific formats:
- 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 table to a stream such as a file/standard-output/string-buffer/Jupyter-Notebook
Get rendered tabular text
- Data sources:
nested list
CSV
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:
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:
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:
# 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:
Write a Markdown table with a margin
- Sample Code:
from pytablewriter import MarkdownTableWriter def main(): writer = MarkdownTableWriter( table_name="write example with a margin", 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:
# 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 table to an Excel sheet
- Sample Code:
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:
Write a Unicode table
- Sample Code:
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:
┌───┬─────┬────┬─────┬────────┬────────────────────────┐ │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:
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:
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:
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:
| 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:
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:
# add_index_column | | A | B | |---|--:|--:| |a | 1| 10| |b | 2| 11|
Write a markdown table from a space-separated values
- Sample Code:
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:
# 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:
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:
|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 for each column by column_styles attribute of writer classes.
- Sample Code:
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:
# 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**_|
You can also set Style to a specific column with index or header by using set_style method:
- Sample Code:
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:
# 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
The following command will install external predefined themes:
pip install pytablewriter[theme]
theme argument of writer constructor or set_theme method can set”” predefined style filters. altrow theme will colored rows alternatively:
- Sample Code:
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:
Themes can be created as plugins like as follows: https://github.com/thombashi/pytablewriter-altrow-theme
Make tables for specific applications
Render a table on Jupyter Notebook
Multibyte character support
Write a table using multibyte character
You can use multibyte characters as table data. Multibyte characters also properly padded and aligned.
- Sample Code:
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:
Multi processing
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 to use main guarded as follows to avoid problems caused by multi processing:
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
Optional dependencies
- logging extras
loguru: Used for logging if the package installed
- from extras
- es extra
- excel extras
- html extras
- sqlite extras
- theme extras
- toml extras
Documentation
Projects using pytablewriter
Sponsors
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
Built Distribution
File details
Details for the file pytablewriter-0.64.0.tar.gz
.
File metadata
- Download URL: pytablewriter-0.64.0.tar.gz
- Upload date:
- Size: 190.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 193f1bbcfce0960cd36601d2e6409a6469a57ec26db2c676ff4c800b01824d1c |
|
MD5 | 73bc807f79f5db534ec9cd20910dd219 |
|
BLAKE2b-256 | 5dc2ff32d75771d54c79364b642a52b22dd14e3699e5d9ca52af6a32230f9fa6 |
File details
Details for the file pytablewriter-0.64.0-py3-none-any.whl
.
File metadata
- Download URL: pytablewriter-0.64.0-py3-none-any.whl
- Upload date:
- Size: 100.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 43b01c014397da8bffb8a37d2ad7b6b978439e01dac54ab403de7585f10aa87d |
|
MD5 | 98883e1deee4878668daac17c06839b1 |
|
BLAKE2b-256 | 336e171e627dd93cb5283612617133d2257ccb44129085e2bd9d5a66f2c4bd22 |