formatメソッドを使った文字列の書式設定

Python 2.6 から文字列型に format メソッドが追加され、書式化演算子 % を使用するよりもより高機能な書式設定が行えるようになりました。ここでは文字列型の format メソッドを使って文字列の書式設定を行う方法について解説します。

※ 書式の指定方法は同じでより簡潔に記述することができるフォーマット済み文字列リテラルが Python 3.6 より使用可能となっています。詳しくは「フォーマット済み文字列リテラル(f文字列)を使った文字列の書式設定」を参照されてください。

(Last modified: )

formatメソッドの使い方

文字列型の format メソッドを使って書式設定を行う場合は、次のような形式となります。

置換フィールドを含む文字列.format(値1, 値2, ...)

前のページ」で解説した書式化演算子の % を使って文字列に書式設定を行う場合は次のように記述していました。

変換指定子を含む文字列 % (値1, 値2, ...)

変換指定子ではなく置換フィールドに代わり、また値の指定方法がタプルによる値の指定ではなく format メソッドの引数という形に代わります。

詳しい使い方を確認する前に、どのように使用するのかについて簡単に確認しておきます。まず置換フィールドを含む文字列についてです。例えば次のような文字列を例に考えてみます。

"名前はxxです。年齢はyy歳です。"

この文字列の名前の部分(xx)と年齢の部分(yy)に書式化を行った値を挿入した新しい文字列を作成したい場合、この xx と yy の部分にどのように値を書式化するのかを表す置換フィールドを指定します。今回は次のように {:<8s} と {:>3d} をそれぞれ指定しました。

"名前は{:<8s}です。年齢は{:>3d}歳です。"

次に書式化を行う値を指定します。今回置換フィールドを文字列の中に 2 つ記述しましたので、変換する値も 2 つ記述する必要があります。値は format メソッドの引数として指定します。引数には置換フィールがが記述された順番と同じ順番で値を指定します。

"名前は{:<8s}です。年齢は{:>3d}歳です。".format("Suzuki", 18)

これで最初の値 "Suzuki" が置換フィールド {:<8s} によって変換されて文字列の中に挿入され、次の値 10 が置換フィールド {:>3d} によって変換された文字列の中に挿入されます。実際にどのように変換されるのかは次をみてください。

name = "Suzuki"
old = 18
print("名前は{:<8s}です。年齢は{:>3d}歳です。".format(name, old))
>> 名前はSuzuki  です。年齢は 18歳です。

では次にどの置換フィールドとどの値が対応するのかを指定する方法について詳しくみていきます。

どの置換フィールドにどの値が対応するのかを指定する

文字列中に記述する置換フィールドは波括弧 {} の中に書式指定文字列を記述していきます。書式指定文字列の詳細はこの後解説しますが、その前にどの置換フィールドに format メソッドの引数に記述したどの値が対応するのかを指定する方法ついて解説します。

置換フィールドに数値を指定する

文字列中に複数の置換フィールドがある場合、それぞれの置換フィールドには区別するために数値かキーワードを指定します。数値を使用する場合は、 0 , 1 , 2 , ... と順番に数値を指定していきます。

"名前{0}です。{1}歳。住所は{2}です。"

数値は 0 , 1 , 2, ... と 0 から順番に割り当てる必要がありますが、どの置換フィールドにどの数値を割り当てるのかは自由です。

"名前{2}です。{0}歳。住所は{1}です。"

そして format メソッドの引数に置換フィールド 0 から順に値を指定していきます。 3 つの置換フィールドがある場合は format メソッドの引数に 3 つの値を指定してください。最初の引数が置換フィールド 0 に渡す値、次の引数が置換フィールド 1 に渡す値、最後の引数が置換フィールド 2 に渡す値です。

"名前{0}です。{1}歳。住所は{2}です。".format("Yamada", 18, "Tokyo")
"名前{2}です。{0}歳。住所は{1}です。".format(18, "Tokyo", "Yamada")

文字列中の置換フィールドに先頭から順番に 0 , 1 , 2, ... と割り当てる場合には数値を省略することができます。その為、次の 2 つは同じです。

"名前{0}です。{1}歳。住所は{2}です。".format("Yamada", 18, "Tokyo")
"名前{}です。{}歳。住所は{}です。".format("Yamada", 18, "Tokyo")

置換フィールドにキーワードを指定する

