2012-07-05 23 views

Respuesta

5

No conozco ninguna biblioteca para generar RST desde las estructuras de datos de Python, pero es bastante fácil formatearla usted mismo. Aquí está un ejemplo de formato a una lista de tuplas de pitón a una tabla RST:

>>> data = [('hey', 'stuff', '3'), 
      ('table', 'row', 'something'), 
      ('xy', 'z', 'abc')] 
>>> numcolumns = len(data[0]) 
>>> colsizes = [max(len(r[i]) for r in data) for i in range(numcolumns)] 
>>> formatter = ' '.join('{:<%d}' % c for c in colsizes) 
>>> rowsformatted = [formatter.format(*row) for row in data] 
>>> header = formatter.format(*['=' * c for c in colsizes]) 
>>> output = header + '\n' + '\n'.join(rowsformatted) + '\n' + header 
>>> print output 
===== ===== ========= 
hey stuff 3   
table row something 
xy z  abc  
===== ===== ========= 
6
>> print make_table([['Name', 'Favorite Food', 'Favorite Subject'], 
        ['Joe', 'Hamburgers', 'Cars'], 
        ['Jill', 'Salads', 'American Idol'], 
        ['Sally', 'Tofu', 'Math']]) 

+------------------+------------------+------------------+ 
| Name    | Favorite Food | Favorite Subject | 
+==================+==================+==================+ 
| Joe    | Hamburgers  | Cars    | 
+------------------+------------------+------------------+ 
| Jill    | Salads   | American Idol | 
+------------------+------------------+------------------+ 
| Sally   | Tofu    | Math    | 
+------------------+------------------+------------------+ 

Aquí está el código que utilizo para las tablas reStructuredText rápidos y sucios:

def make_table(grid): 
    cell_width = 2 + max(reduce(lambda x,y: x+y, [[len(item) for item in row] for row in grid], [])) 
    num_cols = len(grid[0]) 
    rst = table_div(num_cols, cell_width, 0) 
    header_flag = 1 
    for row in grid: 
     rst = rst + '| ' + '| '.join([normalize_cell(x, cell_width-1) for x in row]) + '|\n' 
     rst = rst + table_div(num_cols, cell_width, header_flag) 
     header_flag = 0 
    return rst 

def table_div(num_cols, col_width, header_flag): 
    if header_flag == 1: 
     return num_cols*('+' + (col_width)*'=') + '+\n' 
    else: 
     return num_cols*('+' + (col_width)*'-') + '+\n' 

def normalize_cell(string, length): 
    return string + ((length - len(string)) * ' ') 
2

@ respuesta de Cieplak era estupenda . Refiné un poco para que las columnas están dimensionados de forma independiente

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         
    ===== ============= ==================================== 

Este es el código

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" 
0

Aquí está el código de @ Cieplak adición de conversión a cadena y el apoyo de varias líneas. Tal vez sea útil para alguien.

def make_table(grid): 
cell_width = 2 + max(reduce(lambda x,y: x+y, [[max(map(len, str(item).split('\n'))) for item in row] for row in grid], [])) 
num_cols = len(grid[0]) 
rst = table_div(num_cols, cell_width, 0) 
header_flag = 1 
for row in grid: 
    split_row = [str(cell).split('\n') for cell in row] 
    lines_remaining = 1 

    while lines_remaining>0: 
     normalized_cells = [] 
     lines_remaining = 0 
     for cell in split_row: 
      lines_remaining += len(cell) 

      if len(cell) > 0: 
       normalized_cell = normalize_cell(str(cell.pop(0)), cell_width - 1) 
      else: 
       normalized_cell = normalize_cell('', cell_width - 1) 

      normalized_cells.append(normalized_cell) 

     rst = rst + '| ' + '| '.join(normalized_cells) + '|\n' 

    rst = rst + table_div(num_cols, cell_width, header_flag) 
    header_flag = 0 
return rst 
6

Salida del paquete tabulate. Se puede formato RST producto mediante:

print tabulate(table, headers, tablefmt="rst") 
Cuestiones relacionadas