How to Print “Pretty” String Output in Python

后端 未结 4 1670
不知归路
不知归路 2020-12-02 13:31

I have a list of dicts with the fields classid, dept, coursenum, area, and title from a sql query. I would like to output the values in a human readable format. I was thinki

4条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-02 13:55

    class TablePrinter(object):
        "Print a list of dicts as a table"
        def __init__(self, fmt, sep=' ', ul=None):
            """        
            @param fmt: list of tuple(heading, key, width)
                            heading: str, column label
                            key: dictionary key to value to print
                            width: int, column width in chars
            @param sep: string, separation between columns
            @param ul: string, character to underline column label, or None for no underlining
            """
            super(TablePrinter,self).__init__()
            self.fmt   = str(sep).join('{lb}{0}:{1}{rb}'.format(key, width, lb='{', rb='}') for heading,key,width in fmt)
            self.head  = {key:heading for heading,key,width in fmt}
            self.ul    = {key:str(ul)*width for heading,key,width in fmt} if ul else None
            self.width = {key:width for heading,key,width in fmt}
    
        def row(self, data):
            return self.fmt.format(**{ k:str(data.get(k,''))[:w] for k,w in self.width.iteritems() })
    
        def __call__(self, dataList):
            _r = self.row
            res = [_r(data) for data in dataList]
            res.insert(0, _r(self.head))
            if self.ul:
                res.insert(1, _r(self.ul))
            return '\n'.join(res)
    

    and in use:

    data = [
        {'classid':'foo', 'dept':'bar', 'coursenum':'foo', 'area':'bar', 'title':'foo'},
        {'classid':'yoo', 'dept':'hat', 'coursenum':'yoo', 'area':'bar', 'title':'hat'},
        {'classid':'yoo'*9, 'dept':'hat'*9, 'coursenum':'yoo'*9, 'area':'bar'*9, 'title':'hathat'*9}
    ]
    
    fmt = [
        ('ClassID',       'classid',   11),
        ('Dept',          'dept',       8),
        ('Course Number', 'coursenum', 20),
        ('Area',          'area',       8),
        ('Title',         'title',     30)
    ]
    
    print( TablePrinter(fmt, ul='=')(data) )
    

    produces

    ClassID     Dept     Course Number        Area     Title                         
    =========== ======== ==================== ======== ==============================
    foo         bar      foo                  bar      foo                           
    yoo         hat      yoo                  bar      hat                           
    yooyooyooyo hathatha yooyooyooyooyooyooyo barbarba hathathathathathathathathathat
    

提交回复
热议问题