Package: table2ascii
table2asciiAn intuitive and type-safe library for converting 2D Python lists to fancy ASCII/Unicode tablesDocumentation and examples are available attable2ascii.rtfd.io📥 Installationpip install -U table2asciiRequirements:Python 3.7+🧑‍💻 Usage🚀 Convert lists to ASCII tablesfromtable2asciiimporttable2asciioutput=table2ascii(header=["#","G","H","R","S"],body=[["1","30","40","35","30"],["2","30","40","35","30"]],footer=["SUM","130","140","135","130"],)print(output)"""╔═════════════════════════════╗║  #     G     H     R     S  ║╟─────────────────────────────╢║  1    30    40    35    30  ║║  2    30    40    35    30  ║╟─────────────────────────────╢║ SUM   130   140   135   130 ║╚═════════════════════════════╝"""🏆 Set first or last column headingsfromtable2asciiimporttable2asciioutput=table2ascii(body=[["Assignment","30","40","35","30"],["Bonus","10","20","5","10"]],first_col_heading=True,)print(output)"""╔════════════╦═══════════════════╗║ Assignment ║ 30   40   35   30 ║║    Bonus   ║ 10   20    5   10 ║╚════════════╩═══════════════════╝"""📰 Set column widths and alignmentsfromtable2asciiimporttable2ascii,Alignmentoutput=table2ascii(header=["Product","Category","Price","Rating"],body=[["Milk","Dairy","$2.99","6.283"],["Cheese","Dairy","$10.99","8.2"],["Apples","Produce","$0.99","10.00"],],column_widths=[12,12,12,12],alignments=[Alignment.LEFT,Alignment.CENTER,Alignment.RIGHT,Alignment.DECIMAL],)print(output)"""╔═══════════════════════════════════════════════════╗║ Product       Category         Price     Rating   ║╟───────────────────────────────────────────────────╢║ Milk           Dairy           $2.99      6.283   ║║ Cheese         Dairy          $10.99      8.2     ║║ Apples        Produce          $0.99     10.00    ║╚═══════════════════════════════════════════════════╝"""🎨 Use a preset styleSee a list of 30+ preset styleshere.fromtable2asciiimporttable2ascii,Alignment,PresetStyleoutput=table2ascii(header=["First","Second","Third","Fourth"],body=[["10","30","40","35"],["20","10","20","5"]],column_widths=[10,10,10,10],style=PresetStyle.ascii_box)print(output)"""+----------+----------+----------+----------+|  First   |  Second  |  Third   |  Fourth  |+----------+----------+----------+----------+|    10    |    30    |    40    |    35    |+----------+----------+----------+----------+|    20    |    10    |    20    |    5     |+----------+----------+----------+----------+"""output=table2ascii(header=["First","Second","Third","Fourth"],body=[["10","30","40","35"],["20","10","20","5"]],style=PresetStyle.plain,cell_padding=0,alignments=Alignment.LEFT,)print(output)"""First Second Third Fourth10    30     40    3520    10     20    5"""🎲 Define a custom styleCheckTableStylefor more info andPresetStylefor examples.fromtable2asciiimporttable2ascii,TableStylemy_style=TableStyle.from_string("*-..*||:+-+:+     *''*")output=table2ascii(header=["First","Second","Third"],body=[["10","30","40"],["20","10","20"],["30","20","30"]],style=my_style)print(output)"""*-------.--------.-------*| First : Second : Third |+-------:--------:-------+|  10   :   30   :  40   ||  20   :   10   :  20   ||  30   :   20   :  30   |*-------'--------'-------*"""🪄 Merge adjacent cellsfromtable2asciiimporttable2ascii,Merge,PresetStyleoutput=table2ascii(header=["#","G","Merge",Merge.LEFT,"S"],body=[[1,5,6,200,Merge.LEFT],[2,"E","Long cell",Merge.LEFT,Merge.LEFT],["Bonus",Merge.LEFT,Merge.LEFT,"F","G"],],footer=["SUM","100","200",Merge.LEFT,"300"],style=PresetStyle.double_thin_box,first_col_heading=True,)print(output)"""╔═════╦═════╤═══════╤═════╗║  #  ║  G  │ Merge │  S  ║╠═════╬═════╪═══╤═══╧═════╣║  1  ║  5  │ 6 │   200   ║╟─────╫─────┼───┴─────────╢║  2  ║  E  │  Long cell  ║╟─────╨─────┴───┬───┬─────╢║     Bonus     │ F │  G  ║╠═════╦═════╤═══╧═══╪═════╣║ SUM ║ 100 │  200  │ 300 ║╚═════╩═════╧═══════╧═════╝"""⚙️ OptionsAll parameters are optional. At least one ofheader,body, andfootermust be provided.Refer to thedocumentationfor more information.OptionSupported TypesDescriptionheaderSequence[SupportsStr],None(Default:None)First table row seperated by header row separator. Values should supportstr()bodySequence[Sequence[SupportsStr]],None(Default:None)2D List of rows for the main section of the table. Values should supportstr()footerSequence[SupportsStr],None(Default:None)Last table row seperated by header row separator. Values should supportstr()column_widthsSequence[Optional[int]],None(Default:None/ automatic)List of column widths in characters for each columnalignmentsSequence[Alignment],Alignment,None(Default:None/ all centered)Column alignments(ex.[Alignment.LEFT, Alignment.CENTER, Alignment.RIGHT, Alignment.DECIMAL])number_alignmentsSequence[Alignment],Alignment,None(Default:None)Column alignments for numeric values.alignmentswill be used if not specified.styleTableStyle(Default:double_thin_compact)Table style to use for the table*first_col_headingbool(Default:False)Whether to add a heading column separator after the first columnlast_col_headingbool(Default:False)Whether to add a heading column separator before the last columncell_paddingint(Default:1)The minimum number of spaces to add between the cell content and the cell borderuse_wcwidthbool(Default:True)Whether to usewcwidthinstead oflen()to calculate cell width*See a list of all preset styleshere.See theAPI Referencefor more info.👨‍🎨 Use cases🗨️ Discord messages and embedsDisplay tables nicely inside markdown code blocks on DiscordUseful for making Discord bots withDiscord.py💻 Terminal outputsTables display nicely whenever monospace fonts are fully supportedTables make terminal outputs look more professional🤗 ContributingContributions are welcome!SeeCONTRIBUTING.mdfor more details on how to get involved.