美文网首页
Python 实现类似MySql查询格式化输出

Python 实现类似MySql查询格式化输出

作者: 无敌闹闹 | 来源:发表于2018-12-27 05:15 被阅读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 笔者暂时无法知道是由于什么原因,如果谁知道解决方案请留言告诉笔者, 笔者将不胜感激.

    相关文章

      网友评论

          本文标题:Python 实现类似MySql查询格式化输出

          本文链接:https://www.haomeiwen.com/subject/anyllqtx.html