文字列

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

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

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

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

Python で文字列を扱う際に、変数の値を埋め込んで出力用の文字列を作るような場面はよくあります。このような場合、文字列を簡潔にフォーマットできると便利です。

Python では、代表的な文字列フォーマットとして次の 2 つがよく使用されます。

  1. f-string を用いた方法
  2. format メソッドを用いた方法

f-string は Python 3.6 で導入された比較的新しい方法のため、それ以前のバージョンでは、format を使用する必要があります。

一般的に f-string は format より高速で読みやすく、Pythonic な書き方とされているため、Python 3.6 以降では f-string の利用が推奨されます。とはいえ、最終的な選択は、開発者やプロジェクトのコーディングスタイルに依存します。

この記事では、それぞれの方法で文字列をフォーマットする方法について紹介します。

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

文字列をフォーマットする際には、f-string を使用します。日本語では「フォーマット済み文字列リテラル」といいます。

なお、f-string は、Python 3.6 で追加されているため、それ以前のバージョンでは後述する format を使用してください。

基本的な使い方

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 は値を埋め込むだけではなく、式を直接記述できる点が非常に強力で、どのような変数や式が埋め込まれるかが一目で分かります。

変数や式を含めて表示する方法

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 以前の Python から使われてきた代表的な文字列フォーマットの方法が 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歳の男性です。

引数番号を指定する場合には、文字列中の {} 内に引数番号を指定します。

このように指定しておくことで、1 度引数に指定した値の順番を変えたい場合には、文字列の {} 内の数字の順番を変更するのみで済みます。引数の番号は 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 の場合は {val:xxx} (ここで val は変数や式)、format の場合は {:xxx} のように書式を指定します。

以降で、代表的な書式設定方法について紹介します。

左寄せ、中央寄せ、右寄せで表示する

左寄せ、中央寄せ、右寄せで表示したい場合には、以下のように「<」(左寄せ)、「^」(中央寄せ), 「>」(右寄せ)を使用して、表示桁数を指定します。

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, 2, 12, 30, 30)

print("----- 日付の表示")
print("format  : {}".format(dt))
print(f"f-string: {dt}")

print("-----日付フォーマットの指定")
print("format  : {:%Y/%m/%d %I:%M:%S, %A, %p}".format(dt))
print(f"f-string: {dt:%Y/%m/%d %I:%M:%S, %A, %p}")

print("----- ISOフォーマットでの表示")
print("format  : {}".format(dt.isoformat()))
print(f"f-string: {dt.isoformat()}")
【実行結果】
----- 日付の表示
format  : 2023-01-02 12:30:30
f-string: 2023-01-02 12:30:30
-----日付フォーマットの指定
format  : 2023/01/02 12:30:30, Monday, PM
f-string: 2023/01/02 12:30:30, Monday, PM
----- ISOフォーマットでの表示
format  : 2023-01-02T12:30:30
f-string: 2023-01-02T12:30:30

日時のフォーマットを指定する場合には上記のような「%Y」といった書式コードを使用します。日時の書式コードについては、公式ドキュメントの書式コード一覧に記載があるのでこちらを参考にして変更してみてください。

また、ISOフォーマットであれば isoformat メソッドで生成した文字列を表示した方が早いです。なお、datetime モジュールで日付や時刻を整形する方法については「日付や時刻を整形する方法」を参考にしてください。

まとめ

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

Python で代表的な以下文字列フォーマットの使い方を紹介しています。

  1. f-string を用いた方法
  2. format メソッドを用いた方法

プログラム中に print で値を埋め込んだ文字列を表示することは頻繁に行います。また、他にもログファイルのフォーマットの場面でも同様に必要な場合があります。ぜひ、文字列のフォーマット方法の基本を押さえてもらいたいと思います。

あわせて読みたい
【Python Tech】プログラミングガイド
【Python Tech】プログラミングガイド
ソースコード

上記で紹介しているソースコードについては GitHub にて公開しています。参考にしていただければと思います

ABOUT ME
ホッシー
ホッシー
システムエンジニア
はじめまして。当サイトをご覧いただきありがとうございます。 私は製造業のメーカーで、DX推進や業務システムの設計・開発・導入を担当しているシステムエンジニアです。これまでに転職も経験しており、以前は大手電機メーカーでシステム開発に携わっていました。

プログラミング言語はこれまでC、C++、JAVA等を扱ってきましたが、最近では特に機械学習等の分析でも注目されているPythonについてとても興味をもって取り組んでいます。これまでの経験をもとに、Pythonに興味を持つ方のお役に立てるような情報を発信していきたいと思います。どうぞよろしくお願いいたします。

※キャラクターデザイン:ゼイルン様
記事URLをコピーしました