Pythonで文字列をフォーマットする方法を解説します。
Contents
文字列をフォーマットする方法
Pythonで文字列を扱う場合に、プログラム実行時の値を使って出力用の文字列を作るといったことをよくします。この際に、文字列を簡単にフォーマットできると便利です。
Pythonでは、format
メソッドを用いた方法やf-string(f文字列)を用いた方法があります。本記事では、これらを用いて文字列をフォーマットする方法と各種書式設定について説明します。
formatを用いて文字列をフォーマットする方法
Pythonで文字列をフォーマットする場合の代表的な方法は、format
メソッドを使用する方法です。以降では、format
メソッドの使用方法について説明します。
先頭から引数の値を順に埋め込む場合
format
メソッドの基本的な使い方は以下のようになります。
# 先頭から引数の値を順に埋め込む print('{}の性別は{}で、年齢は{}歳です。'.format('太郎', '男性', 20)) # 変数に値を入れて使用する場合も同様 name = '太郎' sex = '男性' age = 20 print('{}の性別は{}で、年齢は{}歳です。'.format(name, sex, age))
【実行結果】 太郎の性別は男性で、年齢は20歳です。 太郎の性別は男性で、年齢は20歳です。
文字列内で値を埋め込みたい部分に{}
を設定します。当該文字列のformat
メソッドの引数に値を指定すると、引数の順に先頭から値が{}
の部分に埋め込まれます。
この方法は、format
メソッドにおける最も基本的な使い方ですが、文字列内の値の順番を変えたい場合に引数の順番も書き換える必要があり少し不便です。順番を入れ替えることを考慮すると、次に紹介する引数番号を指定して値を埋め込む方法が使用できます。
引数の番号を指定して値を埋め込む場合
format
メソッドで、引数番号を指定して値を埋め込む場合には以下のように使用します。
# 引数の番号を指定して値を埋め込む print('{0}は{2}歳の{1}です。'.format('太郎', '男性', 20)) # 変数に値を入れて使用する場合も同様 name = '太郎' sex = '男性' age = 20 print('{0}は{2}歳の{1}です。'.format(name, sex, age))
【実行結果】 太郎は20歳の男性です。 太郎は20歳の男性です。
引数番号を指定する場合には、文字列中の{}
内に引数番号を指定します。
このように指定しておくことで、一度引数に指定した値の順番を変えたい場合には、文字列の{}
内の数字の順番を変更するのみで済みます。引数の番号は0
からである点に注意しましょう。
ただし、番号を使う場合もどの部分が何の情報化が分かりにくいという点があります。次に紹介する引数に名前を付ける方法を使うとよりプログラムが読みやすくなります。
引数に名前をつけて値を埋め込む場合
formatメソッドで、引数に名前を付けて値を埋め込む場合には以下のように使用します。
# 引数を名前付けして値を埋め込む print('{name}は{age}歳の{sex}です。'.format(name='太郎', sex='男性', age=20)) # 変数に値を入れて使用する場合も同様 name1 = '太郎' sex1 = '男性' age1 = 20 print('{name}は{age}歳の{sex}です。'.format(name=name1, sex=sex1, age=age1))
【実行結果】 太郎は20歳の男性です。 太郎は20歳の男性です。
引数に名前付けする場合には、文字列中の{}
内に引数名を指定します。
format
メソッドの引数にはキーワード引数の形式で変数と値を指定します。このように引数に名前を付けて埋め込みを行うことで、文字列中のどの部分にどういった情報が埋め込まれるのか分かりやすくなります。
f-stringを用いて文字列をフォーマットする方法
format
メソッドの他に文字列をフォーマットする方法としては、f-string(f文字列)があります。f-stringは、日本語で書くと「フォーマット済み文字列リテラル」というものになります。
なお、Python 3.6で追加されているものですのでPythonのバージョンについては注意してください。
以降では、f-stringを用いて文字列をフォーマットする方法を説明します。
基本的な使い方
f-stringは、文字列の前に接頭辞f
またはF
が付与されている文字列です。f-stringでは{}
で区切られた置換フィールドに変数や式を直接指定することができます。文章だけだとよく分かりにくいかもしれませんので、f-stringの使い方を以下の例で見てみましょう。
# フォーマット文字列の使い方 name = '太郎' sex = '男性' age = 20 # f-stringで値を埋め込む print(f'{name}は{age}歳の{sex}です。') print(f'{name}は{age*2}歳の{sex}です。')
【実行結果】 太郎は20歳の男性です。 太郎は40歳の男性です。
上記例のように、f
を文字列の前につけて文字列中の変数を埋め込みたい部分に{}
を設置し、埋め込みたい変数や式を指定します。{}
内には式も設定できるため、上記例のように{age*2}
のようにすることも可能です。
f-stringは単に値を埋め込むだけではなく、式を直接記述できる点で強力です。どのような変数や式が埋め込まれるかが一目で分かりやすくなります。個人的には、f-stringの方を好んで使用しています。
変数や式を含めて表示する方法
Python 3.8から変数に「=
」をつけることで変数を含めて表示する方法が追加されました。以下の例で見てみましょう。
# フォーマット文字列で変数や式を表示する方法 name = '太郎' sex = '男性' age = 20 # f-stringで変数や式を含めて表示する方法 print(f'{name=}は{age=}歳の{sex=}です。') print(f'{name=}は{age*2=}歳の{sex=}です。')
【実行結果】 name='太郎'はage=20歳のsex='男性'です。 name='太郎'はage*2=40歳のsex='男性'です。
上記の例では、f-stringの記載をする際に{age=}
や{sex=}
としています。これにより結果では「age=20」「sex=’男性’」のように変数名をセットで表示できています。また、{age*2=}
というように式で記載すると「age*2=40」のように式を含めて表示ができます。
計算結果のみだとどういった式で計算されているか分かりにくいですが、上記方法ではどのような式が設定されているかが一目でわかります。デバッグ時に使用すると特に便利です。
書式設定をする方法
上記で紹介したformat
やf-stringでは、{}
内で:
(コロン)を使って書式指定をすることで表示形式を変更することが可能です。
以降の例で見てもらえば分かりますが、format
の場合は{:xxx}
のように書式を指定し、f-stringの場合は{val:xxx}
(ここでvalは変数や式)のように書式を指定します。
以降では代表的な各種書式の設定方法について紹介していきます。
左寄せ、中央寄せ、右寄せで表示する
左寄せ、中央寄せ、右寄せで表示したい場合には、以下のように「<
」(左寄せ), 「^
」(中央寄せ), 「>
」(右寄せ)を使用し、表示桁数を指定します。
num = 100 print("----- 左寄せ") print("format : {:<10}".format(num)) print(f"f-string: {num:<10}") print("----- 中央寄せ") print("format : {:^10}".format(num)) print(f"f-string: {num:^10}") print("----- 右寄せ") print("format : {:>10}".format(num)) print(f"f-string: {num:>10}")
【実行結果】 format : 100 f-string: 100 ----- 中央寄せ format : 100 f-string: 100 ----- 右寄せ format : 100 f-string: 100
上記例では、数値100の表示に10桁使用し、左寄せ、中央寄せ、右寄せで表示しています。:
に続けて<
, ^
, >
で表示位置指定し、桁数を記載します。数値以外の部分はスペースで補完されます。
左寄せ、中央寄せ、右寄せで表示する(補完する文字の指定)
上記で紹介した左寄せ、中央寄せ、右寄せで補完する文字を指定する場合には、以下のように<
, ^
, >
の前に補完する文字を指定します。
num = 100 print("----- 左寄せ") print("format : {:*<10}".format(num)) print(f"f-string: {num:*<10}") print("----- 中央寄せ") print("format : {:*^10}".format(num)) print(f"f-string: {num:*^10}") print("----- 右寄せ") print("format : {:*>10}".format(num)) print(f"f-string: {num:*>10}")
【実行結果】 ----- 左寄せ format : 100******* f-string: 100******* ----- 中央寄せ format : ***100**** f-string: ***100**** ----- 右寄せ format : *******100 f-string: *******100
上記の例では、補完する文字に「*
」を指定しています。このようにすると左寄せ、中央寄せ、右寄せになっていることがよく分かりますね。
符号を表示する
通常プラスの符号は表示されませんが、以下のように:
に続けて「+
」を指定することでプラスの値に符号をつけることができます。
num1 = 100 num2 = -100 print("----- 符号(プラスを表示)") print("format : {:+}".format(num1)) print(f"f-string: {num1:+}") print("format : {:+}".format(num2)) print(f"f-string: {num2:+}") print("----- 符号 (スペースで符号位置を揃える)") print("format : {: }".format(num1)) print(f"f-string: {num1: }") print("format : {: }".format(num2)) print(f"f-string: {num2: }")
【実行結果】 ----- 符号(プラスを表示) format : +100 f-string: +100 format : -100 f-string: -100 ----- 符号 (スペースで符号位置を揃える) format : 100 f-string: 100 format : -100 f-string: -100
上記例のようにプラスの符号が表示できることが分かります。また、:
の後ろにスペースを入れると+
の符号の位置にスペースが入るため、数値の位置を揃えることができます。
桁区切りを表示する
金額表示等では3桁ごとの桁区切りのカンマ(,
)を入れます。この桁区切りを指定するには以下のように:
に続けて「,
」を指定します。また、python 3.6で、アンダーバー(_
)での桁区切りも追加されています。
num = 1000000.123456 print("----- 桁区切りの表示 (カンマ ,)") print("format : {:,}".format(num)) print(f"f-string: {num:,}") print("----- 桁区切りの表示 (アンダーバー _) ※Python3.6で追加") print("format : {:_}".format(num)) print(f"f-string: {num:_}")
【実行結果】 ----- 桁区切りの表示 (カンマ ,) format : 1,000,000.123456 f-string: 1,000,000.123456 ----- 桁区切りの表示 (アンダーバー _) ※Python3.6で追加 format : 1_000_000.123456 f-string: 1_000_000.123456
上記のように桁区切りで表示すると数値が見やすくなります。
ゼロ埋めで表示する
数値をゼロ埋めで表示する場合には、以下のように:
に続けて0=
を記載し、その後に桁数を指定します。
print("----- ゼロ埋め (正の数)") num = 100 print("format : {:0=10}".format(num)) print(f"f-string: {num:0=10}") # ゼロ埋めの場合=は省略可能 print("format : {:010}".format(num)) print(f"f-string: {num:010}") print("----- ゼロ埋め (負の数)") num = -100 print("format : {:0=10}".format(num)) print(f"f-string: {num:0=10}") # ゼロ埋めの場合=は省略可能 print("format : {:010}".format(num)) print(f"f-string: {num:010}")
【実行結果】 ----- ゼロ埋め (正の数) format : 0000000100 f-string: 0000000100 format : 0000000100 f-string: 0000000100 ----- ゼロ埋め (負の数) format : -000000100 f-string: -000000100 format : -000000100 f-string: -000000100
上記のように数値がゼロ埋めされることが分かります。なお、上記例でも使っているように、ゼロ埋めの場合は「=
」は省略して{:010
}というような記載でも問題ありません。
また、マイナスの値の場合は符号が表示されてからゼロ埋めの数値が表示されます。
2進数、8進数、16進数で表示する
2進数で表示する場合は「b
」、8進数で表示する場合は「o
」、16審で表示する場合は「x
」または「X
」を:
に続けて記載します。
num = 255 print("----- 2進数表記") print("format : {:b}".format(num)) print(f"f-string: {num:b}") print("----- 8進数表記") print("format : {:o}".format(num)) print(f"f-string: {num:o}") print("----- 16進数表記 (小文字)") print("format : {:x}".format(num)) print(f"f-string: {num:x}") print("----- 16進数表記 (大文字)") print("format : {:X}".format(num)) print(f"f-string: {num:X}")
【実行結果】 ----- 2進数表記 format : 11111111 f-string: 11111111 ----- 8進数表記 format : 377 f-string: 377 ----- 16進数表記 (小文字) format : ff f-string: ff ----- 16進数表記 (大文字) format : FF f-string: FF
上記のように2進数、8進数、16進数で表示できていることが分かります。なお、16進数については、小文字の「x
」の場合は小文字、大文字の「X
」の場合は大文字の表示になります。
2進数、8進数、16進数で表示する(ゼロ埋め)
2進数、8進数、16進数での表示でゼロ埋め表示したい場合は、上記で紹介したゼロ埋めと組み合わせることができます。
num = 255 print("----- 2進数表記") print("format : {:0=10b}".format(num)) print(f"f-string: {num:0=10b}") print("----- 8進数表記") print("format : {:0=10o}".format(num)) print(f"f-string: {num:0=10o}") print("----- 16進数表記 (小文字)") print("format : {:0=10x}".format(num)) print(f"f-string: {num:0=10x}") print("----- 16進数表記 (大文字)") print("format : {:0=10X}".format(num)) print(f"f-string: {num:0=10X}")
【実行結果】 ----- 2進数表記 format : 0011111111 f-string: 0011111111 ----- 8進数表記 format : 0000000377 f-string: 0000000377 ----- 16進数表記 (小文字) format : 00000000ff f-string: 00000000ff ----- 16進数表記 (大文字) format : 00000000FF f-string: 00000000FF
小数点以下の桁数を指定して表示する
小数点以下の桁数を指定したい場合は、:
の後で「.桁数f」とすることで小数点以下の桁数を指定することができます。なお、「f
」については大文字の「F
」でも構いません。
num = 0.00000123456 print("----- 値によって自動で指数表記となる") print("format : {}".format(num)) print(f"f-string: {num}") print("----- 固定小数点表記で表示 (デフォルトは小数点以下6桁)") print("format : {:f}".format(num)) print(f"f-string: {num:f}") print("----- 小数点以下の桁数指定 (桁数を指定)") print("format : {:.15f}".format(num)) print(f"f-string: {num:.15f}") num1 = 0.0014 num2 = 0.0015 num3 = 0.0016 print("----- 固定小数点表記で表示 (四捨五入)") print("format : {:.3f}".format(num1)) print(f"f-string: {num1:.3f}") print("format : {:.3f}".format(num2)) print(f"f-string: {num2:.3f}") print("format : {:.3f}".format(num3)) print(f"f-string: {num3:.3f}")
【実行結果】 ----- 値によって自動で指数表記となる format : 1.23456e-06 f-string: 1.23456e-06 ----- 固定小数点表記で表示 (デフォルトは小数点以下6桁) format : 0.000001 f-string: 0.000001 ----- 小数点以下の桁数指定 (桁数を指定) format : 0.000001234560000 f-string: 0.000001234560000 ----- 固定小数点表記で表示 (四捨五入) format : 0.001 f-string: 0.001 format : 0.002 f-string: 0.002 format : 0.002 f-string: 0.002
上記例のように、フォーマットでは何も指定しない場合、数値の大きさによって自動的に指数表記になります。「f
」または「F
」を用いることで固定小数点の表示になります。
桁数を指定しない場合は、小数点以下6桁がデフォルトです。上記例で桁数を指定することで小数点以下の桁数を変えられていることが分かるかと思います。また、桁数で表示しきれない部分は四捨五入になっていることが分かります。
指数表記で表示する
指数表記で表示したい場合には、以下のように:
に続けて「e
」または「E
」を指定します。
num1 = 0.0000123456 num2 = 123456 print("----- 指数表記 (デフォルトは小数点以下6桁)") print("format : {:e}".format(num1)) print(f"f-string: {num1:e}") print("format : {:e}".format(num2)) print(f"f-string: {num2:e}") print("----- 小数点以下の桁数を指定") print("format : {:.3e}".format(num1)) print(f"f-string: {num1:.3e}") print("format : {:.3e}".format(num2)) print(f"f-string: {num2:.3e}") print("----- Eとすると表記が大文字になる") print("format : {:.3E}".format(num1)) print(f"f-string: {num1:.3E}") print("format : {:.3E}".format(num2)) print(f"f-string: {num2:.3E}")
【実行結果】 ----- 指数表記 (デフォルトは小数点以下6桁) format : 1.234560e-05 f-string: 1.234560e-05 format : 1.234560e+05 f-string: 1.234560e+05 ----- 小数点以下の桁数を指定 format : 1.235e-05 f-string: 1.235e-05 format : 1.235e+05 f-string: 1.235e+05 ----- Eとすると表記が大文字になる format : 1.235E-05 f-string: 1.235E-05 format : 1.235E+05 f-string: 1.235E+05
上記例のように指数表記で表示できていることが分かります。なお、指数部分のeの表記は指定した「e
」「E
」にあわせて小文字、大文字が変わります。
パーセント表示する %
数値をパーセント表記したい場合は、以下のように:
に続けて「%
」を指定します。
num = 0.15 print("----- パーセント表記(%)") print("format : {:%}".format(num)) print(f"f-string: {num:%}") print("----- 小数点以下の桁数を指定") print("format : {:.2%}".format(num)) print(f"f-string: {num:.2%}")
【実行結果】 ----- パーセント表記(%) format : 15.000000% f-string: 15.000000% ----- 小数点以下の桁数を指定 format : 15.00% f-string: 15.00%
デフォルトでは小数点以下が6桁になっているため、上記の小数点以下表記の記載方法を使って「.桁数%」とすることで小数点以下の桁数を指定することも可能です。
日付表示する datetime
日付表示をする場合には、datetime
モジュールを使って生成した値をフォーマットで渡すだけで表示できます。その際に:
に続けて日付のフォーマット文字列を指定できます。
import datetime dt = datetime.datetime(2023, 1, 1, 12, 30, 30) print("----- 日付の表示") print("format : {}".format(dt)) print(f"f-string: {dt}") print("-----日付フォーマットの指定") print("format : {:%Y/%d/%m %I:%M:%S, %A, %p}".format(dt)) print(f"f-string: {dt:%Y/%d/%m %I:%M:%S, %A, %p}") print("----- ISOフォーマットでの表示") print("format : {}".format(dt.isoformat())) print(f"f-string: {dt.isoformat()}")
【実行結果】 ----- 日付の表示 format : 2023-01-01 12:30:30 f-string: 2023-01-01 12:30:30 -----日付フォーマットの指定 format : 2023/01/01 12:30:30, Sunday, PM f-string: 2023/01/01 12:30:30, Sunday, PM ----- ISOフォーマットでの表示 format : 2023-01-01T12:30:30 f-string: 2023-01-01T12:30:30
日時のフォーマットを指定する場合には上記のように「%Y
」等の書式コードを使用します。日時の書式コードについては、公式ドキュメントの書式コード一覧に記載があるのでこちらを参考にして変更してみてください。
また、ISOフォーマットであればisoformat
メソッドで生成した文字列を表示した方が早いです。なお、datetime
モジュールで日付や時刻を整形する方法については「日付や時刻を整形する方法」でもまとめていますので参考にしてください。
まとめ
Pythonで文字列をフォーマットする方法を解説します。
Pythonでは、format
メソッドを用いた方法やf-string(f文字列)を用いた方法があり、これらの使い方を例を使って紹介しました。また、書式設定の各種方法についてもいくつかの例を使って説明しています。
プログラム中にprint
で値を埋め込んだ文字列を表示するといったことは頻繁に行います。またそのほかにもログファイルのフォーマットといった場面でも同様に必要になってくる場合があります。
是非、format
メソッドやf-stringの使い方を覚えて使いこなしてもらえればなと思います。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。