Подтвердить что ты не робот

Как выровнять строку фиксированной ширины?

Мне просто нужны столбцы с фиксированной шириной текста, но все строки заполняются справа, а не слева!!?

 sys.stdout.write("%6s %50s %25s\n" % (code, name, industry))

производит

BGA                                BEGA CHEESE LIMITED   Food Beverage & Tobacco
BHP                               BHP BILLITON LIMITED                 Materials
BGL                               BIGAIR GROUP LIMITED Telecommunication Services
BGG           BLACKGOLD INTERNATIONAL HOLDINGS LIMITED                    Energy

но мы хотим

BGA BEGA CHEESE LIMITED                                Food Beverage & Tobacco
BHP BHP BILLITON LIMITED                               Materials
BGL BIGAIR GROUP LIMITED                               Telecommunication Services
BGG BLACKGOLD INTERNATIONAL HOLDINGS LIMITED           Energy
4b9b3361

Ответ 1

Вы можете префикс требования размера с помощью - к левому-оправданию:

sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry))

Ответ 2

В этой версии используется метод str.format.

Python 2.7 и более новый

sys.stdout.write("{:<7}{:<51}{:<25}\n".format(code, name, industry))

версия Python 2.6

sys.stdout.write("{0:<7}{1:<51}{2:<25}\n".format(code, name, industry))

UPDATE

Раньше в документах говорилось о том, что оператор% удаляется с языка в будущем. Это выражение было удалено из документов.

Ответ 3

sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry))

на боковой ноте вы можете сделать переменную ширины с помощью *-s

>>> d = "%-*s%-*s"%(25,"apple",30,"something")
>>> d
'apple                    something                     '

Ответ 4

Используйте -50% вместо +50% Они будут выровнены влево.

Ответ 5

Я определенно предпочитаю метод format больше, так как он очень гибкий и может быть легко расширен до ваших пользовательских классов, определяя представления __format__ или str или repr. Для удобства использования я использую print в следующих примерах, которые можно заменить на sys.stdout.write.

Простые примеры: выравнивание/заполнение

#Justify / ALign (left, mid, right)
print("{0:<10}".format("Guido"))    # 'Guido     '
print("{0:>10}".format("Guido"))    # '     Guido'
print("{0:^10}".format("Guido"))    # '  Guido   '

Мы можем добавить рядом с параметрами align, которые являются ^, < и > символом заполнения, чтобы заменить пробел любым другим символом

print("{0:.^10}".format("Guido"))    #..Guido...

Примеры с несколькими входами: выровнять и заполнить много входов

print("{0:.<20} {1:.>20} {2:.^20} ".format("Product", "Price", "Sum"))
#'Product............. ...............Price ........Sum.........'

Расширенные примеры

Если у вас есть пользовательские классы, вы можете определить его str или repr представления следующим образом:

class foo(object):
    def __str__(self):
        return "...::4::.."

    def __repr__(self):
        return "...::12::.."

Теперь вы можете использовать !s (str) или !r (repr), чтобы сообщить python о вызове этих определенных методов. Если ничего не определено, Python по умолчанию имеет значение __format__, которое также может быть перезаписано.   x = foo()

print "{0!r:<10}".format(x)    #'...::12::..'
print "{0!s:<10}".format(x)    #'...::4::..'

Источник: базовая ссылка Python, Дэвид М. Бэйсли, 4-е издание

Ответ 6

С новыми и популярными f-строками в Python 3.6 вот как мы выравниваем по левому краю, скажем, строку с длиной заполнения 16:

string = "Qaru"
print(f"{string:<16}..")
Qaru  ..

Если у вас переменная длина отступа:

k = 20
print(f"{string:<{k}}..")
Qaru      .. 

f-строки более читабельны.

Ответ 7

Это работало на моем python script:

print "\t%-5s %-10s %-10s %-10s %-10s %-10s %-20s"  % (thread[0],thread[1],thread[2],thread[3],thread[4],thread[5],thread[6])

Ответ 8

Несколько более читаемое альтернативное решение:
sys.stdout.write(code.ljust(5) + name.ljust(20) + industry)

Обратите внимание, что ljust(#ofchars) использует символы фиксированной ширины и не настраивается динамически, как другие решения.