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 笔者暂时无法知道是由于什么原因,如果谁知道解决方案请留言告诉笔者, 笔者将不胜感激.

上一篇下一篇

猜你喜欢

热点阅读