ChatGPT解决这个技术问题 Extra ChatGPT

How can I fill out a Python string with spaces?

I want to fill out a string with spaces. I know that the following works for zero's:

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

But what should I do when I want this?:

'hi    '

of course I can measure string length and do str+" "*leftover, but I'd like the shortest way.

I know it might be deprecated in the future, but I still like this good old method: "%-6s" % s for left-aligned and "%6s" % s for right-aligned.

F
Felix Kling

You can do this with str.ljust(width[, fillchar]):

Return the string left justified in a string of length width. Padding is done using the specified fillchar (default is a space). The original string is returned if width is less than len(s).

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

@simon 's answer is more flexible and more useful when formatting more complex strings
or @abbot 's if you are stuck supporting old versions of python
ljust() is now deprecated. See stackoverflow.com/questions/14776788/… for the correct way to do it
Its gone in python 3? Just wanted to add there is also rjust and center which work much the same way but for different alignments
ljust(), rjust() have been deprecated from the string module only. They are available on the str builtin type.
N
Neuron

For a flexible method that works even when formatting complicated string, you probably should use the string-formatting mini-language,

using either f-strings

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

or the str.format() method

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

What if you have '16' in a variable?
I had problems with this type of formatting when I was using national accents. You would want 'kra' and 'krá' to be the same, but they were not.
@Randy '{message: <{fill}}'.format(message='Hi', fill='16')
Don't use str.format() for templates with only a single {...} and nothing else. Just use the format() function and save yourself the parsing overhead: format('Hi', '<16').
@aaaaaa readability is subjective. I liked this answer a lot, it's very concise and clear.
C
CivFan

The new(ish) string format method lets you do some fun stuff with nested keyword arguments. The simplest case:

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

If you want to pass in 16 as a variable:

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

If you want to pass in variables for the whole kit and kaboodle:

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

Which results in (you guessed it):

'Hi              '

And for all these, you can use python 3.6+ f-strings:

message = 'Hi'
fill = ' '
align = '<'
width = 16
f'{message:{fill}{align}{width}}'

And of course the result:

'Hi              '

How would you handle varying the message as well? msgs = ['hi', 'hello', 'ciao']
@ak_slick You can pass in variables instead of hard-coded values into the format function.
a
abbot

You can try this:

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

print "'%-6s'" % 'hi' indeed!!
@simon as someone stuck on a python2.5 system this answer helped me, not a useless answer +1
Not deprecated any more in 3.3+
I like this common printf syntax much better. Allows you to write complex strings without countless concatenations.
For completeness, "'%+100s'" % 'hi' would work for putting spaces to the right of 'hi'
A
Azat Ibrakov

Correct way of doing this would be to use Python's format syntax as described in the official documentation

For this case it would simply be:
'{:10}'.format('hi')
which outputs:
'hi '

Explanation:

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" | "%"

Pretty much all you need to know is there ^.

Update: as of python 3.6 it's even more convenient with literal string interpolation!

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

j
johnsyweb

Use str.ljust():

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

You should also consider string.zfill(), str.ljust() and str.center() for string formatting. These can be chained and have the 'fill' character specified, thus:

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

These string formatting operations have the advantage of working in Python v2 and v3.

Take a look at pydoc str sometime: there's a wealth of good stuff in there.


Thanks for pointing out the str.center(n) method. It was just what i was looking for and didn't even know its existance. :D
W
WAF

As of Python 3.6 you can just do

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

with literal string interpolation.

Or, if your padding size is in a variable, like this (thanks @Matt M.!):

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

f'{strng: >10}' for filling string with leading whitespace to a length of 10. That is magic. And it is not well documented.
@changye I believe this is also the default behavior of f'{strng:10}'.
R
Remi

you can also center your string:

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

K
K.Mat

TL;DR

text = 'hi'
print(f'{text:10}') # 'hi        '

Longer explanation

Since Python3.6 you can use f-strings literal interpolation.

Variable space:

value = 4
space = 10

# move value to left
print(f'foo {value:<{space}} bar') # foo 4          bar
# move value to right
print(f'foo {value:>{space}} bar') # foo          4 bar
# center value
print(f'foo {value:^{space}} bar') # foo     4      bar

Constant space:

value = 4

# move value to left
print(f'foo {value:<10} bar') # foo 4          bar
# move value to right
print(f'foo {value:>10} bar') # foo          4 bar
# center value
print(f'foo {value:^10} bar') # foo     4      bar

If you want to padd with some other char then space, specify it at the beginning:

value = 4
space = 10
padd = '_'

print(f'foo {value:{padd}^{space}} bar') # foo ____4_____ bar
print(f'foo {value:_^10} bar')           # foo ____4_____ bar

Today, this should be preferred to the other approaches.
a
aodj

Use Python 2.7's mini formatting for strings:

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

This left aligns, and pads to 8 characters with the ' ' character.


@simon already gave this answer... why posting a duplicate answer?
I didn't click the 'new responses have been posted, click to refresh' and so missed it.
e
eldarerathis

Just remove the 0 and it will add space instead:

>>> print  "'%6d'"%4

Z
Zev Chonoles

Wouldn't it be more pythonic to use slicing?

For example, to pad a string with spaces on the right until it's 10 characters long:

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

To pad it with spaces on the left until it's 15 characters long:

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

It requires knowing how long you want to pad to, of course, but it doesn't require measuring the length of the string you're starting with.


Can you elaborate on that? It's not that I don't believe you, I just want to understand why.
Sure. The most pythonic way would be to use one of the builtin functions rather than using a homegrown solution as much as possible.
@MadPhysicist saying that slicing is less pythonic because you should use in built functions is like saying ''.join(reversed(str)) is more pythonic than str[::-1], and we all know that's not true.
@NickA. That is not a very good analogy. The case you are using as an example is quite valid. However, (x + " " * 10)[:10] is in my opinion much more convoluted than using x.ljust(10).
@MadPhysicist I more meant that your comment "The most pythonic way would be to use one of the builtin functions" is not always accurate and that they aren't words to live by. Although in this case it certainly is.
E
Erik Anderson

A nice trick to use in place of the various print formats:

(1) Pad with spaces to the right:

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

(2) Pad with leading zeros on the left:

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

For some reason this is the funniest answer but I like it. Along those lines also consider: min_len = 8 then ('hi' + ' '*min_len)[:min_len] or ('0'*min_len + str(2))[-min_len]
For the number, it would be ('0'*min_len + str(2))[-min_len:] rather, though this is only for fun, and I recommend the other answers.
f
foobar666

You could do it using list comprehension, this'd give you an idea about the number of spaces too and would be a one liner.

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

...and then you get a string that is 22 (len("hello")+17 :( ) characters long--that didn't go well. While we are being funny we could do s = "hi" ; s + (6-len(s)) * " " instead (it is ok when the result is negative). However, answers which use whatever framework feature that addresses the exact issue will be easier to maintain (see other answers).
Doesn't answer the question, the amount of space needed is unknown as str lengths vary.