Ответ 1
Вы можете префикс требования размера с помощью -
к левому-оправданию:
sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry))
Мне просто нужны столбцы с фиксированной шириной текста, но все строки заполняются справа, а не слева!!?
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
Вы можете префикс требования размера с помощью -
к левому-оправданию:
sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry))
В этой версии используется метод 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
Раньше в документах говорилось о том, что оператор% удаляется с языка в будущем. Это выражение было удалено из документов.
sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry))
на боковой ноте вы можете сделать переменную ширины с помощью *-s
>>> d = "%-*s%-*s"%(25,"apple",30,"something")
>>> d
'apple something '
Используйте -50%
вместо +50%
Они будут выровнены влево.
Я определенно предпочитаю метод 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-е издание
С новыми и популярными f-строками в Python 3.6 вот как мы выравниваем по левому краю, скажем, строку с длиной заполнения 16:
string = "Qaru"
print(f"{string:<16}..")
Qaru ..
Если у вас переменная длина отступа:
k = 20
print(f"{string:<{k}}..")
Qaru ..
f-строки более читабельны.
Это работало на моем 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])
Несколько более читаемое альтернативное решение:
sys.stdout.write(code.ljust(5) + name.ljust(20) + industry)
Обратите внимание, что ljust(#ofchars)
использует символы фиксированной ширины и не настраивается динамически, как другие решения.