閉じる

Pythonで文字列に値を埋め込む(f-string)基本と実例

Pythonで「文字列の中に変数の値をわかりやすく埋め込みたい」と感じたら、f-stringを使うのが最短距離です。

読みやすく、間違いを減らし、実行速度も速いのが特長です。

この記事では、基本から実例、フォーマット、エラー対処まで、初心者でも段階的に理解できるように丁寧に解説します。

Pythonで文字列に値を埋め込む f-stringの基本

f-stringとは

f-stringは、f"..."またはF"..."の形式で書く文字列リテラルで、波かっこ{}内に式や変数を書いて、その場で評価した結果を埋め込みます。

Python 3.6以降で使用できます

Python
# もっとも基本的な例
name = "Taro"
print(f"Hello, {name}!")
実行結果
Hello, Taro!

f”…”と{}の書き方

f-stringでは、文字列の先頭にfを付け、埋め込みたい部分を{式}で囲みます。

とは、変数名だけでなく、四則演算や関数呼び出しなども含みます。

Python
x = 3
y = 5
print(f"{x} + {y} = {x + y}")  # {}の中は式OK
実行結果
3 + 5 = 8

変数を埋め込む

最もよく使うのは、変数の値をそのまま埋め込む方法です。

可読性の高さがf-string最大の魅力です。

Python
user = "Alice"
age = 20
print(f"User: {user}, Age: {age}")
実行結果
User: Alice, Age: 20

式をその場で評価

{}の中は式として評価されます。

長い式は可読性に注意しましょう。

Python
a, b = 12, 7
print(f"{a} * {b} = {a * b}")
print(f"平均: {(a + b) / 2}")
実行結果
12 * 7 = 84
平均: 9.5

属性や辞書キーを参照

オブジェクトの属性や辞書のキーも直接参照できます。

Python
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

波かっこを文字として出す

{}を文字として表示したい場合は、2つ重ねます。

fを付け忘れて波かっこがそのまま出るのは別の問題です

Python
print(f"辞書を表すなら '{{key: value}}' のように書きます")
実行結果
辞書を表すなら '{key: value}' のように書きます

f-stringの書式指定とフォーマット

文字列の基本フォーマット

コロン:以降にフォーマット指定子を書き、表示幅や精度を整えます。

文字列は精度で最大長を指定できます。

Python
s = "abcdefg"
print(f"[{s:.5}]")   # 先頭から最大5文字
print(f"[{s:10}]")   # 幅10(左寄せがデフォルト)
実行結果
[abcde]
[   abcdefg]

数値の桁数とゼロ埋め

整数の桁数をそろえ、余った部分をゼロで埋められます。

Python
n = 42
print(f"{n:03}")   # 3桁ゼロ埋め
print(f"{n:06}")   # 6桁ゼロ埋め
実行結果
042
000042

小数点の桁数を指定

小数は.Nfで小数点以下の桁数を指定します。

四捨五入されます。

Python
pi = 3.1415926535
print(f"{pi:.2f}")    # 小数点以下2桁
print(f"{pi:.6f}")    # 小数点以下6桁
実行結果
3.14
3.141593

カンマ区切りやパーセント表示

桁区切りやパーセント表示は簡単に指定できます。

Python
n = 12345678
ratio = 0.076
print(f"{n:,}")        # 3桁ごとにカンマ
print(f"{ratio:.2%}")  # パーセント表示(×100して%)
実行結果
12,345,678
7.60%

進数表示とプレフィックス

基数変換と接頭辞は次のように行います。

Python
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文字を先頭に置きます。

Python
word = "cat"
print(f"[{word:>6}]")   # 右寄せ
print(f"[{word:<6}]")   # 左寄せ
print(f"[{word:^6}]")   # 中央寄せ
print(f"[{word:_^6}]")  # 埋め文字を_に
実行結果
[   cat]
[cat   ]
[ cat  ]
[_cat__]

