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

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}cm、体重は{2}kgです。"

{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)の場合は指数表記にeでなくEが使われる。
fまたは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               '

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

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

データよりも小さく最小幅を指定すると、データの長さでそのまま表示されます。

>>> "{:3d}".format(12345)
'12345'

位置合わせ・パディング

デフォルトの配置は数値は右寄せ、文字列は左寄せです。文字列を右詰めしたい場合は、頭に>を付けます。

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

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

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