Pythonで「文字列の中に変数の値をわかりやすく埋め込みたい」と感じたら、f-stringを使うのが最短距離です。
読みやすく、間違いを減らし、実行速度も速いのが特長です。
この記事では、基本から実例、フォーマット、エラー対処まで、初心者でも段階的に理解できるように丁寧に解説します。
Pythonで文字列に値を埋め込む f-stringの基本
f-stringとは
f-stringは、f"..."
またはF"..."
の形式で書く文字列リテラルで、波かっこ{}
内に式や変数を書いて、その場で評価した結果を埋め込みます。
Python 3.6以降で使用できます。
# もっとも基本的な例
name = "Taro"
print(f"Hello, {name}!")
Hello, Taro!
f”…”と{}の書き方
f-stringでは、文字列の先頭にf
を付け、埋め込みたい部分を{式}
で囲みます。
式とは、変数名だけでなく、四則演算や関数呼び出しなども含みます。
x = 3
y = 5
print(f"{x} + {y} = {x + y}") # {}の中は式OK
3 + 5 = 8
変数を埋め込む
最もよく使うのは、変数の値をそのまま埋め込む方法です。
可読性の高さがf-string最大の魅力です。
user = "Alice"
age = 20
print(f"User: {user}, Age: {age}")
User: Alice, Age: 20
式をその場で評価
{}
の中は式として評価されます。
長い式は可読性に注意しましょう。
a, b = 12, 7
print(f"{a} * {b} = {a * b}")
print(f"平均: {(a + b) / 2}")
12 * 7 = 84
平均: 9.5
属性や辞書キーを参照
オブジェクトの属性や辞書のキーも直接参照できます。
class User:
def __init__(self, name):
self.name = name
u = User("Mika")
info = {"lang": "Python", "ver": 3.12}
print(f"ユーザー名: {u.name}")
print(f"言語: {info['lang']}, バージョン: {info['ver']}")
ユーザー名: Mika
言語: Python, バージョン: 3.12
- 関連記事:辞書(dict)の基本的な使い方
波かっこを文字として出す
{
や}
を文字として表示したい場合は、2つ重ねます。
fを付け忘れて波かっこがそのまま出るのは別の問題です。
print(f"辞書を表すなら '{{key: value}}' のように書きます")
辞書を表すなら '{key: value}' のように書きます
- 関連記事:文字列と数値の型を変換したい
f-stringの書式指定とフォーマット
文字列の基本フォーマット
コロン:
以降にフォーマット指定子を書き、表示幅や精度を整えます。
文字列は精度で最大長を指定できます。
s = "abcdefg"
print(f"[{s:.5}]") # 先頭から最大5文字
print(f"[{s:10}]") # 幅10(左寄せがデフォルト)
[abcde]
[ abcdefg]
数値の桁数とゼロ埋め
整数の桁数をそろえ、余った部分をゼロで埋められます。
n = 42
print(f"{n:03}") # 3桁ゼロ埋め
print(f"{n:06}") # 6桁ゼロ埋め
042
000042
小数点の桁数を指定
小数は.Nf
で小数点以下の桁数を指定します。
四捨五入されます。
pi = 3.1415926535
print(f"{pi:.2f}") # 小数点以下2桁
print(f"{pi:.6f}") # 小数点以下6桁
3.14
3.141593
カンマ区切りやパーセント表示
桁区切りやパーセント表示は簡単に指定できます。
n = 12345678
ratio = 0.076
print(f"{n:,}") # 3桁ごとにカンマ
print(f"{ratio:.2%}") # パーセント表示(×100して%)
12,345,678
7.60%
進数表示とプレフィックス
基数変換と接頭辞は次のように行います。
x = 255
print(f"{x:b}") # 2進数
print(f"{x:o}") # 8進数
print(f"{x:x}") # 16進数(小文字)
print(f"{x:#b}") # 0b付き
print(f"{x:#X}") # 0X付き(大文字)
11111111
377
ff
0b11111111
0XFF
幅とアラインメント
幅はwidth
、配置は<
(左寄せ)、>
(右寄せ)、^
(中央寄せ)で指定します。
埋め文字は任意の1文字を先頭に置きます。
word = "cat"
print(f"[{word:>6}]") # 右寄せ
print(f"[{word:<6}]") # 左寄せ
print(f"[{word:^6}]") # 中央寄せ
print(f"[{word:_^6}]") # 埋め文字を_に
[ cat]
[cat ]
[ cat ]
[_cat__]
左寄せ 右寄せ 中央寄せ
アラインメントを使うと、表の見た目が整います。
数値は右寄せ、文字列は左寄せが定番です。
item = "Apple"
price = 120
print(f"|{item:<10}|{price:>6}|")
|Apple | 120|
変換フラグ !s !r !a
変換フラグは、値を文字列化する方法を選べます。
!s
:str()
相当(人向け)!r
:repr()
相当(開発者向け・再現性重視)!a
:ascii()
相当(非ASCIIをエスケープ)
text = "こんにちは"
print(f"{text!s}") # そのまま
print(f"{text!r}") # クォート付きの表現
print(f"{text!a}") # \uXXXX などにエスケープ
こんにちは
'こんにちは'
'\u3053\u3093\u306b\u3061\u306f'
日付と時刻のフォーマット
datetime
は:{%Y-%m-%d %H:%M}
のようにstrftime
形式で書けます。
from datetime import datetime
dt = datetime(2025, 9, 10, 14, 5, 9)
print(f"ISO: {dt:%Y-%m-%dT%H:%M:%S}")
print(f"和風: {dt:%Y年%m月%d日 %H時%M分}")
ISO: 2025-09-10T14:05:09
和風: 2025年09月10日 14時05分
以下の表は、よく使う指定子の要約です。
用途 | 指定例 | 意味 |
---|---|---|
幅 | 10 | 幅10で詰め物 |
左/右/中央寄せ | < /> /^ | 配置 |
ゼロ埋め | 0 | 余りを0で埋める |
カンマ区切り | , | 3桁区切り |
浮動小数 | .2f | 小数2桁 |
進数 | b o x X | 2,8,16進(小/大文字) |
接頭辞 | # | 0b/0o/0xを付与 |
パーセント | % | ×100して%表示 |
Python f-stringの実例
メッセージテンプレートを作る
テンプレート的に埋め込むと、ログやメッセージの整合性が上がります。
user = "suzuki"
action = "login"
ip = "192.168.0.10"
print(f"[INFO] user={user} action={action} ip={ip}")
[INFO] user=suzuki action=login ip=192.168.0.10
表形式の整列出力
列幅を揃えると可読性が上がります。
ヘッダーとデータで同じ幅指定を使うのがコツです。
rows = [
("Apple", 120, 3),
("Banana", 98, 10),
("Cherry", 450, 1),
]
print(f"{'Item':<10} {'Price':>6} {'Qty':>5}")
print("-" * 23)
for name, price, qty in rows:
print(f"{name:<10} {price:>6,} {qty:>5}")
Item Price Qty
-----------------------
Apple 120 3
Banana 98 10
Cherry 450 1
デバッグに便利な変数=表記
Python 3.8以降は{var=}
で「名前=値」を自動で出力できます。
ログやデバッグで強力です。
x = 12
y = 7
print(f"{x=}, {y=}, sum={x+y}")
x=12, y=7, sum=19
- 関連記事:f-stringで変数名と値を同時出力
多行文字列とf-string
三重クォートで複数行をそのまま表現できます。
改行や空白を含むレターやテンプレートに最適です。
name = "Rina"
total = 12800
message = f"""
親愛なる {name} 様
ご注文ありがとうございます。
合計金額は {total:,} 円です。
今後ともよろしくお願いいたします。
"""
print(message.strip()) # 先頭末尾の余白を整える
親愛なる Rina 様
ご注文ありがとうございます。
合計金額は 12,800 円です。
今後ともよろしくお願いいたします。
URLやファイルパスを組み立てる
単純連結はf-stringで十分ですが、エンコードや区切りは専用モジュールに任せると安全です。
from urllib.parse import urlencode
from pathlib import Path
base = "https://example.com/search"
params = {"q": "café latte", "page": 2}
url = f"{base}?{urlencode(params)}" # パラメータは必ずurlencode
print(url)
root = Path("/usr/local")
tool = "bin/python3"
path = root / tool # OSに依存しない結合
print(f"path={path}")
https://example.com/search?q=caf%C3%A9+latte&page=2
path=/usr/local/bin/python3
数値と単位を整形する
単位系はフォーマット込みで一貫性を持たせます。
speed = 12.3456
size = 12345678
ratio = 0.045
print(f"速度: {speed:.1f} m/s")
print(f"サイズ: {size/1024/1024:.2f} MiB")
print(f"達成率: {ratio:.1%}")
速度: 12.3 m/s
サイズ: 11.77 MiB
達成率: 4.5%
よくあるエラーと注意点
fを付け忘れる
最頻出ミスは、文字列にf
を付け忘れることです。
波かっこがそのまま出力されます。
name = "Taro"
print("Hello, {name}!") # fが無い
Hello, {name}!
{}の対応ミス
波かっこの数が合わないと構文エラーです。
複雑になったら一度変数に分けてから埋め込みましょう。
# NG例: SyntaxError になる
# print(f"{1 + (2 * 3}") # 閉じかっこ不足
# OK例: 先に計算してから埋め込む
val = 1 + (2 * 3)
print(f"{val}")
7
クォートのエスケープ
文字列内で引用符を使うときは、\
でエスケープするか、別の引用符で囲みます。
word = 'He said "Hi"'
print(f"{word}")
print(f"She said \"Hello\"")
He said "Hi"
She said "Hello"
三重クォートの活用
三重クォートは改行を含む文章に便利です。
インデントの扱いに注意し、必要に応じてstrip()
やtextwrap.dedent()
を使います。
import textwrap
title = "Report"
body = "All tests passed."
doc = f"""
{title}
-----------
{body}
"""
print(textwrap.dedent(doc).strip())
Report
-----------
All tests passed.
Pythonのバージョン要件
f-stringはPython 3.6以降、{var=}
は3.8以降で使えます。
古い実行環境ではstr.format()
に切り替えましょう。
name = "Mio"
# 代替: format
print("Hello, {0}!".format(name))
Hello, Mio!
- 関連記事:Pythonのバージョンを確認したい
formatや%との違いと使い分け
- f-string: 最も読みやすく高速。式が書ける。3.6+必須。
- str.format(): 互換性や再利用に強い(テンプレート再利用)。
- %: 旧来の書式。既存コード保守用。
新規コードでは原則f-stringを推奨します。
ユーザー入力を直接評価しない
f-stringは{}
内の式を実行します。
外部入力を式として実行する実装は絶対に避けてください。
SQLやシェルコマンドは専用のプレースホルダを使います。
# 悪い例(イメージ): コマンド文字列をf-stringで危険に組み立てる
filename = "../../etc/passwd"
# print(f"cat {filename}") # 実行は危険
# 良い例: 安全なパラメータ渡し(例: sqlite3)
import sqlite3
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute("CREATE TABLE t(id INTEGER, name TEXT)")
name = "Alice"
cur.execute("INSERT INTO t VALUES(?, ?)", (1, name)) # プレースホルダ
conn.commit()
print("OK")
OK
パフォーマンスと可読性
f-stringは一般に最速かつ最も読みやすい方法です。
ただし、複雑な計算や長大な式は事前に変数へ保管してから埋め込むと、保守性が上がります。
# 複雑な式を先に計算
items = [1, 2, 3, 4]
total = sum(items)
avg = total / len(items)
print(f"total={total}, avg={avg:.2f}")
total=10, avg=2.00
まとめ
f-stringは短く、読みやすく、強力な文字列整形の手段です。
f"..."
と{}
の基本から、数値や日付のフォーマット、表の整列、デバッグ用{var=}
、多行テンプレートまで、日々の開発で即戦力として使えます。
エスケープやバージョン要件、セキュリティに注意しつつ、まずは小さな出力から置き換えていくとよいです。
新規コードはf-stringを標準とし、読みやすさと一貫性を手に入れてください。
- 関連記事:f-string書式指定まとめ