次にキーワードを指定する方法です。キーワードは置換フィールドの名前のようなもので、置換フィールドごとに記述していきます。

"名前{myname}です。{myold}歳です。"

そして format メソッドの引数に キーワード名=値 の形式で指定していきます。順番は自由に決めることができます。

"名前{myname}です。{myold}歳です。".format(myname="Yamada", myold=18)

-- --

数値を使用する方法とキーワードを指定する方法はどちらの方法でも構いません。特に理由がなければ、数値を省略した上で format メソッドの引数に順番に値を指定していく形式が簡潔に記述できるかと思います。

置換フィールドには数値またはキーワードを指定したあと、コロン(:)を記述してから変換する書式指定子を記述します。例えば数値を省略した場合は {:8s} 。数値を指定した場合は {0:8s} 。キーワードで指定した場合は {name:8s} のようになります。

print("名前{:8s}です。{:4d}歳。".format("Yamada", 18))
>> 名前Yamada  です。  18歳。

print("名前{0:8s}です。{1:4d}歳。".format("Honda", 32))
>> 名前Honda   です。  32歳。

print("名前{name:8s}です。{old:4d}歳。".format(name="Tanaka", old=24))
>> 名前Tanaka  です。  24歳。

それでは書式指定子の記述方法について詳しく確認していきます。

書式指定子の指定方法

書式指定子は次のような省略可能なオプションを組み合わせて記述します。

