Archive
fancy text tables
Problem
Instead of simply printing some data on the screen, I wanted to put them in a nicely formatted ASCII table.
Solution
After some research I found a nice package for this purpose: python-tabulate. It supports both Python 2 and Python 3 (yes, from now on it’s also important for me).
Its usage is very simple. Here is a snippet that creates random usernames and passwords:
from tabulate import tabulate
table = []
headers = ["Username #1", "Username #2", "Password #1", "Password #2"]
for _ in range(10):
name1 = get_username_1()
name2 = get_username_2()
pass1 = get_password_1(8)
pass2 = get_password_2(12)
table.append([name1, name2, pass1, pass2])
# print("{:15}{:15}{:15}{:15}".format(name1, name2, pass1, pass2)) # this is the past :)
print(tabulate(table, headers=headers, tablefmt="psql"))
Output:
+---------------+---------------+---------------+---------------+ | Username #1 | Username #2 | Password #1 | Password #2 | |---------------+---------------+---------------+---------------| | Adarah | hasana | ygyQsF6u | uTzPqZMDNJ6x | | Alary | begahi | YqW4aY7q | ipZuX0sX2RFg | | Solita | otomot | Xwliu9yi | IjeFibVFaoZq | | Casony | rikari | fw6dk5gt | zbAXO8gd33Lh | | Anne | asakou | MXsXpz43 | aYNiJTwojULG | | Joby | mgomam | vZjiCuyT | qc3Q9caAenJw | | Kallita | aremon | j1ZD1QU9 | AIEsykmYodfy | | Cara | iumina | 75UzkKgK | lK92GdAxn441 | | Fuscie | goomio | uof2C7ct | HFgVlAZ9PSmv | | Dean | utinon | gycncz9f | 61oJzUGdDVKf | +---------------+---------------+---------------+---------------+
The module supports various formatting styles. For more examples, check out the official page.
Update (20191029)
The project has moved to https://github.com/astanin/python-tabulate .
Print unicode text to the terminal
Problem
I wrote a script in Eclipse-PyDev that prints some text with accented characters to the standard output. It runs fine in the IDE but it breaks in the console:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 11: ordinal not in range(128)
This thing bugged me for a long time but now I found a working solution.
Solution
Insert the following in your source code:
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
I found this trick here. “This allows you to switch from the default ASCII to other encodings such as UTF-8, which the Python runtime will use whenever it has to decode a string buffer to unicode.”
Related
‘ascii’ codec can’t encode character: ordinal not in range(128)
Problem
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 1: ordinal not in range(128)
Solution
def encode(text):
"""
For printing unicode characters to the console.
"""
return text.encode('utf-8')
Or:
reload(sys)
sys.setdefaultencoding("latin-1")
a = u'\xe1'
print str(a) # no exception
This tip is from here.
unicode to ascii
Problem
I had the following unicode string: “Kellemes Ünnepeket!” that I wanted to simplify to this: “Kellemes Unnepeket!”, that is strip “Ü” to “U”. Furthermore, most of the strings were normal ascii, only some of them were in unicode.
Solution
import unicodedata
title = ... # get the string somehow
try:
# if the title is a unicode string, normalize it
title = unicodedata.normalize('NFKD', title).encode('ascii','ignore')
except TypeError:
# if it was not a unicode string => OK, do nothing
pass
Credits
I used the following resources:
Python Challenge #1
This exercise is from http://www.pythonchallenge.com.
Challenge
We have the following encoded text:
g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.
And the following hint to decode it: “K -> M, O -> Q, E -> G”.
First try to solve it yourself. My solution is below.
Read more…
ASCII table
Exercise: Print out the ASCII table.
Solution:
#!/usr/bin/env python
for char in range(256):
print "%d: %c" % (char, char)
Note that range(N) creates a list of elements in the interval [0, N), that is N is excluded. In the example, it will be 0..255.
Output (special characters are removed):
0:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33: !
34: "
35: #
36: $
37: %
38: &
39: '
40: (
41: )
42: *
43: +
44: ,
45: -
46: .
47: /
48: 0
49: 1
50: 2
51: 3
52: 4
53: 5
54: 6
55: 7
56: 8
57: 9
58: :
59: ;
60: <
61: =
62: >
63: ?
64: @
65: A
66: B
67: C
68: D
69: E
70: F
71: G
72: H
73: I
74: J
75: K
76: L
77: M
78: N
79: O
80: P
81: Q
82: R
83: S
84: T
85: U
86: V
87: W
88: X
89: Y
90: Z
91: [
92: \
93: ]
94: ^
95: _
96: `
97: a
98: b
99: c
100: d
101: e
102: f
103: g
104: h
105: i
106: j
107: k
108: l
109: m
110: n
111: o
112: p
113: q
114: r
115: s
116: t
117: u
118: v
119: w
120: x
121: y
122: z
123: {
124: |
125: }
126: ~
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161: ¡
162: ¢
163: £
164: ¤
165: ¥
166: ¦
167: §
168: ¨
169: ©
170: ª
171: «
172: ¬
173:
174: ®
175: ¯
176: °
177: ±
178: ²
179: ³
180: ´
181: µ
182: ¶
183: ·
184: ¸
185: ¹
186: º
187: »
188: ¼
189: ½
190: ¾
191: ¿
192: À
193: Á
194: Â
195: Ã
196: Ä
197: Å
198: Æ
199: Ç
200: È
201: É
202: Ê
203: Ë
204: Ì
205: Í
206: Î
207: Ï
208: Ð
209: Ñ
210: Ò
211: Ó
212: Ô
213: Õ
214: Ö
215: ×
216: Ø
217: Ù
218: Ú
219: Û
220: Ü
221: Ý
222: Þ
223: ß
224: à
225: á
226: â
227: ã
228: ä
229: å
230: æ
231: ç
232: è
233: é
234: ê
235: ë
236: ì
237: í
238: î
239: ï
240: ð
241: ñ
242: ò
243: ó
244: ô
245: õ
246: ö
247: ÷
248: ø
249: ù
250: ú
251: û
252: ü
253: ý
254: þ
255: ÿ
