How can I fill out a Python string with spaces?

2018-12-31 21:54发布

问题:

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.

回答1:

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        \'


回答2:

Unless you need to support Python 2.5, you can (and probably should) use the string-formatting mini-language, like so:

\'{0: <16}\'.format(\'Hi\')


回答3:

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              \'


回答4:

You can try this:

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


回答5:

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.



回答6:

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!


回答7:

you can also center your string:

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


回答8:

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}}\'


回答9:

Use Python 2.7\'s mini formatting for strings:

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

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



回答10:

Just remove the 0 and it will add space instead:

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


回答11:

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.



回答12:

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                 \'


回答13:

+= can be used to append to string

>>> string = \'hi\'
>>> for s in range(0,5):
...    string += \' \'
... 
>>> string
\'hi          \'