What are some approaches to outputting a Python data structure to reStructuredText

后端 未结 6 565
星月不相逢
星月不相逢 2020-12-31 18:21

I have a list of tuples in Python that I would like to output to a table in reStructuredText.

The docutils library has great support for converting reStructuredText

6条回答
  •  天命终不由人
    2020-12-31 19:01

    @cieplak's answer was great. I refined it a bit so that columns are sized independently

        print make_table( [      ['Name', 'Favorite Food', 'Favorite Subject'],
                                 ['Joe', 'Hamburgrs', 'I like things with really long names'],
                                 ['Jill', 'Salads', 'American Idol'],
                                 ['Sally', 'Tofu', 'Math']])
    
        ===== ============= ==================================== 
        Name  Favorite Food Favorite Subject                     
        ===== ============= ==================================== 
        Joe   Hamburgrs     I like things with really long names 
        ----- ------------- ------------------------------------ 
        Jill  Salads        American Idol                        
        ----- ------------- ------------------------------------ 
        Sally Tofu          Math                                 
        ===== ============= ==================================== 
    

    Here is the code

    def make_table(grid):
        max_cols = [max(out) for out in map(list, zip(*[[len(item) for item in row] for row in grid]))]
        rst = table_div(max_cols, 1)
    
        for i, row in enumerate(grid):
            header_flag = False
            if i == 0 or i == len(grid)-1: header_flag = True
            rst += normalize_row(row,max_cols)
            rst += table_div(max_cols, header_flag )
        return rst
    
    def table_div(max_cols, header_flag=1):
        out = ""
        if header_flag == 1:
            style = "="
        else:
            style = "-"
    
        for max_col in max_cols:
            out += max_col * style + " "
    
        out += "\n"
        return out
    
    
    def normalize_row(row, max_cols):
        r = ""
        for i, max_col in enumerate(max_cols):
            r += row[i] + (max_col  - len(row[i]) + 1) * " "
    
        return r + "\n"
    

提交回复
热议问题