文字列

【Python】formatやf-stringを用いて文字列をフォーマットする方法

【Python】formatやf-stringを用いて文字列をフォーマットする方法

Pythonで文字列をフォーマットする方法を解説します。

文字列をフォーマットする方法

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の使い方を覚えて使いこなしてもらえればなと思います。

Note
  • formatメソッドの公式ドキュメントはこちらを参照してください。
  • f-stringの公式ドキュメントはこちらを参照してください。