Строки Python с определенной шириной - PullRequest
1 голос
/ 02 ноября 2011

У меня возникли некоторые проблемы с поиском хорошего объяснения того, как это сделать, поэтому указание правильного направления было бы полезно для решения следующей проблемы.

Мне нужно распечатать заголовокв симпатичном формате вместе с данными, к сожалению, то, что произошло, показано ниже.

DeviceName   KB used   KB quota   KB hard limit   grace   
/media/Stuff        58384   5242880   0   none

Для этого я создал список для заголовка.

HEADER=['DeviceName', 'KB USED', . . .]

и то же самоес другими записями, которые мне нужно распечатать.Для того, чтобы распечатать его выше, я сделал что-то вроде

print "".join('%s'.rjust(5) %i for i in HEADER)

Так что это, очевидно, не работает, потому что rjust просто добавляет пробелы справа от строки.Есть ли способ напечатать строку так, чтобы она занимала точно определенную ширину, и если строка не достаточно длинна, чтобы соответствовать ширине, то просто дополняйте ее пробелами?

PS Я ограничен Python 2.4, что означает, что я не могу использовать формат из Python 2.7.

Ответы [ 4 ]

2 голосов
/ 02 ноября 2011

Вы можете использовать '%*s':

HEADER = "DeviceName   |KB used|KB quota|KB hard limit| grace".split('|')
data = ["/media/Stuff", 58384, 5242880, 0, None]
print '|'.join(HEADER)
print '|'.join("%*s" % (width, val) for width, val in zip(map(len,HEADER), data))

Выход

DeviceName   |KB used|KB quota|KB hard limit| grace
 /media/Stuff|  58384| 5242880|            0|  None
2 голосов
/ 02 ноября 2011

Вы хотите это наоборот.Как примерно так:

>>> "%-5s" % 'sss'
'sss  '
1 голос
/ 02 ноября 2011
 '%s'.rjust(5)

вставляет пробелы, предполагая, что литерал %s является вашей строкой. Вы будете заменять это другой строкой неизвестной длины, поэтому вы не сможете оправдать ее до окончания замены.

Однако вы не хотите явно .rjust() все самостоятельно, потому что эта функциональность встроена в механизм замещения. Просто поместите ширину поля между % и s.

Вы можете построить строку формата динамически, измерив длину строк в заголовке. Используйте %% для получения буквального знака % при форматировании; таким образом, '%%%ds' % 10 превращается в '%10s', что приведет к ширине поля 10.

Таким образом, что-то вроде:

format_string = ' '.join('%%%ds' % len(h) for h in HEADER)
print ' '.join(HEADER)
for entry in data: print format_string % entry
0 голосов
/ 02 ноября 2011

Отформатируйте строку с точностью:

print ' '.join("%5.5s" % s for s in HEADER)

Или, нарезать rjust результат:

print ' '.join(s.rjust(5)[:5] for s in HEADER)
...