Как я могу заполнить строку Python пробелами?


509

Я хочу заполнить строку пробелами. Я знаю, что для нулей работает следующее:

>>> print  "'%06d'"%4
'000004'

Но что мне делать, когда я этого хочу?

'hi    '

Конечно, я могу измерить длину строки и сделать str+" "*leftover, но я бы хотел кратчайший путь.


1
Я знаю, что это может быть устаревшим в будущем, но мне все еще нравится этот старый добрый метод: "%-6s" % sдля выравнивания по левому краю и "%6s" % sдля выравнивания по правому краю.
Basj

Ответы:


700

Вы можете сделать это с str.ljust(width[, fillchar]):

Вернуть строку, выровненную влево, в строку ширины длины . Заполнение выполняется с использованием указанного fillchar (по умолчанию это пробел). Исходная строка возвращается, если ширина меньше len(s).

>>> 'hi'.ljust(10)
'hi        '

18
Ответ @simon является более гибким и более полезным при форматировании более сложных строк
CoatedMoose

3
или @abbot, если вы застряли с поддержкой старых версий Python
CoatedMoose

1
Функция ljust () устарела. См. Stackoverflow.com/questions/14776788/… для правильного способа сделать это
Mawg говорит восстановить Monica

Его нет в питоне 3? Просто хотел добавить, что есть также Rjust и Center, которые работают примерно одинаково, но для разных выравниваний
Радтек

17
ljust (), rjust () исключены только из строкового модуля. Они доступны по встроенному типу str.
Рохан Гровер

374

Для гибкого метода, который работает даже при форматировании сложной строки, вам, вероятно, следует использовать мини-язык форматирования строки , используя любой из str.format()методов

>>> '{0: <16} StackOverflow!'.format('Hi')  # Python >=2.6
'Hi               StackOverflow!'

из струнных

>>> f'{"Hi": <16} StackOverflow!'  # Python >= 3.6
'Hi               StackOverflow!'

11
Что делать, если у вас есть 16 в переменной?
Рэнди

Я тоже это понял. Должен был опубликовать это. Документы говорят, что это должно работать для Py2.6, но мои выводы - иначе. Работает в Py2.7, хотя.
Рэнди

1
У меня были проблемы с этим типом форматирования, когда я использовал национальные акценты. Вы бы хотели, чтобы «kra» и «krá» были одинаковыми, но это не так.
quapka

77
@Randy'{message: <{fill}}'.format(message='Hi', fill='16')
CivFan

19
Не используйте str.format()для шаблонов только один {...}и ничего больше. Просто используйте format()функцию и сохранить себя разбор накладных расходов: format('Hi', '<16').
Мартин Питерс

119

Новый (ish) метод строкового формата позволяет вам делать забавные вещи с вложенными ключевыми аргументами. Самый простой случай:

>>> '{message: <16}'.format(message='Hi')
'Hi             '

Если вы хотите передать в 16качестве переменной:

>>> '{message: <{width}}'.format(message='Hi', width=16)
'Hi              '

Если вы хотите передать переменные для всего набора и kaboodle :

'{message:{fill}{align}{width}}'.format(
   message='Hi',
   fill=' ',
   align='<',
   width=16,
)

К чему приводит (как вы уже догадались):

'Hi              '

Как бы вы справились с изменением сообщения? msgs = ['hi', 'hello', 'ciao']
ak_slick

1
@ak_slick Вы можете передавать переменные вместо жестко заданных значений в функцию форматирования.
CivFan

80

Вы можете попробовать это:

print "'%-100s'" % 'hi'

напиши "'% -6s'"% 'hi' действительно !!
конус

8
@Simon, как кто-то застрял в системе python2.5, этот ответ мне помог, а не бесполезный ответ +1
sunshinekitty

18
Больше не рекомендуется в версии 3.3+
Сеппо Эрвиала

3
Мне больше нравится этот общий синтаксис printf. Позволяет писать сложные строки без многочисленных конкатенаций.
Макс Цепков

4
Для полноты, "'%+100s'" % 'hi'будет работать для размещения пробелов справа от'hi'
Эрик Блум

63

Правильный способ сделать это будет использовать синтаксис формата Python, как описано в официальной документации

Для этого случая это будет просто:
'{:10}'.format('hi')
какие выводы:
'hi '

Объяснение:

