Python 文字列フォーマット

Python 3 ドキュメントより

ここで説明されているフォーマット操作 (% 演算子) は、多くの一般的なエラーの原因となるさまざまな特異性を示します [...]. 新しい フォーマット済み文字列リテラル [...] を使用すると、これらのエラーを回避できます。これらの代替手段は、テキストのフォーマットに対して、より強力で、柔軟で、拡張性の高いアプローチも提供します。

% operator

文字列リテラルを優先する

新しいコードでは、% 演算子よりも str.format または フォーマット済み文字列リテラル (Python 3.6+) の使用が強く推奨されます。

# % operator: 旧スタイルの文字列フォーマット (新規コードには非推奨)
name = 'Pete'
'Hello %s' % name  # %s = 文字列プレースホルダ
"Hello Pete"

%d フォーマット指定子を使用して int 値を文字列に変換できます。

num = 5
'I have %d apples' % num
"I have 5 apples"

str.format

Python 3 では、文字列フォーマットの新しい方法が導入され、後に Python 2.7 にバックポートされました。これにより、文字列フォーマットの構文がより規則的になります。

# str.format() メソッド:モダンな文字列フォーマット (Python 2.7+)
name = 'John'
age = 20

"Hello I'm {}, my age is {}".format(name, age)  # {} = プレースホルダ
"Hello I'm John, my age is 20"
"Hello I'm {0}, my age is {1}".format(name, age)
"Hello I'm John, my age is 20"

Formatted String Literals or f-Strings

Python 3.6+ を使用している場合、文字列の f-Strings が文字列をフォーマットするための推奨される方法です。

Python 3 ドキュメントより

フォーマット済み文字列リテラル、または f-string は、f または F で始まる文字列リテラルです。これらの文字列には、波括弧 {} で区切られた式を含む置換フィールドを含めることができます。他の文字列リテラルは常に定数値を持つ一方、フォーマット済み文字列は実行時に評価される式です。

# f-string: 文字列をフォーマットするための推奨される方法 (Python 3.6+)
name = 'Elizabeth'
f'Hello {name}!'  # f プレフィックスにより {} 内に式を含めることができる
'Hello Elizabeth!'
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

Python の f-string に使用されるプレフィックスは何ですか?
A. fmt
B. f または F
C. format
D. str

インライン計算を行うことも可能です。

# f-strings は式をサポート:{} 内に計算を含めることができる
a = 5
b = 10
f'Five plus ten is {a + b} and not {2 * (a + b)}.'  # 式を評価する
'Five plus ten is 15 and not 30.'

複数行の f-String

name = 'Robert'
messages = 12
(
f'Hi, {name}. '
f'You have {messages} unread messages'
)
'Hi, Robert. You have 12 unread messages'

= 指定子

これは式とその値を出力します。

# = 指定子:変数名とその両方を出力 (Python 3.8+)
from datetime import datetime
now = datetime.now().strftime("%b/%d/%Y - %H:%M:%S")
f'date and time: {now=}'  # "now='Nov/14/2022 - 20:50:01'" を出力
"date and time: now='Nov/14/2022 - 20:50:01'"

スペースまたは文字の追加

name = 'Robert'
f"{name.upper() = :-^20}"
'name.upper() = -------ROBERT-------'
f"{name.upper() = :^20}"
'name.upper() =        ROBERT       '
f"{name.upper() = :20}"
'name.upper() = ROBERT              '

数字のフォーマット

桁区切り (数千区切り) の追加

a = 10000000
f"{a:,}"
'10,000,000'

丸め処理

a = 3.1415926
f"{a:.2f}"
'3.14'
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

f"{a:.2f}" は何を行いますか?
A. 数値を最も近い整数に丸める
B. パーセンテージとしてフォーマットする
C. 数値を小数点以下 2 桁の浮動小数点数としてフォーマットする
D. 科学的記数法に変換する

パーセンテージとして表示

a = 0.816562
f"{a:.2%}"
'81.66%'

数値フォーマットの表

数値フォーマット出力説明
3.1415926{:.2f}3.14浮動小数点数を小数点以下 2 桁でフォーマット
3.1415926{:+.2f}+3.14符号付き浮動小数点数を小数点以下 2 桁でフォーマット
-1{:+.2f}-1.00符号付き浮動小数点数を小数点以下 2 桁でフォーマット
2.71828{:.0f}3浮動小数点数を小数点なしでフォーマット
4{:0>2d}04ゼロで数値をパディング (左詰め、幅 2)
4{:x<4d}4xxxx で数値をパディング (右詰め、幅 4)
10{:x<4d}10xxx で数値をパディング (右詰め、幅 4)
1000000{:,}1,000,000カンマ区切りでの数値フォーマット
0.35{:.2%}35.00%パーセンテージのフォーマット
1000000000{:.2e}1.00e+09指数表記
11{:11d}11右寄せ (デフォルト、幅 10)
11{:<11d}11左寄せ (幅 10)
11{:^11d}11中央寄せ (幅 10)

Template Strings

よりシンプルで機能が少ないメカニズムですが、ユーザーによって生成された文字列を扱う場合に推奨されます。複雑さが軽減されるため、テンプレート文字列はより安全な選択肢となります。

from string import Template
name = 'Elizabeth'
t = Template('Hey $name!')
t.substitute(name=name)
'Hey Elizabeth!'

関連リンク