2015-01-11 11 views
5

eine csv mit dem Inhalt etwas wie Gegeben:Tabellenerstellung mit csv Daten

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

Wie kann ich das drucken in Python, so dass es wie folgt aussehen:

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

Do I muss die Tabelle manuell mit + 's -'s und |' s unter Berücksichtigung der längsten Strings der jeweiligen Spalte erstellt werden oder gibt es dafür eine eingebaute Methode? Ich habe nach Python-Tabellen gesucht, aber nichts, was für das Problem relevant ist, ist aufgetaucht. Auch die Beispieltabelle, die ich manuell eingegeben habe, ist nicht in jeder Zelle symmetrisch (nicht "richtig ausgerichtet").

Crux des Problems ist die + - | Tabellenerstellung

Was ist zu tun?

Antwort

3

Die nächste Sache, eine integrierte Methode verwendet 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| 
+------------+------------+------------+ 

Ohne genau wissen, wie viele Spalten in der Datei sind:

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

Dies wird Sie nicht eingebaut in aber können 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) 

zu installieren, um nur tun:

pip install terminaltables