[[fill(埋める文字)]align(配置方法)]
[sign(符号)]
[#(別形式)]
[0(ゼロパディング)]
[width(最小フィールド幅)]
[grouping_option(数値の区切り文字)]
[.precision(小数部分の精度)]
[type(値の表現型)]

書式指定子は置換フィールドの {位置を表す数値またはキーワード:書式指定子} のコロン(:)の右側に記述します。ではそれぞれのオプションについて確認していきます。

type(値の表現型)

それでは最初に一番最後の値の表現型から。表現型は値をどのように表現するのかを指定するもので、文字列に対するもの、整数に対するもの、浮動小数点数に対するものがそれぞれ用意されています。

文字列向けの表現型:

"s" 文字列
None "s" と同じ

例えば文字列の値の書式を設定するには :s と記述します。ただ文字列向けの表現型を省略した場合 :s を指定した場合と同じなので省略しても結果は同じです。

print("文字列={:s}, 文字列={}".format("Lemon", "Apple"))
>> 文字列=Lemon, 文字列=Apple

整数向けの表現型:

"b" 2進数
"c" 文字。数値を対応する Unicode 文字に変換
"d" 10進数
"o" 8進数
"x" 16進数。a~fは小文字
"X" 16進数。A~Fは大文字
"n" 数値。現在のロケールに従い、区切り文字を挿入することを除けば "d" と同じ
None "d" と同じ

例えば数値の値を 10 進数に変換するには :d と記述し 16 進数に変換するには :x と記述します。

print("数値1={:d}, 数値2={:x}".format(20, 31))
>> 数値1=20, 数値2=1f

浮動小数点数と10進数向けの表現型:

"e" 指数表記。 'e' を使用
"E" 指数表記。 'E' を使用
"f" 固定小数点数表記
"F" 固定小数点数表記。nan を NAN 、inf を INF に変換
"g" 指定した精度に合わせて丸めたうえで桁に応じて固定小数点か指数表記で表示
"G" 数値が大きくなったとき "E" に切り替わることを除き "g" と同じ
"n" ロケールに合わせて、数値分割文字が挿入されることを除き "g" と同じ
"%" 数値を 100 倍し固定小数点数表記("f")でパーセントを付けて表示
None "g" と同様だが固定小数点表記の時に小数点の後に少なくとも 1 つの数字がある

例えば小数点を含む数値の値を指数表記に変換するには :e と記述し、固定小数点に変換するには :f と記述します。

print("指数表記={:e}".format(0.0752))
>> 指数表記=7.520000e-02

print("固定小数点表記={:f}".format(0.0752))
>> 固定小数点表記=0.075200

パーセンテージ表示を行うには :% と記述します。

print("パーセンテージで表示={:%}".format(0.348))
>> パーセンテージで表示=34.800000%

width(最小フィールド幅)

次に width (最小フィールド幅)です。少なくとも確保される桁数を指定します。例えば数値や文字列が 3 桁で、最小フィールド幅が 5 だった場合には、 5 桁の場所に 3 桁の数値や文字列を表示します。文字列はデフォルトで左詰め、数値はデフォルトで右詰めで表示されます。

次の例では文字列と数値に最小フィールド幅を設定しています。(分かりやすいように [] で囲んで表示しています)。

print("文字列=[{:10s}]".format("Lemon"))
>> 文字列=[Lemon     ]

print("数値=[{:5d}]".format(123))
>> 数値=[  123]

文字列は左詰め、数値は右詰めで表示されました。

fill(埋める文字)とalign(配置方法)

次に align (配置方法)と fill (埋める文字)です。配置方法は値の桁数が最小フィールド幅よりも少ない場合に、どのように配置するのかを指定します。

"<" 左詰めで表示
">" 右詰めで表示
"^" 中央揃えで表示
"=" 符号と値の間を埋める文字で埋めて表示

次の例では数値をそれぞれ左寄せ、中央揃え、右寄せで表示しています。(分かりやすいように [] で囲んで表示しています)。

print("数値=[{:<7d}]".format(123))
>> 数値=[123    ]

print("数値=[{:^7d}]".format(123))
>> 数値=[  123  ]

print("数値=[{:>7d}]".format(123))
>> 数値=[    123]

最小フィールド幅を設定していない場合は、値の桁数と表示される桁数は同じになるので配置方法の設定は意味がなくなります。

デフォルトでは空白で埋められますが、配置方法の前に埋める文字を指定することで指定した文字で埋めることができます。例えば左詰めにした上で 0 で空いた部分を埋める場合は :0< と指定します。

次の例では * と - を使って空いている部分を埋めています。

print("数値={:*<7d}".format(123))
>> 数値=123****

print("数値={:-^7d}".format(123))
>> 数値=--123--

sign(符号)

次に sign (符号)です。数値に対してのみ有効な設定で、符号の付け方について指定します。

"+" 正の数、負の数ともに符号をつける
"-" 負の数だけに符号をつける(デフォルト)
" " 正の数では数値の前に空白をつける

次の例では数値に対してそれぞれのオプションを設定した場合で表示しています。

print("正の数={:+d}, 負の数={:+d}".format(72, -72))
>> 正の数=+72, 負の数=-72

print("正の数={:-d}, 負の数={:-d}".format(72, -72))
>> 正の数=72, 負の数=-72

print("正の数={: d}, 負の数={: d}".format(72, -72))
>> 正の数= 72, 負の数=-72

負の数の場合はいずれも同じですが、 "+" を付けた場合は正の数でも符号が付き、 " " を付けた場合は正の数の場合に数値の前に空白が 1 文字表示されます。

grouping_option(数値の区切り文字)

次に grouping_option (数値の区切り文字)です。カンマ "," またはアンダーバー "_" を指定します。数値の値に対して千の位ごとにカンマ(,)またはアンダーバー(_)を挿入します。

print("数値={:,d}".format(1234567))
>> 数値=1,234,567

print("数値={:,f}".format(12345.6789))
>> 数値=12,345.678900

print("数値={:_d}".format(1234567))
>> 数値=1_234_567

数値に対して区切り文字を自動で挿入することができました。

.precision(小数部分の精度)

次に .precision (小数部分の精度)です。小数部分の精度(桁数)を指定します。デフォルトでは 6 桁となっています。指定する場合はドット(.)のあとに桁数を指定してください。

print("数値={:f}".format(1.2345))
>> 数値=1.234500

print("数値={:.1f}".format(1.2345))
>> 数値=1.2

print("数値={:.3f}".format(1.2345))
>> 数値=1.234

小数部分の精度を省略した場合、そして指定した場合でそれぞれ試してみました。

#(別形式)

次に # (別形式)です。別形式オプションを記述すると例えば整数で 2 進数、 8進素、 16 進数の値を表示するときに先頭に "0b", "0o", "0x" がそれぞれ付きます。

print("数値={:b}, 数値={:#b}".format(10, 10))
>> 数値=1010, 数値=0b1010

print("数値={:o}, 数値={:#o}".format(20, 20))
>> 数値=24, 数値=0o24

print("数値={:x}, 数値={:#x}".format(35, 35))
>> 数値=23, 数値=0x23

別形式オプションを付けた場合にそれぞれ異なる形式で表示されています。

-- --

文字列型の format メソッドを使って文字列の書式設定を行う方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。