どうすればPython文字列にスペースを入力できますか?


509

文字列にスペースを入れたい。次はゼロで機能することを知っています:

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

しかし、これが欲しいときにどうすればいいですか?:

'hi    '

もちろんstr+" "*leftover、文字列の長さも測定できますが、最短の方法が欲しいです。


1
私はそれが将来廃止される可能性があることを知っていますが、私はまだこの古き良き方法が好きです:"%-6s" % s左揃えと"%6s" % s右揃えです。
Basj

回答:


700

あなたはこれを行うことができますstr.ljust(width[, fillchar])

左揃えされた文字列を長さwidthの文字列で返します。パディングは、指定されたfillcharを使用して行われます(デフォルトはスペースです)。がより小さい場合、元の文字列が返されlen(s)ます。

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

18
@simonの答えは、より複雑な文字列をフォーマットするときに、より柔軟でより便利になります
CoatedMoose '07 / 07/27

3
または、古いバージョンのpythonをサポートしていない場合は
@abbotの

1
ljust()は非推奨になりました。それを行うための正しい方法については、stackoverflow.com
questions / 14776788 /…

Python 3でなくなった?追加したかったのは、ほとんど同じように機能するが、異なる配置でも機能するrjustとcenterもあります
radtek

17
ljust()、rjust()は文字列モジュールからのみ廃止されました。これらはstr組み込みタイプで使用できます。
Rohan Grover

374

複雑な文字列をフォーマットする場合でも機能する柔軟なメソッドの場合、おそらく次のいずれかの方法を使用して、文字列フォーマットのミニ言語を使用する必要がありますstr.format()

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

F-文字列

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

11
変数に「16」がある場合はどうなりますか?
Randy

私もそれを理解しました。それを投稿する必要がありました。ドキュメントは、これはPy2.6で機能するはずであると述べていますが、私の発見はそうではありません。Py2.7でも動作します。
Randy

1
国別アクセントを使用していたときに、このタイプのフォーマットに問題がありました。「kra」と「krá」を同じにしたいのですが、同じではありません。
quapka 2014年

77
@ランディ-CivFan 2015'{message: <{fill}}'.format(message='Hi', fill='16')
1

19
str.format()1つだけで{...}他には何もないテンプレートには使用しないでください。format()関数を使用するだけで、解析のオーバーヘッドを節約できますformat('Hi', '<16')
Martijn Pieters

119

new(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ハードコードされた値の代わりに変数をformat関数に渡すことができます。
CivFan

80

あなたはこれを試すことができます:

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

印刷 "'%-6s'"% 'hi'確かに!!
テーパ

8
@simon誰かがpython2.5システムで立ち往生していたので、この答えは役に立たなかった+1ではなく私に役立ちました+1
sunshinekitty

18
3.3+以降は非推奨ではありません
SeppoErviälä

3
この一般的なprintf構文の方がずっと好きです。無数の連結なしで複雑な文字列を書き込むことができます。
Max Tsepkov

4
完全"'%+100s'" % 'hi'を期すために、スペースを右側に配置することで機能します'hi'
Eric Blum

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()文字列の書式。これらは連鎖させることができ、 ' fill '文字を指定できます。

>>> ('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はすでにこの回答を出しています...なぜ重複した回答を投稿するのですか?
Felix Kling、2011

5
「新しい返信が投稿されました。クリックして更新してください」をクリックしなかったため、見逃しました。
aodj 2011


2

スライスを使用する方がよりパイソンのようではないでしょうか?

たとえば、10文字になるまで文字列の右側にスペースを埋め込むには:

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

15文字になるまで左側にスペースを入れます。

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

もちろん、パディングしたい長さを知る必要がありますが、最初の文字列の長さを測定する必要はありません。


9
いいえ、そうではありません。
Mad Physicist

1
詳しく説明していただけますか?私があなたを信じていないのではなく、その理由を理解したいだけです。
Zev Chonoles、2015年

4
承知しました。最もパイソン的な方法は、可能な限り自家製のソリューションを使用するのではなく、組み込み関数の1つを使用することです。
Mad Physicist

@MadPhysicistは、組み込み関数で使用する必要があるため、スライシングの方がpythonicが少ないと言っているの''.join(reversed(str))は、はpythonicよりも言っているようなものstr[::-1]です。
ニック

@NickA。それはあまり良い例えではありません。例として使用しているケースは非常に有効です。ただし、(x + " " * 10)[:10]私の意見では、を使用するよりもはるかに複雑ですx.ljust(10)
Mad Physicist

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]
Poikilos

1
数字として('0'*min_len + str(2))[-min_len:]はむしろおもしろいですが、これはおもしろいので他の答えをお勧めします。
ポイキロ

-1

リスト内包表記を使用してそれを行うことができます。これにより、スペースの数についてのアイデアも得られ、1つのライナーになります。

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

...そして、22(len( "hello")+ 17 :()文字の文字列を取得します-それはうまくいきませんでした。面白いことをしている間、私たちはできましたs = "hi"; s + (6-len(s)) * " "代わりに(結果は否定的です。しかし、正確な問題に対処するフレームワーク機能を使用する回答は、維持が容易になります(他の回答を参照してください)
Poikilos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.