コード実行時に、その都度文字列を作成するケースはよくあります。例えば、以下のようにファイル名に日付を含める場合です。

file_20180904.txt

日付の部分(20180904)は、毎日変わります。このような文字列を作成するには、以下の3通りが考えられます。

  1. 連結演算子(+)を使用する。
  2. 従来からの%構文による文字列フォーマットを使用する。
  3. 文字列のformatメソッドによる文字列フォーマットを使用する(Python3から可能)。

Pythonのコードでは、以下のようになります。

from datetime import datetime 

# 今日の日付(例:20180904)
today = datetime.now().strftime("%Y%m%d") 

# 1. 連結演算子を使用
file_1 = "file_" + today + ".txt"

# 2. %構文を使用
file_2 = "file_%s.txt" % today

# 3. formatメソッドを使用
file_3 = "file_{}.txt".format(today)

# 結果はすべて同じ(例:file_20180904.txt)

どの方法を用いるかは、好みの問題ですが、Python3が一般的になった現在では、formatメソッドの使用をオススメします。何と言っても、可読性(コードの読みやすさ)が高くなります。

業務関係のプログラミングでは、フォーマットを指定した文字列作成は日常的によく行います。しかし、formatメソッドの使い方を詳しく説明している入門書は以外に少ないです。そこで、今回は「formatメソッドの使い方」を「書式指定の方法」と一緒に説明します。

以下では、Python3.1以上を対象に説明します。

formatメソッドの使い方

以下のように文字列の中に、波かっこ{}で囲まれた「置換フィールド」を埋め込み、format( )メソッドの引数で{}の部分を置換します。

line = "{0}さんの身長は{1}cm、体重は{2}kgです。".format("山田",190,105.3)
print(line)
# 出力結果 > 山田さんの身長は190cm、体重は105.3kgです。

つまり、format( )のかっこ内の引数に、format( {0}の値, {1}の値, {2}の値 )のように置換したい値を指定します。引数は左から順番にゼロから始まる番号(インデックス番号)に対応します。

{0} <= "山田"
{1} <= 190
{2} <= 105.3

置換はインデックス番号の対応で行われるので、以下のように同じ値を複数埋め込めます。

line = "{0}さんの身長は{1}cmです。{0}さんの体重は{2}kgです。".format("山田",190,105.3)
print(line)
# 出力結果 > 山田さんの身長は190cmです。山田さんの体重は105.3kgです。

単純に左から順に一対一になっている場合は、以下のようにインデックス番号を省略できます。

# インデックス番号を省略した場合
line = "{}さんの身長は{}cm、体重は{}kgです。".format("山田",190,105.3)
print(line)
# 出力結果 > 山田さんの身長は190cm、体重は105.3kgです。

書式指定の方法

小数点の桁数を合わせたいなど、書式を指定したい場合は、以下のようにインデックス番号の右にコロン:に続けて指定できます。

{インデックス番号:書式指定}

例えば、身長と体重は小数点以下1桁で統一して表示する場合は以下のようになります。

line = "{0}さんの身長は{1:.1f}cm、体重は{2:.1f}kgです。".format("山田",190,105.3)
print(line)
# 出力結果 > 山田さんの身長は190.0cm、体重は105.3kgです。

.1fの部分で、.1が下1桁、fが小数点タイプで表示することを意味します。このようにコロン:の後に、規則に順序通りに書式を指定します。以下は、おもな書式指定をすべて使用した例です。

string format

この書式指定を実行すると次のようになります。

"{:<20,.3f}".format(12345.67)
# '12,345.670          '

以下に各書式指定の方法について説明します。

基本的な表現タイプ

一般によく用いるタイプだけを以下の表にまとめました。

記号 タイプ 備考
s 文字列 これがデフォルトなので、通常は省略する。
d 整数(10進数) 2進数はb、16進数はxまたはX
eまたはE 浮動小数点数(指数表記) 大文字の場合は指数表記にEが使われる。
fまたはF 浮動小数点数(小数点表記) 大文字の場合はnanがNAN、infがINFと表示される。

その他にも、汎用フォーマットなどがありますが、ここでは説明しません。必要な場合は、下記のサイトをご覧ください。

string — 一般的な文字列操作(Python公式ドキュメント)

浮動小数点数の小数点以下の桁数(precison)

小数点以下?桁を指定するには、{:.?f}のようにピリオド.の後に整数で桁数を指定します。

"{:.1f}".format(0.01)
# '0.0'
"{:.2f}".format(0.01)
# '0.01'
"{:.5f}".format(0.01)
# '0.01000'

指数表記の場合は以下のようになります。

"{:.1e}".format(0.01)
# '1.0e-02'
"{:.2e}".format(0.01)
# '1.00e-02'
"{:.5e}".format(0.01)
# '1.00000e-02'

また、この桁数指定を文字列タイプに使用すると、文字数を最大何文字使用するかを指定できます。

"{:.2}".format("abcde")
# 'ab'
"{:.3}".format("abcde")
# 'abc'
"{:.7}".format("abcde")
# 'abcde'

なお、当然ですがこの桁数指定(precision)は、整数タイプ(d)には使用できません

表示最大幅の指定(width)

表示する最大幅は、桁数指定(precision)の前で指定します。最大幅であることに留意してください。

"{:3.5f}".format(0.01)
# '0.01000'
"{:10.5f}".format(0.01)
# '   0.01000'
"{:20.5f}".format(0.01)
# '             0.01000'

文字列タイプの場合は以下のようになります。

"{:2}".format("abcde")
# 'abcde'
"{:10}".format("abcde")
# 'abcde     '
"{:20}".format("abcde")
# 'abcde               '

デフォルトでは、左詰めになります。右詰めする場合は、頭に>を付けます。

"{:>20}".format("abcde")
# '               abcde'

整数タイプの場合は以下のようになります。

"{:2d}".format(100)
# '100'
"{:10d}".format(100)
# '       100'
"{:20d}".format(100)
# '                 100'

空白部分をゼロで埋めたい(0パディング)場合には、頭に0を付けます。

"{:02d}".format(100)
# '100'
"{:010d}".format(100)
# '0000000100'
"{:020d}".format(100)
# '00000000000000000100'