左寄せ 右寄せ 中央寄せ

アラインメントを使うと、表の見た目が整います。

数値は右寄せ、文字列は左寄せが定番です。

Python
item = "Apple"
price = 120
print(f"|{item:<10}|{price:>6}|")
実行結果
|Apple     |   120|

変換フラグ !s !r !a

変換フラグは、値を文字列化する方法を選べます。

  • !s: str()相当(人向け)
  • !r: repr()相当(開発者向け・再現性重視)
  • !a: ascii()相当(非ASCIIをエスケープ)
Python
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形式で書けます。

Python
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 X2,8,16進(小/大文字)
接頭辞#0b/0o/0xを付与
パーセント%×100して%表示

Python f-stringの実例

メッセージテンプレートを作る

テンプレート的に埋め込むと、ログやメッセージの整合性が上がります。

Python
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

表形式の整列出力

列幅を揃えると可読性が上がります。

ヘッダーとデータで同じ幅指定を使うのがコツです。

Python
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=}で「名前=値」を自動で出力できます。

ログやデバッグで強力です。

Python
x = 12
y = 7
print(f"{x=}, {y=}, sum={x+y}")
実行結果
x=12, y=7, sum=19

多行文字列とf-string

三重クォートで複数行をそのまま表現できます。

改行や空白を含むレターやテンプレートに最適です。

Python
name = "Rina"
total = 12800
message = f"""
親愛なる {name} 様

ご注文ありがとうございます。
合計金額は {total:,} 円です。

今後ともよろしくお願いいたします。
"""
print(message.strip())  # 先頭末尾の余白を整える
実行結果
親愛なる Rina 様

ご注文ありがとうございます。
合計金額は 12,800 円です。

今後ともよろしくお願いいたします。

URLやファイルパスを組み立てる

単純連結はf-stringで十分ですが、エンコードや区切りは専用モジュールに任せると安全です。

Python
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

数値と単位を整形する

単位系はフォーマット込みで一貫性を持たせます。

Python
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を付け忘れることです。

波かっこがそのまま出力されます。

Python
name = "Taro"
print("Hello, {name}!")   # fが無い
実行結果
Hello, {name}!

{}の対応ミス

波かっこの数が合わないと構文エラーです。

複雑になったら一度変数に分けてから埋め込みましょう。

Python
# NG例: SyntaxError になる
# print(f"{1 + (2 * 3}")  # 閉じかっこ不足

# OK例: 先に計算してから埋め込む
val = 1 + (2 * 3)
print(f"{val}")
実行結果
7

クォートのエスケープ

文字列内で引用符を使うときは、\でエスケープするか、別の引用符で囲みます。

Python
word = 'He said "Hi"'
print(f"{word}")
print(f"She said \"Hello\"")
実行結果
He said "Hi"
She said "Hello"

三重クォートの活用

三重クォートは改行を含む文章に便利です。

インデントの扱いに注意し、必要に応じてstrip()textwrap.dedent()を使います。

Python
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()に切り替えましょう。

Python
name = "Mio"
# 代替: format
print("Hello, {0}!".format(name))
実行結果
Hello, Mio!

formatや%との違いと使い分け

  • f-string: 最も読みやすく高速。式が書ける。3.6+必須。
  • str.format(): 互換性や再利用に強い(テンプレート再利用)。
  • %: 旧来の書式。既存コード保守用。

新規コードでは原則f-stringを推奨します。

ユーザー入力を直接評価しない

f-stringは{}内の式を実行します。

外部入力を式として実行する実装は絶対に避けてください

SQLやシェルコマンドは専用のプレースホルダを使います。

Python
# 悪い例(イメージ): コマンド文字列を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は一般に最速かつ最も読みやすい方法です。

ただし、複雑な計算や長大な式は事前に変数へ保管してから埋め込むと、保守性が上がります。

Python
# 複雑な式を先に計算
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を標準とし、読みやすさと一貫性を手に入れてください。

この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!