format_spec ::=  [[fill]align][sign][#][0][width][,][.precision][type]
fill        ::=  <any character>
align       ::=  "<" | ">" | "=" | "^"
sign        ::=  "+" | "-" | " "
width       ::=  integer
precision   ::=  integer
type        ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

Практически все, что вам нужно знать, это ^.

Обновление: с Python 3.6 это еще более удобно с интерполяцией литеральных строк!

foo = 'foobar'
print(f'{foo:10} is great!')
# foobar     is great!

37

Используйте str.ljust():

>>> 'Hi'.ljust(6)
'Hi    '

Следует также учитывать string.zfill(), str.ljust()и str.center()для строки форматирования. Они могут быть объединены в цепочку и иметь заданный символ заполнения , таким образом:

>>> ('3'.zfill(8) + 'blind'.rjust(8) + 'mice'.ljust(8, '.')).center(40)
'        00000003   blindmice....        '

Эти операции форматирования строк имеют преимущество работы в Python v2 и v3.

Взгляните на какое- pydoc strто время: там много хороших вещей.


27

Начиная с Python 3.6 вы можете просто сделать

>>> strng = 'hi'
>>> f'{strng: <10}'

с интерполяцией буквенных строк .

Или, если ваш размер заполнения находится в переменной, как это (спасибо @Matt M.!):

>>> to_pad = 10
>>> f'{strng: <{to_pad}}'

4
f'{strng: >10}'для заполнения строки начальными пробелами до длины 10. Это волшебство. И это не очень хорошо задокументировано.
Чанг Йе

@changye Я считаю, что это также поведение по умолчанию f'{strng:10}'.
WAF

17

Вы можете также центрировать вашу строку:

'{0: ^20}'.format('nice')

7

Используйте мини-форматирование Python 2.7 для строк :

'{0: <8}'.format('123')

Выравнивание по левому краю и добавление 8 символов к символу ''.


4
@simon уже дал этот ответ ... зачем публиковать повторяющийся ответ?
Феликс Клинг

5
Я не нажимал «новые ответы были опубликованы, нажмите, чтобы обновить» и поэтому пропустил его.
aodj


2

Разве не было бы более питоническим использовать нарезку?

Например, чтобы заполнить строку пробелами справа до 10 символов:

>>> x = "string"    
>>> (x + " " * 10)[:10]   
'string    '

Чтобы дополнить его пробелами слева до 15 символов:

>>> (" " * 15 + x)[-15:]
'         string'

Конечно, это требует знания того, как долго вы хотите заполнить, но не требует измерения длины строки, с которой вы начинаете.


9
Нет, не будет.
Безумный физик

1
Можете ли вы уточнить это? Дело не в том, что я тебе не верю, я просто хочу понять почему.
Зев Чонолес

4
Конечно. Наиболее питоническим способом было бы использовать одну из встроенных функций, а не использовать доморощенное решение в максимально возможной степени.
Безумный физик

@MadPhysicist говорит, что нарезка менее питонна, потому что вы должны использовать ее во встроенных функциях, это все равно что говорить ''.join(reversed(str))более питонически str[::-1], и мы все знаем, что это не так.
Ник

@NickA. Это не очень хорошая аналогия. Случай, который вы используете в качестве примера, вполне допустим. Однако, (x + " " * 10)[:10]на мой взгляд, гораздо более запутанный, чем использование x.ljust(10).
Безумный физик

0

Хорошая уловка для использования вместо различных форматов печати:

(1) Подушка с пробелами справа:

('hi' + '        ')[:8]

(2) Подушка с ведущими нулями слева:

('0000' + str(2))[-4:]

1
По какой-то причине это самый смешной ответ, но мне он нравится. Вдоль этих строк также рассмотрим: min_len = 8тогда ('hi' + ' '*min_len)[:min_len]или('0'*min_len + str(2))[-min_len]
Пойкилось

1
Для числа это было бы ('0'*min_len + str(2))[-min_len:]скорее, хотя это только для забавы, и я рекомендую другие ответы.
Пойкилось

-1

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

"hello" + " ".join([" " for x in range(1,10)])
output --> 'hello                 '

... а затем вы получите строку длиной 22 (len ("привет") + 17 :() символов - это не очень хорошо. Пока мы веселимся, мы можем это сделать s = "hi"; s + (6-len(s)) * " "вместо этого (это нормально, когда результат отрицательный). Тем не менее, ответы, которые используют любую базовую функцию, которая решает конкретную проблему, будет легче поддерживать (см. другие ответы).
Пойкилос
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.