Як я можу заповнити рядок Python пробілами?


508

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

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

Але що мені робити, коли я цього хочу?

'hi    '

Звичайно, я можу виміряти довжину струни і робити str+" "*leftover, але мені хотілося б найкоротшого шляху.


1
Я знаю, що це може бути застарілим у майбутньому, але мені все одно подобається цей старий добрий метод: "%-6s" % sдля вирівняних уліво та "%6s" % sдля правого.
Basj

Відповіді:


698

Це можна зробити за допомогою str.ljust(width[, fillchar]):

Повернути рядок ліворуч виправданим у рядку шириною довжини . Прокладка робиться за допомогою вказаного наповнювача (за замовчуванням - пробіл). Початкова рядок повертається, якщо ширина менша за len(s).

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

18
Відповідь @simon є більш гнучким і кориснішим при форматуванні більш складних рядків
CoatedMoose

3
або @abbot 's, якщо ви застрягли, підтримуючи старі версії python
CoatedMoose

1
ljust () тепер застарілий. Дивіться stackoverflow.com/questions/14776788/… про правильний спосіб зробити це
Мауг каже, що поверніть Моніку

Її пішло в python 3? Просто хотів додати, є також rjust і центр, які працюють майже так само, але для різних вирівнювань
radtek

17
ljust (), rjust () застаріли лише з рядкового модуля. Вони доступні на str вбудованого типу.
Рохан Гровер

372

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

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

з F-рядків

>>> 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').
Martijn Pieters

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 = ['привіт', 'привіт', 'ciao']
ak_slick

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

80

Ви можете спробувати це:

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

print "'% -6s'"% "привіт" дійсно !!
конус

8
@simon, як хтось застряг у системі python2.5, ця відповідь допомогла мені, а не марна відповідь +1
sunshinekitty

18
Більше не застаріло в 3.3+
Seppo Erviälä

3
Нам більше подобається цей загальний синтаксис printf. Дозволяє писати складні рядки без незліченних конкатенацій.
Макс Цепков

4
Для повноти можна "'%+100s'" % 'hi'було б поставити пробіли праворуч від'hi'
Ерік Блюм

62

Правильним способом цього буде використання синтаксису формату 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. Це магія. І це не добре зафіксовано.
Chang Ye

@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
Чи можете ви детальніше розглянути це? Це не те, що я вам не вірю, я просто хочу зрозуміти, чому.
Zev Chonoles

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:]скоріше, хоча це лише для розваги, і я рекомендую інші відповіді.
Poikilos

-1

Ви можете зробити це, використовуючи розуміння списку, це також дасть вам уявлення про кількість пробілів і буде одним вкладишем.

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

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