Ë “óW QBöãóL—dZddlmZddgZdZdZdZdZdd lZdd l Z dd l Z d „Z dd lZd „ZddlmZej(dk\reZeZneZeZd„Zd„ZGd„de«ZGd„de«ZGd„d«Ze dk(ræe«Z!e!jEgd¢«e!jGgd¢«e!jIgd¢gd¢gd¢gd¢g«e%e!jM««e%«e«Z!e!jOejP«e!jSgd¢«e!jEgd¢«e!jIgd ¢gd!¢gd"¢gd#¢gd$¢g«e%e!jM««y y #e $r2 dd l Z d „Z n%#e $rejjd «‚wxYwY�ŒnwxYw#e $rd„ZY�ŒuwxYw)%a¦module to create simple ASCII tables Example: table = Texttable() table.set_cols_align(["l", "r", "c"]) table.set_cols_valign(["t", "m", "b"]) table.add_rows([["Name", "Age", "Nickname"], ["Mr\nXavier\nHuon", 32, "Xav'"], ["Mr\nBaptiste\nClement", 1, "Baby"], ["Mme\nLouise\nBourgeau", 28, "Lou\n\nLoue"]]) print(table.draw()) print() table = Texttable() table.set_deco(Texttable.HEADER) table.set_cols_dtype(['t', # text 'f', # float (decimal) 'e', # float (exponent) 'i', # integer 'a']) # automatic table.set_cols_align(["l", "r", "r", "r", "l"]) table.add_rows([["text", "float", "exp", "int", "auto"], ["abcd", "67", 654, 89, 128.001], ["efghijk", 67.5434, .654, 89.6, 12800000000000000000000.00023], ["lmn", 5e-78, 5e-78, 89.4, .000000000000128], ["opqrstu", .023, 5e+78, 92., 12800000000000000000000]]) print(table.draw()) Result: +----------+-----+----------+ | Name | Age | Nickname | +==========+=====+==========+ | Mr | | | | Xavier | 32 | | | Huon | | Xav' | +----------+-----+----------+ | Mr | | | | Baptiste | 1 | | | Clement | | Baby | +----------+-----+----------+ | Mme | | Lou | | Louise | 28 | | | Bourgeau | | Loue | +----------+-----+----------+ text float exp int auto =========================================== abcd 67.000 6.540e+02 89 128.001 efgh 67.543 6.540e-01 90 1.280e+22 ijkl 0.000 5.000e-78 89 0.000 mnop 0.023 5.000e+78 92 1.280e+22 é)ÚdivisionÚ TexttableÚArraySizeErrorz%Gerome Fournier ÚMITz1.7.0añJeff Kowalczyk: - textwrap improved import - comment concerning header output Anonymous: - add_rows method, for adding rows in one go Sergey Simonenko: - redefined len() function to deal with non-ASCII characters Roger Lew: - columns datatype specifications Brian Peterson: - better handling of unicode errors Frank Sachsenheim: - add Python 2/3-compatibility Maximilian Hils: - fix minor bug for Python 3 compatibility frinkelpi: - preserve empty lines Ncó.—tj||«S©N)ÚcjkwrapÚwrap©ÚtxtÚwidths ú./usr/lib/python3.12/site-packages/texttable.pyÚ textwrapperrgs€Ü�|‰|˜C Ó'Ð'ócó.—tj||«Sr)Útextwrapr r s rrrls€Ü—=‘=  eÓ,Ð ,rzCan't import textwrap module! có@—tdtj|««S)ú:Return the rendering width of a unicode character r)ÚmaxÚwcwidth©Úcs rÚ uchar_widthrws€ô�1”g—o‘o aÓ(Ó)Ð)rcó`—tj|«dvrytj|«ryy)rÚWFéré)Ú unicodedataÚeast_asian_widthÚ combiningrs rrr|s.€ô × 'Ñ '¨Ó *¨dÑ 2ØÜ × "Ñ " 1Ô %Øàr)Úreduce)ércó—t|t«r|St|t«r t|d«St|«S#t$r=}tj j d|›d|›d�«t|dd«cYd}~Sd}~wwxYw)z7Return a unicode representation of a python object zutf-8z)UnicodeDecodeError exception for string 'z': Ú ÚreplaceN)Ú isinstanceÚ unicode_typeÚ bytes_typeÚUnicodeDecodeErrorÚsysÚstderrÚwrite)ÚobjÚstrerrors rÚ obj2unicoder/�sv€ô�#”|Ô$؈ Ü �CœÔ $ð 9Ü  WÓ-Ð -ô ˜CÓ Ð øô "ò 9Ü �J‰J× Ò ÒUXÒZbÐcÔ dÜ  W¨iÓ8Õ 8ûð 9ús¤ ;» BÁ2A<Á6BÁ<Bcó—t|t«st|t«r+tt |«D�cgc] }t |«‘Œc}«S|j «Scc}w)zMRedefining len here so it will be able to work with non-ASCII characters )r&r(r'Úsumr/rÚ__len__)Úiterablers rÚlenr4ŸsQ€ô�(œJÔ'¬:°hÄ Ô+MܬK¸Ô,AÓBÑ,A q”K •NÐ,AÑBÓCÐCà×ÑÓ!Ð!ùòCs³Acó—eZdZdZd„Zd„Zy)rzEException raised when specified rows don't fit the required size có@—||_tj||d«y)NÚ)ÚmsgÚ ExceptionÚ__init__)Úselfr8s rr:zArraySizeError.__init__¬s€ØˆŒÜ×ј4  bÕ)rcó—|jSr)r8©r;s rÚ__str__zArraySizeError.__str__°s €Ø�x‰xˆrN)Ú__name__Ú __module__Ú __qualname__Ú__doc__r:r>©rrrr¨s„ñò*órcó—eZdZdZy)ÚFallbackToTextz#Used for failed conversion to floatN)r?r@rArBrCrrrErE´s„Ù-ØrrEcóB—eZdZdZdZdZdZd*d„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„Zd„Zd„Zd+d„Zd„Zed„«Zed„«Zed„«Zed„«Zed„«Zed„«Zed„«Zd„Zd„Zd„Z d„Z!d„Z"d „Z#d!„Z$d"„Z%d,d#„Z&d$„Z'd%„Z(d&„Z)d,d'„Z*d(„Z+y))-rrréécó —|j|«d|_tjtjztj ztj z|_|jgd¢«|j«y)z­Constructor - max_width is an integer, specifying the maximum width of the table - if set to 0, size is unlimited, therefore cells won't be wrapped r")Ú-Ú|Ú+Ú=N) Ú set_max_widthÚ _precisionrÚVLINESÚHLINESÚBORDERÚHEADERÚ_decoÚ set_charsÚreset©r;Ú max_widths rr:zTexttable.__init__Às`€ð ×ј9Ô%؈Œä×%Ñ%¬ ×(8Ñ(8Ñ8¼9×;KÑ;KÑKÜ × Ñ ñˆŒ à �‰Ò+Ô,Ø � ‰ � rcó>—d|_d|_g|_g|_|S)z= 0 - default value is set to 3 rz'width must be an integer greater then 0)Útyper}rrO)r;r s rÚ set_precisionzTexttable.set_precision_s.€ô�E‹{œcÑ! U¨Q¢YÜÐFÓGÐ G؈ŒØˆ rcód—|j|«ttt|««|_|S)z(Specify the header of the table )rmr{r|r/r\ros rÚheaderzTexttable.headerls*€ð ×јUÔ#ÜœC¤ ¨UÓ3Ó4ˆŒ ؈ rcó —|j|«t|d«sdg|jz|_g}t |«D]&\}}|j |j ||««Œ(|jj |«|S)zSAdd a row in the rows stack - cells can contain newlines and tabs rxÚa)rmÚhasattrr[rxÚ enumerateÚappendÚ_strr])r;rfÚcellsÚirhs rÚadd_rowzTexttable.add_rowtss€ð ×јUÔ#ä�t˜XÔ&ؘ% $§.¡.Ñ0ˆDŒKàˆÜ˜eÖ$‰DˆAˆqØ �L‰L˜Ÿ™ 1 a›Õ )ð%à � ‰ ×ј%Ô Øˆ rcóÜ—|rQt|d«r,t|d«r |j|j««n|j|d«|dd}|D]}|j|«Œ|S)züAdd several rows in the rows stack - The 'rows' argument can be either an iterator returning arrays, or a by-dimensional array - 'header' specifies if the first row should be used as the header of the table Ú__iter__ÚnextrrN)r‰r†r’r�)r;Úrowsr†Úrows rÚadd_rowszTexttable.add_rows…sb€ñ Ü�t˜ZÔ(¬W°T¸6Ô-BØ— ‘ ˜DŸI™I›KÕ(à— ‘ ˜D ™GÔ$ؘA˜B�x�ÛˆCØ �L‰L˜Õ ðàˆ rcó~—|js |jsy|j«|j«d}|j «r||j «z }|jrC||j |jd¬«z }|j«r||j«z }d}|jD]X}|dz }||j |«z }|j«sŒ-|t|j«ksŒF||j «z }ŒZ|j «r||j «z }|ddS)zJDraw the table - the table is returned as a whole string Nr7T)Úisheaderrréÿÿÿÿ) r\r]Ú_compute_cols_widthÚ _check_alignÚ _has_borderÚ_hlineÚ _draw_lineÚ _has_headerÚ _hline_headerÚ _has_hlinesr4)r;ÚoutÚlengthr”s rÚdrawzTexttable.drawšs€ð �|Š| D§J¢JØ Ø × Ñ Ô"Ø ×ÑÔØˆØ × Ñ Ô Ø �4—;‘;“=Ñ ˆCØ �<Š<Ø �4—?‘? 4§<¡<¸$�?Ó?Ñ ?ˆCØ×ÑÔ!Ø�t×)Ñ)Ó+Ñ+�؈ؗ:”:ˆCØ �a‰KˆFØ �4—?‘? 3Ó'Ñ 'ˆCØ×ÑÕ! f¬s°4·:±:«Ó&>Ø�t—{‘{“}Ñ$‘ð ð × Ñ Ô Ø �4—;‘;“=Ñ ˆCØ�3�Bˆxˆrcól—|€ t«‚ t|«S#ttf$r t«‚wxYwr)rEÚfloatÚ TypeErrorr)Úclsrhs rÚ _to_floatzTexttable._to_floatµs;€à ˆ9Ü Ó"Ð "ð #ܘ“8ˆOøÜœ:Ð&ò #Ü Ó"Ð "ð #úsŽ ™3c ó”—t|«tk(r t|«Sttt|j |««««S)z)Integer formatting class-method. )rƒr}raÚroundr¨©r§rhÚkws rÚ_fmt_intzTexttable._fmt_int¾s6€ô �‹7”cŠ>Ü�q“6ˆMä”sœ5 §¡¨qÓ!1Ó2Ó3Ó4Ð 4rc óP—|jd«}d||j|«fzS)zÉFloat formatting class-method. - x parameter is ignored. Instead kw-argument f being x float-converted will be used. - precision will be taken from `n` kw-argument. Únz%.*f©Úgetr¨©r§rhr¬r¯s rÚ _fmt_floatzTexttable._fmt_floatÇó*€ð �F‰F�3‹KˆØ˜˜CŸM™M¨!Ó,Ð-Ñ-Ð-rc óP—|jd«}d||j|«fzS)zÏExponential formatting class-method. - x parameter is ignored. Instead kw-argument f being x float-converted will be used. - precision will be taken from `n` kw-argument. r¯z%.*er°r²s rÚ_fmt_expzTexttable._fmt_expÓr´rc ó—t|«S)zString formatting class-method.)r/r«s rÚ _fmt_textzTexttable._fmt_textßs€ô˜1‹~Ðrc ó*—tt|««S)zBoolean formatting class-method)raÚboolr«s rÚ _fmt_boolzTexttable._fmt_booläs€ô”4˜“7‹|Ðrc ó—|j|«}t|«dkDr |j}nX||k7r |j}nF|t |«z dk(r)t |t «r |jn |j}n |j}||fi|¤ŽS)zauto formatting class-method.g„×—Ar) r¨Úabsr¶r¸rªr&rºr»r­r³)r§rhr¬ÚfÚfns rÚ _fmt_autozTexttable._fmt_autoésu€ð �M‰M˜!Ó ˆÜ ˆq‹6�CŠ<Ø—‘‰BØ �!ŠVØ—‘‰BØ ”�q“‰\˜QÒ Ü",¨Q´Ô"5�—’¸3¿<¹<‰Bà—‘ˆBÙ�!‰{�r‰{ÐrcóD—|j|j|j|j|j|j dœ}|j }|j|} t|«r||«S||||¬«S#t$r|j |«cYSwxYw)zŽHandles string formatting of cell data i - index of the cell datatype in self._dtype x - cell data to format )rˆrŽÚbr¾ÚeÚt)r¯) rÀr­r»r³r¶r¸rOrxÚcallablerE)r;rŽrhÚFMTr¯Údtypes rrŒzTexttable._str÷s“€ð—‘Ø— ‘ Ø—‘Ø—‘Ø— ‘ Ø—‘ñ ˆð �O‰OˆØ— ‘ ˜A‘ˆð %ܘŒÙ˜Q“x�à!�s˜5‘z ! qÔ)Ð)øÜò %Ø—>‘> !Ó$Ò $ð %úsÁ"BÁ5 BÂBÂBcóž—|jst|«|_y|jt|«k7rtd|jz«‚y)zCCheck that the specified array fits the previous rows size z array should contain %d elementsN)r[r4rros rrmzTexttable._check_row_sizesG€ð�~Š~Ü  ›ZˆD�NØ �^‰^œs 5›zÒ )Ü Ð!CØ—.‘.ñ"!ó"ð "ð*rcóB—|jtjzdkDS)z8Return a boolean, if vlines are required or not r)rTrrPr=s rÚ _has_vlineszTexttable._has_vlinesó€ð�z‰zœI×,Ñ,Ñ,¨qÑ0Ð0rcóB—|jtjzdkDS)z8Return a boolean, if hlines are required or not r)rTrrQr=s rr zTexttable._has_hlines rËrcóB—|jtjzdkDS)z7Return a boolean, if border is required or not r)rTrrRr=s rr›zTexttable._has_border&rËrcóB—|jtjzdkDS)zØ$ a™i¨!™m¨qÑ0‘FðFô�t˜VÓ$‰Dððˆ rc óD—t|d«ryg}|jr(|jD�cgc]}|j|«‘Œ}}|jD]S}t |t t t|««««D]'\}} t|||j|««||<Œ)ŒUt|«}t|«}d|dz zddg|j«z}|jry||z|jkDrg |j||zkr td«‚|j|z } dg|z} d}| dkDr+| |||kr| |xxdz cc<| dz} |dz|z}| dkDrŒ+| }||_ycc}w#ttf$r$|j|j|««Y�Œ$wxYw)aReturn an array with the width of each column If a specific width has been specified, exit. If the total of the columns width exceed the table desired width, another width will be computed to fit, and cells will be wrapped. r€Nr"rrrGz max_width too low to render data)r‰r\râr]rÚr{rÛr4rr¦Ú IndexErrorr‹r1r›r_rr€) r;rÞrhr”rÜrŽÚncolsÚ content_widthÚ deco_widthÚavailable_widthÚnewmaxis rr™zTexttable._compute_cols_widthgs¥€ô �4˜Ô "Ø ØˆØ �<Š<Ø04· ² Ó>± ¨1�T—^‘^ AÕ&° ˆDÐ>Ø—:”:ˆCܘc¤4¬¬c°#«h«Ó#8Ö9‘��Qð6Ü! $ q¡'¨4¯>©>¸$Ó+?Ó@�D˜’Gñ:ðô�D“ ˆÜ˜D› ˆ ؘ˜a™‘[ A a 5¨×)9Ñ)9Ó);Ñ#<Ñ<ˆ Ø �?Š?  ° Ñ :¸d¿o¹oÒMð ð�‰ %¨*Ñ"4Ò5Ü Ð!CÓDÐDØ"Ÿo™o° Ñ:ˆOØ�c˜E‘kˆG؈AØ! AÒ%ؘ1‘:  Q¡Ò'ؘA“J !‘O“JØ# qÑ(�Oؘ‘U˜e‘O�ð " AÓ%ð ˆD؈� ùò5?øô "¤:Ð.ò6Ø—K‘K §¡¨tÓ 4×5ð6úsªE'Â!E,Å,/FÆFcóÌ—t|d«sdg|jz|_t|d«sdg|jz|_t|d«sdg|jz|_yy)zFCheck if alignment has been specified, set default one if not rnrrrrÖrurÄN)r‰r[rnrrrur=s rršzTexttable._check_align�s^€ô�t˜_Ô-Ø"% ¨¯©Ñ!7ˆDÔ Ü�t˜XÔ&ؘ% $§.¡.Ñ0ˆDŒKÜ�t˜YÔ'ؘ5 4§>¡>Ñ1ˆD�Lð(rc ó¼—|j||«}d}d}tt|d««D�]*}|j«r|d|jzz }d}t ||j |j«D]·\}}} |dz }||} |t| «z } |r|j|dz } | dk(r || |z| zz }n@| dk(r0|t| dz «|z| zt| dz | dzz«|zzz }n || | |zzz }|t|«ksŒ“|d ||jg|j«zz }Œ¹|d d||jzg|j«zz }�Œ-|S) zPDraw a line Loop over a single cell length, over all the cells Ú r7rz%s rÚrrrz %s z%s ) Ú_splititrÛr4r›rcrÚr€rrrnr}rÊ) r;rßr—Úspacer¡rŽr¢rÜr ÚalignÚ cell_lineÚfills rr�zTexttable._draw_linešs‹€ð �}‰}˜T 8Ó,ˆØˆØˆÜ”s˜4 ™7“|×$ˆAØ×ÑÔ!Ø�u˜tŸ™Ñ.Ñ.�؈FÜ&)¨$°· ± ¸T¿[¹[Ö&IÑ"��e˜Uؘ!‘ �Ø  ™G� Øœs 9›~Ñ-�ÙØ ×.Ñ.¨v¸©zÑ:�EؘC’<ؘ4 %™<¨)Ñ3Ñ3‘Cؘc’\ØœC  Q¡›K¨%Ñ/°)Ñ;Ü! $ q¡&¨4°©6¡/Ó2°UÑ:ñ;ñ<‘Cð˜9 t¨e¡|Ñ3Ñ3�CØœC ›IÓ%ؘ6 U¨D¯O©OÐ$<¸T×=MÑ=MÓ=OÑ$PÑPÑP‘Cð'Jð �6˜R ¨¯©Ñ!8Ð9¸$×:JÑ:JÓ:LÑMÑMÑ MŠCð'%ð(ˆ rc ó—g}t||j«D]n\}}g}|jd«D]B}|j«dk(r|j d«Œ(|j t ||««ŒD|j |«Œpttttt|«««}t||j«D]•\}} |rd} | dk(rK|t|«z } dgt| dz «z|dd|j dgt| dz | dzz«z«ŒZ| dk(rdg|t|«z z|ddŒu|j dg|t|«z z«Œ—|S) zªSplit each element of line to fit the column width Each element is turned into a list, result of the wrapping of the string to the desired width r$r7rÄÚmrNrrÂ)rÚr€rÙÚstripr‹Úextendrr!rr{r|r4rur}) r;rßr—Ú line_wrappedrÜr rfrÚmax_cell_linesÚvalignÚmissings rrîzTexttable._splitit¹sL€ðˆ ܘt T§[¡[Ö1‰KˆD�%؈EØ—Z‘Z Ö%�Ø—7‘7“9 ’?Ø—L‘L Õ$à—L‘L¤¨Q°Ó!6Õ7ð &ð × Ñ  Õ &ð2ô ¤¤T¬#¬c°<Ó*@Ó%AÓBˆÜ  ¨d¯l©lÖ;‰LˆD�&ÙØ�ؘŠ}Ø(¬3¨t«9Ñ4�ؘ4¤# g°¡kÓ"2Ñ2��R�a�Ø— ‘ ˜R˜D¤3 w°¡{°W¸q±[Ñ'@Ó#AÑAÕBؘ3’ؘ4 >´C¸³IÑ#=Ñ>��R�a‘à— ‘ ˜R˜D N´S¸³YÑ$>Ñ?Õ@ð<ðÐrN)éP)T)F),r?r@rArRrSrQrPr:rVrNrUrkrprsrvryr�r„r†r�r•r£Ú classmethodr¨r­r³r¶r¸r»rÀrŒrmrÊr r›ržrŸrœrÐrâr™ršr�rîrCrrrr¹s4„à €FØ €FØ €FØ €Fó ò òòò&ò* ò ò òò*ò( òòó"ò*ð6ñ#óð#ðñ5óð5ðñ .óð .ðñ .óð .ðñóððñóððñ óð ò%ò2"ò1ò 1ò 1ò 1ò 'ò "óò(ò&&òP 2óó>rÚ__main__)rÖrír)rÄrôrÂ)ÚNameÚAgeÚNickname)zMr Xavier Huoné zXav')zMr Baptiste ClementrÚBaby)zMme Louise Bourgeauéz Lou Loue)rÄr¾rÃrŽrˆ)rÖrírírírÖ)Útextr¥Úexpr}Úauto)ÚabcdÚ67iŽéYgyé&1`@)Úefghijkg_)ËÇâP@g!°rh‘íä?gffffffV@g@Œµx¯…D)ÚlmnçÜ�Á؆â/r gš™™™™YV@gV瞯B=)ÚopqrstugZd;ßO�—?g/'Û%—EPgW@lÆZx^+)*rBÚ __future__rÚ__all__Ú __author__Ú __license__Ú __version__Ú __credits__r*rr rÚ ImportErrorrr+r,rrÚ functoolsr!Ú version_inforar'Úbytesr(Úunicoder/r4r9rrErr?Útablersrvr•Úprintr£rkrSryrCrrÚrsÜðñ6õp à Ð(Ð )€à 4€ Ø€ Ø€ ð€ ó6 Ûð Ûò(ðÛò*õà×Ñ�vÒØ€LØ�Jà€LØ€Jò !ò"ô �Yô ô �Yô ÷ \ñ\ð~ ˆzÒÙ ‹K€EØ ×ÑšÔ)Ø ×Ñš/Ô*Ø ‡N�NÒ/Ú4Ú8ÚAðCôDñ ˆ%�*‰*‹,ÔÙ „Gá ‹K€EØ ‡N�N�9×#Ñ#Ô$Ø ×Ñòô ð  ×ÑÒ2Ô3Ø ‡N�NÒ>Ú?ÚUÚHÚOð QôRñ  ˆ%�*‰*‹,Õð1øð_òðÛó -øà òØ � ‰ ×ÑÐ:Ô;Ø ðúò -ðûð$ò õð ús:žE¦FÅFÅ#E+Å*FÅ+"F Æ FÆFÆF#Æ"F#