Python 实现类似MySql查询格式化输出
2018-12-27 本文已影响0人
无敌闹闹
笔者今天在写一个格式化输出的时候想到了之前使用Mysql的时候发现, MySql查询表的时候输出的数据还是蛮好看,蛮规整的
image
然后先Google了一下看有没有现成的代码可以用,结果失望而归!
看来还是毛爷爷说的对, 自己动手丰衣足食!
表是一个二维结构, 所以笔者打算写一个函数, 输入一个表然后打印出来.
笔者的输入参数结构如下:
[
["123,"123,"123"],
["123,"123","123]
...
]
空行表示方法:
["","",""]
这时候笔者发现了一个问题, 如果英文和中文混合的话, 因为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 = " "
# 列表元素为每一列最长字符的长度, 列表长度等于每一行的元素数
each_col_max_length_list = []
# 一行的元素个数
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 的长度等于行的元素个数(表每行的元素数相等)
这个列表里每个元素表示每列最长的字符串长度
打印第一行
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)
完整代码如下:
def print_table(two_dimension_list):
'''
打印表格函数
输入一个2维列表,格式参见:
[
["123,"123,"123"],
["123,"123","123]
...
]
空行表示方法:
["","",""]
注意每行的元素数需要相等
: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 = " "
# 列表元素为每一列最长字符的长度, 列表长度等于每一行的元素数
each_col_max_length_list = []
# 一行的元素个数
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)
# 这个可以表示"|"的数量
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里会出现无法对齐的情况, 例如:Pycharm 笔者暂时无法知道是由于什么原因,如果谁知道解决方案请留言告诉笔者, 笔者将不胜感激.