Pythonで数値や文字列を様々な書式に変換(フォーマット)することができるformat関数、およびPythonの組み込み型である文字列型のメソッドで同様の処理ができるformatメソッドの使い方について解説します。
目次
format関数とは
format関数はPythonに標準で用意されている組み込み関数の1つで、その名の通り値を様々な書式に変換(フォーマット)することができます。具体的には2進数や桁区切りの数字、パーセント表示などに変換できます。
format関数の基本的な構文は次の通りです。
format(変数や値, 書式指定文字列)
具体例としては次のように記述します。書式の詳細な指定方法については後述します。
i = format(10, "b") # 数値の10を2進数に変換 print(i) s = format("right", ">10") # s変数の値を幅10文字の右寄せにフォーマット print(s)
実行結果は次のようになります。
1010 right
formatメソッドとは
Pythonの組み込み型である文字列 (string)クラスのメソッドとして用意されているformatメソッドでも同様の処理をすることができます。
さらにformatメソッドでは値をフォーマットするだけでなく、置換フィールド{}を用いてフォーマットした値を文字列中に埋め込むことができます。
formatメソッドの基本的な構文は次の通りです。
"任意の文字列{:書式指定文字列}任意の文字列".format(変数や値)
具体例としては次のように記述します。
i = "10進数の10は2進数では{:b}です".format(10) # 数値の10を2進数に変換 print(i) s = "右は英語で{}です".format("right") # rightを文字列の中に埋め込み print(s)
実行結果は次のようになります。
10進数の10は2進数では1010です 右は英語でrightです
置換フィールドに対する引数の指定方法
置換フィールド{}に埋め込むメソッドの引数が1つだけの場合はこれだけで問題なく運用可能ですが、複数の文字列を埋め込みたい場合は埋め込む順番やどこにどの文字列を埋め込むのか指定したい場合があります。
デフォルト(引数順)
デフォルトでは置換フィールドが複数存在する場合、第一引数から順に処理されます。例えば次のコードでは「勇者」「魔王」「100」の順に置換フィールドと置き換えて処理されます。
msg = "{}は{}に{}のダメージを与えた".format("勇者", "魔王", 100) print(msg)
実行結果は次のようになります。
勇者は魔王に100のダメージを与えた
インデックス番号で指定
リストのインデックス番号のように整数値で引数を指定することもできます。リスト同様、番号は0番から始まるので注意しましょう。
msg = "{1}は{0}に{2}のダメージを与えた".format("勇者", "魔王", 100) print(msg)
実行結果は次のようになります。
魔王は勇者に100のダメージを与えた
キーワード引数で指定
任意のキーワード引数を用意して引数を指定することもできます。
msg = "{hero}は{maou}に{damage}のダメージを与えた".format(hero="勇者", maou="魔王", damage=100) print(msg)
実行結果は次のようになります。
勇者は魔王に100のダメージを与えた
リスト、タプル、辞書を埋め込む
リスト、タプル、辞書といったデータの集まりもformatメソッドの引数に指定し、置換フィールドで呼び出すことができます。
この場合は多次元リストと同じように、hoge番目のリストのhoge番目の要素、といった具合に呼び出すデータを指定します。
list = ["勇者", "魔法使い", "遊び人"] print("{0[0]}は魔王に100のダメージを与えた".format(list)) print("{0[1]}は魔王に100のダメージを与えた".format(list)) d1 = {"name":"勇者", "攻撃力":100, "魔力":50} d2 = {"name":"魔王", "攻撃力":200, "魔力":200} print("{0[name]}は{1[name]}に{0[攻撃力]}のダメージを与えた".format(d1, d2))
実行結果は次のようになります。
勇者は魔王に100のダメージを与えた 魔法使いは魔王に100のダメージを与えた 勇者は魔王に100のダメージを与えた
書式指定文字列
置換フィールドでデータを呼び出す際、指定した書式指定文字列にフォーマットして出力することができます。
"任意の文字列{:書式指定文字列}任意の文字列".format(変数や値)
数値表現
数値を2進数、8進数、10進数、16進数に置き換えて返します。
書式指定文字列 | フォーマットする型 |
---|---|
o | 8進数 |
d | 10進数 |
x | 16進数 |
X | 16進数(アルファベットを大文字表記) |
print("bin:{:b}".format(10)) # 2進数 print("oct:{:o}".format(10)) # 8進数 print("dec:{:d}".format(10)) # 10進数 print("hex:{:x}".format(10)) # 16進数 print("hex:{:X}".format(10)) # 16進数(アルファベットを大文字表記) s = "{0}は2進数だと{0:b}、8進数だと{0:o}、16進数だと{0:x}です".format(10) print(s)
実行結果は次のようになります。
bin:1010 oct:12 dec:10 hex:a hex:A 10は2進数だと1010、8進数だと12、16進数だとaです
幅と表示位置
文字列を埋め込む際の幅と表示位置を指定します。幅は指定した数値分の半角文字数分の幅となります。
書式指定文字列 | フォーマット |
---|---|
<任意の幅(指定した数値分の半角文字数分の幅) | 左寄せ |
^<任意の幅 | 中央寄せ |
><任意の幅 | 右寄せ |
left = "左寄せ" center = "中央寄せ" right = "右寄せ" print("{0:<10}".format(left)) print("{0:^10}".format(center)) print("{0:>10}".format(right))
実行結果は次のようになります。
左寄せ 中央寄せ 右寄せ
桁区切り
3桁ごとにカンマまたはアンダースコア(アンダーバー)の区切りを入れます。金額を扱う時や大きな数値を扱う時などに便利です。
書式指定文字列 | フォーマット |
---|---|
:, | 3桁ごとにカンマ |
:_ | 3桁ごとにアンダースコア |
print('{:,}'.format(100000000)) # 100,000,000 print('{:_}'.format(100000000)) # 100_000_000
実行結果は次のようになります。
100,000,000 100_000_000
桁数
数値全体の有効数字(有効桁数)や小数点以下の桁数を指定することができます。結果によって自動で指数表記になり、小数点以下の末尾の0は省略されます。
書式指定文字列 | フォーマット |
---|---|
有効桁数 | .桁数g |
小数点以下の桁数 | .桁数f |
print("{:.2g}".format(123.4567890)) print("{:.3g}".format(123.4567890)) print("{:.11g}".format(123.4567890)) print("{:.3g}".format(0.0001234567890)) print("{:.2f}".format(123.4567890)) print("{:.5f}".format(123.4567890)) print("{:.3f}".format(0.0001234567890))
実行結果は次のようになります。
1.2e+02 123 123.456789 0.000123 123.46 123.45679 0.000
パーセント表示
書式化指定文字列に%を指定すると、数値の値を100倍して%記号を付けた文字列に変換します。デフォルトでは小数点以下6桁となっていますが、桁数を指定することもできます。
書式指定文字列 | フォーマット |
---|---|
100倍してパーセント記号を付与 | % |
上記に加え桁数を指定 | .桁数% |
print("{:%}".format(0.1234567890)) print("{:.2%}".format(0.1234567890)) print("{:%}".format(2)) print("{:.2%}".format(2))
実行結果は次のようになります。
12.345679% 12.35% 200.000000% 200.00%