Как я могу заполнить строку 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.