2015-01-11 2 views
5

дано CSV с содержанием что-то вроде:создания таблицы с помощью CSV данных

Colour, Red, Black, Blue 
Taste, Good, Bad, Disgusting 
Smell, Pleasant, Deceptive, Intolerable 

Как я могу напечатать это в Python, так что это будет выглядеть следующим образом:

+-------+-----------+-----------+ 
|Colour |Taste  | Smell  | 
+-------+-----------+-----------+ 
| Red |Good  | Pleasant | 
| Black | Bad  | Deceptive | 
| Blue | Disgusting|Intolerable| 
+-------+-----------+-----------+ 

Do I нужно создать таблицу вручную с помощью + 's -'s и \' s с учетом самых длинных строк соответствующих столбцов или есть встроенный метод для этого? Я искал таблицы python, но ничего не было связано с проблемой. Также примерная таблица, которую я вводил вручную, не симметрична в каждой ячейке (не «правильно выровнена»).

Crux проблемы + - | создание таблицы.

Что делать?

ответ

3

Ближе всего к встроенному в методе используется str.format:

import csv 
with open("output.txt") as f: 
    lines = list(csv.reader(f,delimiter=",")) 
    # get longest string for alignment 
    mx_len = len(max((max(ele,key=len) for ele in lines),key=len)) 
    # transpose the list items 
    zipped = zip(*lines) 
    # get header/first row 
    row1 = zipped[0] 
    # how many "-" we need depends on longests word length 
    pattern = "-"*mx_len 
    f = ("+{pat}+{pat}+{pat}+".format(pat=pattern)) 
    print(f) 
    # pass in mx_len as align value 
    print("|{:<{i}}|{:<{i}}|{:<{i}}|".format(*row1,i=mx_len)) 
    print(f) 
    # print the rest of the transposed data excluding column 1/row1 
    for a, b, c in zipped[1:]: 
     print("|{:<{i}}|{:<{i}}|{:<{i}}|".format(a.rstrip(),b.rstrip(),c.rstrip(),i=mx_len)) 
    print(f) 

+------------+------------+------------+ 
|Colour  |Taste  |Smell  | 
+------------+------------+------------+ 
| Red  | Good  | Pleasant | 
| Black  | Bad  | Deceptive | 
| Blue  | Disgusting | Intolerable| 
+------------+------------+------------+ 

Без точно знать, сколько перевалы находятся в файле:

with open("output.txt") as f: 
    lines = list(csv.reader(f, delimiter=",")) 
    mx_len = len(max((max(ele, key=len) for ele in lines), key=len)) 
    zipped = zip(*lines) 
    row1 = zipped[0] 
    ln = len(row1) 
    pattern = "-" * mx_len 
    f = (("+{pat}" * ln + "+").format(pat=pattern)) 
    print(f) 
    print(("|{:<{i}}" * ln + "|").format(*row1, i=mx_len)) 
    print(f) 
    for row in zipped[1:]: 
     print(("|{:<{i}}" * ln + "|").format(*row, i=mx_len)) 
    print(f) 

+------------+------------+------------+ 
|Colour  |Taste  |Smell  | 
+------------+------------+------------+ 
| Red  | Good  | Pleasant | 
| Black  | Bad  | Deceptive | 
| Blue  | Disgusting | Intolerable| 
+------------+------------+------------+ 
2

Это не встроенный, кроме вас можно использовать terminaltables:

from terminaltables import AsciiTable 

with open('test.csv') as f: 
    table_data = [line.split(",") for line in f] 
    transposed = [list(i) for i in zip(*table_data)] 

print(AsciiTable(transposed).table) 

Для установки просто сделать:

pip install terminaltables 
Смежные вопросы