Pythonで書式の変換をする際に頻繁に使うformat関数について、その使い方を実例を用いて解説しています。
空白を指定した文字で埋めたり、中央寄せにしたり、小数点何桁まで表示するか、どのデータを引用するかなど、できることが多いです(その分混乱しやすいですが、、)
何ができるかを理解すればとても便利に使うことができます。
引数が1つの場合
引数で定義した値/文字列を代入する
format関数の引数で指定した値を文字列に代入することができます。
{}.format(A)
Aの内容が{}の中に入ります。
'{}駅の天気は晴れ'.format('渋谷')
#出力
#'渋谷駅の天気は晴れ'
引数で定義した値/文字列を複数回呼び出す
引数で指定した値は、好きな場所で何回でも呼び出すことができます。
{0}{0}{0},,,.format(A)
設置した{0}に引数の値が入ります。
インデックス番号に0を指定しないとエラーになります。{ }の中のインデックス番号が0から順に自動設定されます。
'{0}の天気。{0}区、{0}駅の天気は晴れ'.format('渋谷')
#出力
#'渋谷の天気。渋谷区、渋谷駅の天気は晴れ'
引数が複数ある場合
引数が複数ある場合は、インデックス番号を指定しない方法と、指定する方法があります。
インデックス番号を指定しない方法
'{}{}{},,,,.format(A, B, C, D)
インデックス番号が自動設定されます
- 1つ目の{ } = {0}
- 2つ目の{ } = {1}
- 3つ目の{ } = {2}
・・・
'{}の天気。{}区、{}駅の天気は晴れ'.format('AAAA','BBBB','CCCC','DDDD')
#出力
#'AAAAの天気。BBBB区、CCCC駅の天気は晴れ'
インデックス番号を指定する方法
インデックス番号を指定する場合は、引数で渡す順番が関係なく、好きな値を好きな場所で呼び出すことができます。
'{3}{1}{0},,,,.format(A, B, C, D)
記載した引数の順に、インデックス番号が自動設定されています。
- A = {0}
- B = {1}
- C = {2}
・・・
'{0}の天気。{1}区、{2}駅の天気は晴れ'.format('AAAA','BBBB','CCCC','DDDD')
#出力
#'AAAAの天気。BBBB区、CCCC駅の天気は晴れ'
番号は同不順で、かつ、同じ引数を複数回指定することもできます。
'{3}の天気。{2}区、{2}駅の天気は晴れ'.format('AAAA','BBBB','CCCC','DDDD')
#出力
#'DDDDの天気。CCCC区、CCCC駅の天気は晴れ'
引数を文字列・数値・変数で設定する
上記例は引数に文字列を渡していましたが、文字列以外にも、数値や変数で渡すことができます。
mountain = '北岳'
altitude = 3193
'{}で{}番目に高い山は{}。標高は{}m'.format('日本',2,mountain,altitude)
#出力
#'日本で2番目に高い山は北岳。標高は3193m'
・文字列:日本
・数値:2
・変数(文字列):mountain
・変数(数値):altitude
出力の幅を広くする|{:n}
引数の値を代入する先の幅を設定することができます。{ }の中に :n を記載して、nを数値(バイト)で指定します。
{:n}.format()
└「n」1以上の整数
└ 単位はバイト
└ 最小幅は引数のバイト数分になる
'{:2}書式で隙間を設定'.format('A')
#出力「'A 書式で隙間を設定'」
・引数「A」:1バイト
・幅の設定 :2バイト
⇒ 幅2バイト(1バイト分の隙間)
設定した幅よりも、引数の幅の方が長い場合は、引数の幅が優先されます。
例(幅の設定「引数の方が大きい」)
'{:2}書式で隙間を設定'.format('AAAAA')
#出力「'AAAAA書式で隙間を設定'」
・引数「AAAAA」:5バイト
・幅の設定 :2バイト
⇒ 幅5バイト
幅に「0」を指定するとエラーになります。数値は1以上である必要があります。
'{:0}書式で隙間を設定'.format('A')
#出力(エラー)
#「ValueError: '=' alignment not allowed in string format specifier」
配置を指定する方法
指定の記号を使えば、左寄せ、中央寄せ、右寄せを指定することができます。
記号 | 配置 |
---|---|
< | 左寄せ |
^ | 中央寄せ |
> | 右寄せ |
上記で紹介した、幅の指定など他の指定と合わせて設定します。
(※幅の設定がないと、隙間が自動調整されてなくなるので、寄せの指定が意味をなさなくなります)
{<n}.format()
└「<」:左寄せ。alineの記号
└「n」:幅(1以上の整数)
'{:<10}書式で隙間を設定'.format('AAA')
#出力
#「'AAA 書式で隙間を設定'」
'{:^10}書式で隙間を設定'.format('AAA')
#出力
#「' AAA 書式で隙間を設定'」
'{:>10}書式で隙間を設定'.format('AAA')
#出力
#「' AAA書式で隙間を設定'」
'1つ目「{:<7}」。2つ目「{:^7}」。3つ目「{:>7}」'.format('AAA','BBB',333)
#出力
# '1つ目「AAA 」。2つ目「 BBB 」。3つ目「 333」'
空いた隙間を埋める
空いた隙間を埋めるには、0で埋める方法と、好きな値で埋める方法があります。
※隙間が存在しないと意味がないので、「:n」と合わせて設定する必要があります。
ゼロで埋める
{0<n}.format()
└ 「0」:0で埋める
└ 「<」:左寄せ。配置指定
'「{:0<10}」隙間をゼロで埋める'.format('AAA')
#出力
# '「AAA0000000」隙間をゼロで埋める'
'「{:0^10}」隙間をゼロで埋める'.format('AAA')
#出力
# '「000AAA0000」隙間をゼロで埋める'
中央寄せのときに、隙間が奇数の場合は後ろが多くなります。
'「{:0>10}」隙間をゼロで埋める'.format('AAA')
#出力
# '「0000000AAA」隙間をゼロで埋める'
好きな値で埋める
0以外にも、好きな値で埋めることができます。(※1文字のみ。2文字以上はエラー)
{@<n}.format()
└ 「@」:任意の文字。この場合「@」
└ 「<」:配置指定。この場合左寄せ
・埋める文字は1桁のみ
・半角・全角どちらでも可
・2桁以上はエラー
'「{:@<10}」隙間を埋める'.format('AAA')
#出力
# '「AAA@@@@@@@」隙間を埋める'
'「{:★^10}」隙間を埋める'.format('AAA')
#出力
# '「★★★AAA★★★★」隙間を埋める'
中央寄せのときに、隙間が奇数の場合は後ろが多くなります。
'「{:5<10}」隙間をゼロで埋める'.format('AAA')
#出力
# '「AAA5555555」隙間をゼロで埋める'
2桁以上の指定はエラーになる
'「{:★★^10}」隙間をゼロで埋める'.format('AAA')
#出力(エラー)
# ValueError: Invalid format specifier
'「{:11<10}」隙間をゼロで埋める'.format('AAA')
#出力(エラー)
# ValueError: Invalid format specifier
千の位にカンマを設定する(1,000){:,}
2,123,456,789のように、千の位にカンマを設定することができます。
'{:,}'.format()
└「:」以下は書式設定
└「,」千の位にカンマ
'{:,}'.format(123456789)
#出力
# '123,456,789'
%表示にする(数値が100倍される)|{:.n%}
%表示することもできます。1が100%のように、指定した数値が100倍されます。
'{:.n%}'.format()
└「:」以下は書式設定
└「.n」小数点以下の桁数(デフォルト6)
└ 数値は100倍される
'{:%}'.format(1)
#出力
# '100.000000%'
'{:.0%}'.format(1)
#出力
# '100%'
'{:.2%}'.format(1)
#出力
# '100.00%'
'{:.15%}'.format(1)
#出力
# '100.000000000000000%'
数値に+符号をつける|{:+}
数値がプラスのときに+符号をつけることができます。
'{:+}'.format()
└「:」以下は書式設定
└「+」プラス/マイナスの符号をつける
'1つめ「{:+}」。2つ目「{:+}」。3つ目「{:+}」'.format(-500, 300, 2.56)
#出力
# '1つめ「-500」。2つ目「+300」。3つ目「+2.56」'
小数点の桁数を指定する|{.nf}
小数点以下を何桁まで表示するかを指定することができます。
'{:.nf}'.format()
└「:」以下は書式設定
└「.n」小数点の桁数(0からの整数)
└ デフォルト「:.nf」なしは、入力値分
└ 四捨五入
'{}'.format(1.23)
#出力
# '1.23'
'{:.2f}'.format(1.23456789)
#出力
# '1.23'
'{:.0f}'.format(1.234345678)
#出力
# '1'
'{:.12f}'.format(1.234345678)
#出力
# '1.234345678000'
指数関数の固定小数点表記にする|{:.ne}
指数関数であるエクスポーネンシャルを使って、特定の桁数までの表示にすることもできます。
数値が大きい場合によく使います。(例:1.23e+08 ← 123456789)
'{:.ne}'.format()
└「:」以下は書式設定
└「.n」点以下で表示する数
└デフォルト「.n」なしは点以下6桁まで表示
'{:e}'.format(123456789)
#出力
# '1.234568e+08'
'{:.2e}'.format(123456789)
#出力
# '1.23e+08'
'{:.0e}'.format(123456789)
#出力
# '1e+08'
'{:.0e}'.format(123.456789)
#出力
# '1e+02'
引数の中で変数を指定する
小数点以下を何桁まで表示するかを指定することができます。
'{:.nf}'.format()
└「:」以下は書式設定
└「.n」小数点の桁数(0からの整数)
└ デフォルト「:.nf」なしは、入力値分
└ 四捨五入
'{}'.format(1.23)
#出力
# '1.23'
引数の中で変数を指定
formatメソッドに渡す引数に変数を記述し、その中で値を指定することができます。
呼び出しがシンプルになります。
'{a}{b}{c},,,'.format(a='AAA',b=111,c='CCC')
└ 引数内で変数を指定
└ インデックス番号で指定できない
└ 数値や文字列と一緒に使えない
'{a}で{b}番目に高い山は{c}。'.format(a='日本',b=2,c='北岳')
#出力
# '日本で2番目に高い山は北岳。'
引数に変数と数値や文字列を混ぜ合わせるとエラーになります。
'{a}で{1}番目に高い山は{c}。'.format(a='日本',2,c='北岳')
#出力(エラー)
# SyntaxError: positional argument follows keyword argument
インデックス番号で指定はできません。
'{0}で{1}番目に高い山は{2}。'.format(a='日本',b=2,c='北岳')
#出力(エラー)
# IndexError: Replacement index 0 out of range for positional args tuple
インデックス番号なしもエラーになります。
'{}で{}番目に高い山は{}。'.format(a='日本',b=2,c='北岳')
#出力(エラー)
# IndexError: Replacement index 0 out of range for positional args tuple
日付データを指定した文字列に変換する
formatメソッドを使えばdatetimeモジュールの日付を指定した書式(文字列)に変換することもできます。
import datetime as dt
past = dt.date(2017,1,3)
"{0:%Y年%#m月%#d日}".format(past)
#出力
# "{0:%Y年%#m月%#d日}".format(past)
import datetime as dt
today = dt.datetime.now()
"{0:%Y年%m月%d日---%I時%M分%S秒}".format(today)
#出力
# '2020年03月20日---02時08分39秒'
import datetime as dt
today = dt.datetime.now()
"{0:%#m月、%S秒}".format(today)
#出力
# '3月、52秒'
formatメソッドを使って日付型を文字列に変換する方法の詳細は以下をご参照ください。
【Python】日付のフォーマット(表示書式)を変更する方法|strftimeとformatの使い方を実例でわかりやすく解説