筆者今天在寫一個格式化輸出的時候想到了之前使用Mysql的時候發(fā)現(xiàn), MySql查詢表的時候輸出的數(shù)據(jù)還是蠻好看,蠻規(guī)整的
image
然后先Google了一下看有沒有現(xiàn)成的代碼可以用,結(jié)果失望而歸!
看來還是毛爺爺說的對, 自己動手豐衣足食!
表是一個二維結(jié)構(gòu), 所以筆者打算寫一個函數(shù), 輸入一個表然后打印出來.
筆者的輸入?yún)?shù)結(jié)構(gòu)如下:
[
["123,"123,"123"],
["123,"123","123]
...
]
空行表示方法:
["","",""]
這時候筆者發(fā)現(xiàn)了一個問題, 如果英文和中文混合的話, 因為1個中文字符的長度=2個英文字符, 所以需要先處理這個棘手的問題.
筆者的思路是先計算輸入字符串的長度, 一個英文長度=1, 一個漢字=2
def sum_string_length(strings):
'''
輸入一個字符串, 返回字符串的長度
'''
length = 0
for stringin strings:
if u'\u4e00' <= string<= u'\u9fff':
length += 2
elif u'\uFF01' <= string<= u'\uFF5E':
length += 2
else:
length += 1
return length
這里筆者把漢字,還有全角符號的長度記為2, 其他的記為1
我們需要先計算每一列最長字符串的長度
four_space = " "
# 列表元素為每一列最長字符的長度, 列表長度等于每一行的元素數(shù)
each_col_max_length_list = []
# 一行的元素個數(shù)
row_element_count = len(two_dimension_list[0])
for col in range(row_element_count):
max_length = 0
for i in range(len(two_dimension_list)):
element_length = sum_string_length(two_dimension_list[i][col])
if max_length < element_length:
max_length = element_length
each_col_max_length_list.append(max_length)
each_col_max_length_list 的長度等于行的元素個數(shù)(表每行的元素數(shù)相等)
這個列表里每個元素表示每列最長的字符串長度
打印第一行
vertical_line_count = len(each_col_max_length_list)
before_space_count = vertical_line_count*4
after_space_count = sum(each_col_max_length_list) + before_space_count
line_count = before_space_count + after_space_count + vertical_line_count
case_str = "+{0}+".format("-"*(line_count-1))
print(case_str)
打印內(nèi)容
for row_num in range(len(two_dimension_list)):
output_str = "|"
for element in range(len(two_dimension_list[row_num])):
later_space_count = each_col_max_length_list[element] - sum_string_length(two_dimension_list[row_num][element]) + 4
# 減一表示"|"占用一個空格位置
space1 = " "*(later_space_count)
output_str += "{space0}{value}{space1}|".format(space0=four_space,
value=two_dimension_list[row_num][element],
space1=space1)
# 判斷是否空行
if output_str.replace("|","").replace(" ",""):
print(output_str)
else:
# 如果是空行
output_str = "|"
for i in range(len(two_dimension_list[row_num])):
output_str += "-"*(each_col_max_length_list[i] + 8) + "+"
output_str = output_str[:-1] + "|"
print(output_str)
print(case_str)
完整代碼如下:
def print_table(two_dimension_list):
'''
打印表格函數(shù)
輸入一個2維列表,格式參見:
[
["123,"123,"123"],
["123,"123","123]
...
]
空行表示方法:
["","",""]
注意每行的元素數(shù)需要相等
:param two_dimension_list:
:return:
'''
def sum_string_length(keys):
length = 0
for key in keys:
if u'\u4e00' <= key <= u'\u9fff':
length += 2
elif u'\uFF01' <= key <= u'\uFF5E':
length += 2
else:
length += 1
return length
four_space = " "
# 列表元素為每一列最長字符的長度, 列表長度等于每一行的元素數(shù)
each_col_max_length_list = []
# 一行的元素個數(shù)
row_element_count = len(two_dimension_list[0])
for col in range(row_element_count):
max_length = 0
for i in range(len(two_dimension_list)):
element_length = sum_string_length(two_dimension_list[i][col])
if max_length < element_length:
max_length = element_length
each_col_max_length_list.append(max_length)
# print(each_col_max_length_list)
# 這個可以表示"|"的數(shù)量
vertical_line_count = len(each_col_max_length_list)
before_space_count = vertical_line_count*4
after_space_count = sum(each_col_max_length_list) + before_space_count
line_count = before_space_count + after_space_count + vertical_line_count
case_str = "+{0}+".format("-"*(line_count-1))
print(case_str)
for row_num in range(len(two_dimension_list)):
output_str = "|"
for element in range(len(two_dimension_list[row_num])):
later_space_count = each_col_max_length_list[element] - sum_string_length(two_dimension_list[row_num][element]) + 4
# 減一表示"|"占用一個空格位置
space1 = " "*(later_space_count)
output_str += "{space0}{value}{space1}|".format(space0=four_space,
value=two_dimension_list[row_num][element],
space1=space1)
# 判斷是否空行
if output_str.replace("|","").replace(" ",""):
print(output_str)
else:
# 如果是空行
output_str = "|"
for i in range(len(two_dimension_list[row_num])):
output_str += "-"*(each_col_max_length_list[i] + 8) + "+"
output_str = output_str[:-1] + "|"
print(output_str)
print(case_str)
test_list = [
["姓名", "身份證號", "性別"],
["","",""],
["Lorenzo", "123456789123456ASDAS3","男"],
["Bianca","","女"],
["Laura", "123456789123456123123","未知"]
]
print_table(test_list)
測試截圖
1123.png
在筆者的測試中, 在有些IDE里會出現(xiàn)無法對齊的情況, 例如:Pycharm 筆者暫時無法知道是由于什么原因,如果誰知道解決方案請留言告訴筆者, 筆者將不勝感激.