2012-07-05 25 views

Trả lời

5

Tôi không biết bất kỳ thư viện nào để xuất RST từ cấu trúc dữ liệu python, nhưng khá dễ dàng để tự định dạng nó. Dưới đây là một ví dụ về định dạng một danh sách các hàng trăn để một bảng 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    | 
+------------------+------------------+------------------+ 

đây là đoạn code tôi sử dụng cho các bảng reStructuredText nhanh chóng và dơ bẩn:

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

@ câu trả lời cieplak là vĩ đại . Tôi tinh chế nó một chút để cột có kích thước một cách độc lập

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

Đây là mã

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

Dưới đây là @ đang cieplak của thêm chuyển đổi sang chuỗi và hỗ trợ nhiều dòng. Có lẽ nó sẽ được sử dụng cho ai đó.

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

Kiểm tra gói tabulate. Nó có thể định dạng RST đầu ra bằng cách:

print tabulate(table, headers, tablefmt="rst") 
Các vấn đề liên quan