Package: pytablewriter
pytablewriterSummaryFeaturesInstallationInstallation: pipInstallation: condaInstallation: aptExamplesWrite tablesGet rendered tabular text as strConfigure table stylesMake tables for specific applicationsMultibyte character supportMultiprocessingFor more informationDependenciesOptional dependenciesDocumentationProjects using pytablewriterRelated ProjectsSponsorsSummarypytablewriteris 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.FeaturesWrite a table in various formats:Text formats:AsciiDocCSV / Tab-separated values (TSV) / Space-separated values (SSV)HTML / CSSJSON /Line-delimited JSON(LDJSON)Labeled Tab-separated Values (LTSV)LaTeX:tabular/arrayenvironmentMarkdown: CommonMark /GitHub Flavored Markdown (GFM)/kramdownMediaWikireStructuredText:Grid Tables/Simple Tables/CSV TableSource code (definition of a variable that represents tabular data)JavaScript /NumPy(numpy.array) /Pandas(pandas.DataFrame) / PythonTOMLYAMLUnicodeBinary file formats:Microsoft ExcelTM(.xlsx/.xlsfile format)pandas.DataFramepickle fileSQLitedatabaseApplication-specific formats:ElasticsearchAutomatic table cell formatting:AlignmentPaddingDecimal places of numbersCustomize table cell styles:Text/Background colorText alignmentFont size/weightThousand separator for numbers: e.g.1,000/1 000Configure output:Write a table to a stream such as a file/standard-output/string-buffer/Jupyter-NotebookGet rendered tabular textData sources:nested listCSVpandas.DataFrame/pandas.Seriesetc.Multibyte character supportANSI color supportInstallationInstallation: pippip install pytablewriterSome of the formats require additional dependency packages, you can install these packages as follows:Installation of optional dependenciesInstallation exampleRemarkpip install pytablewriter[es]Elasticsearchpip install pytablewriter[excel]Excelpip install pytablewriter[html]HTMLpip install pytablewriter[sqlite]SQLite databasepip install pytablewriter[toml]TOMLpip install pytablewriter[theme]pytablewriter theme pluginspip install pytablewriter[all]Install all of the optional dependenciesInstallation: condaconda install -c conda-forge pytablewriterInstallation: aptsudo add-apt-repository ppa:thombashi/ppa
sudo apt update
sudo apt install python3-pytablewriterExamplesWrite tablesWrite a Markdown tableSample Code:frompytablewriterimportMarkdownTableWriterdefmain():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:Rendered markdown at GitHubWrite a Markdown table with marginsSample Code:frompytablewriterimportMarkdownTableWriterdefmain():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:# 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 |marginattribute can be available for all of the text format writer classes.Write a GitHub Flavored Markdown (GFM) tableIf you setflavorkeyword argument ofMarkdownTableWriterclass to"github"or"gfm", the writer will output markdown tables with GitHub flavor.
GFM can apply some additional styles to tables such asfg_color(text color).Sample Code:frompytablewriterimportMarkdownTableWriterfrompytablewriter.styleimportStylewriter=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 athereApply styles to GFM table with programmaticallyApplying style filters to GFM allows for more flexible style settings for cells.
See also theexampleWrite a Markdown table to a stream or a fileRefer an exampleWrite a table to an Excel sheetSample Code:frompytablewriterimportExcelXlsxTableWriterdefmain():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:Output excel file (sample_single.xlsx)Write a Unicode tableSample Code:frompytablewriterimportUnicodeTableWriterdefmain():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:importpytablewriterasptwdefmain():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:constjs_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 frompandas.DataFrameinstancefrom_dataframemethod of writer classes will set up tabular data frompandas.DataFrame:Sample Code:fromtextwrapimportdedentimportpandasaspdimportiofrompytablewriterimportMarkdownTableWriterdefmain():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 specifyadd_index_column=True:Sample Code:importpandasaspdimportpytablewriterasptwdefmain():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 space-separated valuesSample Code:importpytablewriterasptwdefmain():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 strdumpsmethod returns rendered tabular text.dumpsonly available for text format writers.Sample Code:importpytablewriterasptwdefmain():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 stylesColumn stylesWriters can specifyStylefor each column bycolumn_stylesattribute of writer classes.Sample Code:importpytablewriterasptwfrompytablewriter.styleimportStyledefmain():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**_|Rendering resultYou can also setStyleto a specific column with an index or header by usingset_stylemethod:Sample Code:frompytablewriterimportMarkdownTableWriterfrompytablewriter.styleimportStyledefmain():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 filterYou 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:fromtypingimportAny,OptionalfrompytablewriterimportMarkdownTableWriterfrompytablewriter.styleimportCell,Styledefstyle_filter(cell:Cell,**kwargs:Any)->Optional[Style]:ifcell.is_header_row():returnNoneifcell.col==0:returnStyle(font_weight="bold")value=int(cell.value)ifvalue>80:returnStyle(fg_color="red",font_weight="bold",decoration_line="underline")elifvalue>50:returnStyle(fg_color="yellow",font_weight="bold")elifvalue>20:returnStyle(fg_color="green")returnStyle(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 athereThemeThemes 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 theset_thememethod.
The following is an example of setting thealtrowtheme via the constructor.altrowtheme will be colored rows alternatively:Sample Code:importpytablewriterasptwwriter=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:[theme]extras includes the following themes:pytablewriter-altrow-themeGenerated HTML table examplepytablewriter-altcol-themeGenerated HTML table exampleMake tables for specific applicationsRender a table on Jupyter NotebookAll table writer class instances inpytablewritercan 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]orpip install pytablewriter[all]Jupyter Notebook code examples can be foundhere:Table rendering results of Jupyter NotebookMultibyte character supportWrite a table using multibyte characterYou can use multibyte characters as table data.
Multibyte characters are also properly padded and aligned.Sample Code:importpytablewriterasptwdefmain():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:Output of multi-byte character tableMultiprocessingYou can increase the number of workers to process table data viamax_workersattribute of a writer.
The moremax_workersthe less processing time when tabular data is large and the execution environment has available cores.If you increasemax_workerslarger than one, recommend using main guarded as follows to avoid problems caused by multi-processing:frommultiprocessingimportcpu_countimportpytablewriterasptwdefmain():writer=ptw.MarkdownTableWriter()writer.max_workers=cpu_count()...if__name__=="__main__":main()For more informationMore examples are available athttps://pytablewriter.rtfd.io/en/latest/pages/examples/index.htmlDependenciesPython 3.7+Python package dependencies (automatically installed)Optional dependenciesloggingextrasloguru: Used for logging if the package installedfromextraspytablereaderesextraelasticsearchexcelextrasxlwtXlsxWriterhtmlextrasdominatesqliteextrasSimpleSQLitethemeextraspytablewriter-altrow-themepytablewriter-altcol-themetomlextrastomlDocumentationhttps://pytablewriter.rtfd.io/Projects using pytablewriterpytest-md-reportRelated ProjectspytablereaderTabular data loaded bypytablereadercan be written another tabular data format withpytablewriter.SponsorsBecome a sponsor