2015-08-13 2 views
1

Я новичок в python и столкнулся с проблемой. У меня есть текстовый файл, который я прочитал в списке, а затем разделим его на куски или «команды». Количество подписок создается на основе количества команд, которые я хочу. Все это сделано. Но я хочу распечатать его в хорошем табличном формате. Я рассмотрел следующие вопросы: this, this и this, но они не то, что я ищу. Я даже посмотрел на pypi-модули PrettyTable и DataGrid.Python: Распечатать список в виде таблиц

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

['name9', 'name2'], ['name4', 'name11'], ['name10', 'name3'], ['name7', 'name6'], ['name5', 'name8'], ['name']] 

Я распечатать его, как это:

for i in range(len(l)): 
    print "Teams{}\t\t ".format(i+1), 
print 
for x in itertools.izip_longest(*l, fillvalue="."): 
    print "\n" 
    t = "\t\t ".join(str(i) for i in x) 
    print t 

Какие результаты в:

Teams1  Teams2   Teams3   Teams4   Teams5   Teams6 


name9  name4  name10  name7  name5  name 


name2  name11  name3  name6  name8  . 

Есть ли способ я могу получить выход такой как:

Team 1  Team 2  Team 3  Team 4  Team 5  Team 6 
------------------------------------------------------------------- 
name9  name4  name10  name7  name5  name 
name2  name11  name3  name6  name8  . 

И правильно ли выровнять их?

ответ

1

Использование prettytable

from prettytable import PrettyTable 

teams = ['team%d'%(x+1) for x in range(len(l)) ] 
x = PrettyTable(teams) 
for i in itertools.izip_longest(*l, fillvalue="."): 
    x.add_row(i) 
x.vertical_char = ' ' 
x.junction_char = '-' 

print(x) 

--------------------------------------------------- 
    team1 team2 team3 team4 team5 team6 
--------------------------------------------------- 
    name9 name4 name10 name7 name5 name 
    name2 name11 name3 name6 name8  .  
--------------------------------------------------- 

lines = x.get_string().split('\n') 
output = '\n'.join(lines[1:-1]) 
print(output) 

team1 team2 team3 team4 team5 team6 
--------------------------------------------------- 
name9 name4 name10 name7 name5 name 
name2 name11 name3 name6 name8  . 
+0

Perfect !!. Большое спасибо! – newkid101

0

Пробег: tabview: https://pypi.python.org/pypi/tabview/.

Он может быть использован как в качестве инструмента Cli как модуль Python:

import tabview as t 
a = [["a","b","c"], ["d","e","f"]] 
t.view(a) 
+1

я сделал. Это не дает результат, на который я нацелен – newkid101

1

Это использует метод строки ljust() влево-обосновывать каждый элемент вместо того, чтобы полагаться на несколько вкладок и таможни print окончания (помещается в блок if в интерпретаторе, чтобы вы могли видеть всю таблицу сразу):

>>> if 1: 
...  print "".join( ("Teams" + str(i+1)).ljust(10) for i in xrange(10)) 
...  print 
...  for x in itertools.izip_longest(*l, fillvalue="."): 
...    print "".join(str(i).ljust(10) for i in x) 
... 
Teams1 Teams2 Teams3 Teams4 Teams5 Teams6 Teams7 Teams8 Teams9 Teams10 

name9  name4  name10 name7  name5  name 
name2  name11 name3  name6  name8  . 
6

В качестве альтернативы, если вы не хотите использовать библиотеку третьей стороны:

from itertools import izip_longest 

data = [['name9', 'name2'], ['name4', 'name11'], ['name10', 'name3'], ['name7', 'name6'], ['name5', 'name8'], ['name']] 

length = max(len(name) for names in data for name in names) 
gutter = 5 

format_string = '{{:<{}}}'.format(length + gutter) 

print ''.join(format_string.format('Team {}'.format(x)) for x in range(len(data))) 
print '-' * len(data) * (length + gutter) 
for names in izip_longest(*data, fillvalue='.'): 
    print ''.join(format_string.format(name) for name in names) 

Производит:

Team 0  Team 1  Team 2  Team 3  Team 4  Team 5 
------------------------------------------------------------------ 
name9  name4  name10  name7  name5  name 
name2  name11  name3  name6  name8  . 
1

Это может быть сделано путем создания все, построчно:

teams = {'Teams 1': ['name9', 'name2'], 
     'Teams 2': ['name4', 'name11'], 
     'Teams 3':['name10']} 

print teams 

line1 = [] 
line2 = [] 
line3 = [] 

for key, value in teams.iteritems(): 
    line1.append(key) 
    line2.append(value[0]) 
    if len(value) == 2: 
     line3.append(value[1]) 
    else: 
     line3.append(".") 

def build_row(line, max_width=20): 
    linef = '' 
    for i in line: 
     spaces = max_width - len(i) 
     linef += i 
     linef += ' '*spaces 
    return linef 

row1 = build_row(line1) 
print row1 
print '-'*len(row1) 
print build_row(line2) 
print build_row(line3) 

>>> 
Teams 1    Teams 3    Teams 2    
------------------------------------------------------------ 
name9    name10    name4    
name2    .     name11  
1

Почему нет форматирования строк https://docs.python.org/2/library/string.html#format-specification-mini-language

l = [['name9', 'name2'], ['name4', 'name11'], ['name10', 'name3'], ['name7', 'name6'], ['name5', 'name8'], ['name']] 
cell = "{:<10}" 

for i in range(len(l)): 
    hdr = "Teams{}".format(i+1) 
    print(cell.format(hdr), end="") 
print("\n") 
print("-"*60)  
for x in zip_longest(*l, fillvalue="."):  
    t = "".join(cell.format(i) for i in x) 
    print(t + "\n") 

жаль, что я использую Python 3.4 так что моя печать требует ()

Смежные вопросы