私はreStructuredTextのテーブルに出力したいPythonのタプルのリストを持っています。Pythonデータ構造をreStructuredTextに出力するためのアプローチは何ですか?
のdocutilsライブラリは、他の形式にreStructuredTextのを変換するための素晴らしいサポートを持っていますが、私はreStructuredTextのにメモリ内のデータ構造から直接書きたいと思います。
私はreStructuredTextのテーブルに出力したいPythonのタプルのリストを持っています。Pythonデータ構造をreStructuredTextに出力するためのアプローチは何ですか?
のdocutilsライブラリは、他の形式にreStructuredTextのを変換するための素晴らしいサポートを持っていますが、私はreStructuredTextのにメモリ内のデータ構造から直接書きたいと思います。
私はPythonのデータ構造からRSTを出力するライブラリは認識していませんが、自分でフォーマットするのはかなり簡単です。
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)) * ' ')
>> 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 |
+------------------+------------------+------------------+
私は迅速かつ汚いreStructuredTextのテーブルに使用するコードです:ここではRSTテーブルにPythonのタプルのリストをフォーマットの例を示します。 。私は列がここに独立
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
===== ============= ====================================
サイズになるように、それを少し洗練されたコード
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"
cieplakの答えは偉大だった@:ここ
>>> 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
===== ===== =========
はここで文字列と複数行のサポートへの変換を追加することcieplakのコード@ですされています。多分それは誰かに使用されるでしょう。
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
tabulateパッケージを確認してください。 それができることで、出力RSTフォーマット:あなたは、PythonからCSVにダンプするために選択し、http://docutils.sourceforge.net/docs/ref/rst/directives.html#csv-table にそれを持っているとして、RSTのCSV-テーブルの機能を使用することができます
print tabulate(table, headers, tablefmt="rst")
:ファイル:ディレクティブは、単純に含めるようにしデータを含むcsvファイル