Pythonのstr.formatで書式を指定する: 文字埋め、左右真ん中寄せ、数値と符号指定など

260, 2021-05-31

目次

Pythonのformatで書式を指定する

Pythonの文字列(str)にはformat()というメソッドがあります。
このメソッドを使うとデータを色々なフォーマットで整形することができます。

この記事ではstr.format()についてわかりやすく解説します。
結論から言うとstr.format()は↓のように使います。

s = '{} is {}'.format('cat', 'cute')
print(s)
# cat is cute

具体的には↓を見ていきます。

  • 要素を文字列に埋め込む

  • 埋め込みと指定子

  • 文字埋め、左右真ん中寄せ

  • 数値と符号指定

  • 符号と0埋め

  • 利用できる表現型

  • ブレースを埋め込む

  • 指定子のネスト

  • 指定子の組み合わせ例

要素を文字列に埋め込む

format()に渡した引数を文字列の中に埋め込む方法です。
文字列側にブレース({})を指定すると、引数を順番に埋め込むことができます。

s = '{} is {}'.format('age', 20)
print(s)
# age is 20

インデックスによる指定

ブレースの中にインデックスを指定すると、指定したインデックスの引数を埋め込むことができます。

s = '{0} is {1}'.format('cat', 'animal')
print(s)
# cat is animal

s = '{1} is {0}'.format('cat', 'animal')
print(s)
# animal is cat

キーワードによる指定

ブレースの中にキーワードを指定すると、そのキーワードの引数を埋め込むことができます。

s = '{left} is {right}'.format(left='cat', right='animal')
print(s)
# cat is animal

リストの埋め込み

引数にリストやタプルを指定した場合は、角カッコ([])でそのオブジェクトの要素にアクセスすることができます。

lis1 = [1, 2]
lis2 = [3, 4]
s = '{0[0]} and {0[1]}. {1[0]} and {1[1]}'.format(lis1, lis2)
print(s)
# 1 and 2. 3 and 4

lis1 = [1, 2]
lis2 = [3, 4]
s = '{left[0]} and {left[1]}. {right[0]} and {right[1]}'.format(left=lis1, right=lis2)
print(s)
# 1 and 2. 3 and 4

辞書の埋め込み

引数に辞書を指定した場合も、角カッコ([])でそのオブジェクトの要素にアクセスすることができます。

d1 = {'a': 1, 'b': 2}
d2 = {'c': 3, 'd': 4}
s = '{0[a]} and {0[b]}. {1[c]} and {1[d]}'.format(d1, d2)
print(s)
# 1 and 2. 3 and 4

埋め込みと指定子

後述する文字埋めや寄せ指定、表現型の指定などは共通して埋め込み指定のあとに書きます。
埋め込み指定のあとにコロンを書き、そのコロンのあとに指定子を書きます。

s = '[{1:<10}] [{0:>10}]'.format(10, 20)
print(s)
# [20        ] [        10]

文字埋め、左右真ん中寄せ

format()に指定する引数は文字列に埋め込むときに文字埋めや左右真ん中に寄せることができます。

左寄せ

ブレースの中をコロンで区切って<を指定すると左寄せになります。
<の後に整数を指定すると全体の幅を指定できます。

s = '{:<30}'.format(10)
print(f'[{s}]')
# [10                            ]

右寄せ

>を指定すると右寄せになります。

s = '{:>30}'.format(10)
print(f'[{s}]')
# [                            10]

真ん中寄せ

^を指定すると真ん中寄せになります。

s = '{:^30}'.format(10)
print(f'[{s}]')
# [              10              ]

寄せと文字埋め

<>^などの記号の左側に埋め込みたい文字を指定すると、その文字で文字埋めがされます。

s = '{:*^10}'.format(10)
print(s)
# ****10****

s = '{:-^10}'.format(10)
print(s)
# ----10----

1文字であればアルファベットや日本語でも可能です。

s = '{:a^10}'.format(10)
print(s)
# aaaa10aaaa

s = '{:犬^10}'.format('人')
print(s)
# 犬犬犬犬人犬犬犬犬

数値と符号指定

ブレースの中をコロンで区切り、符号を指定することで埋め込んだ数値に符号を指定することができます。
+を指定した場合は-+も常に表示されます。

s = '[{:+}] [{:+}]'.format(123, -123)
print(s)
# [+123] [-123]

半角スペースを指定した場合は符号部分が半角スペースで埋められます。

s = '[{: }] [{: }]'.format(123, -123)
print(s)
# [ 123] [-123]

-を指定した場合は負数のみ符号を表示します。

s = '[{:-}] [{:-}]'.format(123, -123)
print(s)
# [123] [-123]

符号と0埋め

=を指定すると符号が存在する場合にその後ろを0埋めします。
<>などは符号を考慮しませんが、=は符号を考慮してくれます。

s = '{:0=+10}'.format(-10)
print(s)
# -000000010

s = '{:0=+10}'.format(10)
print(s)
# +000000010

利用できる表現型

ブレースの中では表現型と呼ばれる指定子を指定することができます。
これはformat()の引数のデータを変換するときに指定します。

  • 's' ... 文字列。デフォルトで使用されます。

  • 'b' ... 2進数。

  • 'c' ... 文字。

  • 'd' ... 10進数。

  • 'o' ... 8進数。

  • 'x' ... 16進数。小文字が使われます。

  • 'X' ... 16進数。大文字が使われます。

  • 'n' ... 数値。ロケールによって区切り文字が挿入されます。

  • 'e' ... 科学的記数法。

  • 'E' ... 科学的記数法。区切り文字に大文字のEを使います。

  • 'f' ... 浮動小数点数。

  • 'F' ... 浮動小数点数。nanがNAN, infがINFになります。

  • 'g' ... 汎用フォーマット。

  • 'G' ... 汎用フォーマット。数値が大きくなったら'E'に切り替わります。

  • '%' ... パーセンテージ。

  • None ... 'd'と同じ。

↓は使用例です。

print('{:d} {:f}'.format(100, -100))
# 100 -100.000000

print('{:o} {:x}'.format(10, 10))
# 12 a

print('{:e} {:E}'.format(10, 20))
# 1.000000e+01 2.000000E+01

print('{:g} {:G}'.format(10, 10000000000000000))
# 10 1E+16

print('{:%}'.format(0.5))
# 50.000000%

ブレースを埋め込む

ブレースを埋め込みたい場合は二重のブレース({{}})を使います。

s = 'dict = {{ "a": 1, "b": {} }}'.format(2)
print(s)
# dict = { "a": 1, "b": 2 }

指定子のネスト

これまで紹介してきた指定子はネストすることができます。

s = '[{word:>{width}}]'.format(word='wan', width=20)
print(s)
# [                 wan]

↑の場合だと、ブレースの中でさらにブレースで>の後にwidthを置いてます。
こうすることで文字埋めの幅を変数などで外部から指定することができます。

指定子の組み合わせ例

=で数値を0埋めして符号を表示します。

print('age = {age:0=+10}, weight = {weight:0=-10}'.format(age=20, weight=-50))
# age = +000000020, weight = -000000050

浮動小数点数を0埋めします。

print('score is {0:0=15f}'.format(123))
# score is 00000123.000000

おわりに

今回はPythonのstr.format()について見てみました。
書式指定を上手く使えるとかっこいいCUIアプリケーションが作れそうですね。

書式を指定してハッピー

ハッピーフォーマット