【 Python 入門】 format で書式を変換する方法を徹底解説!定型文の自動作成方法も紹介!

python-format-thumbnail

Python を学び始めた方にとって、数値や文字列を整形する方法は非常に重要です。特に、format() 関数は、データを見やすく表示するための強力なツールです。本記事では、format() 関数の基本的な使い方から応用例までを詳しく解説します。記事の後半では、for 文と組み合わせて自動で定型メールを作成する方法も紹介します。

実行環境

  • Google Colaboratory
  • Python: 3.10.12
  • Windows11

組み込み関数 format()

Python の組み込み関数 format() は、数値や文字列を指定したフォーマットで整形するために使用されます。これにより、データの表示方法を柔軟にコントロールすることが可能です。

format() 関数の基本的な使い方

format() 関数の基本的な使い方を見てみましょう。以下の例では、数値を小数点以下 2 桁まで表示します。

数値を小数点以下 2 桁まで表示
number = 123.456
formatted_number = format(number, '.2f')
print(formatted_number)  # 出力: 123.46

解説: format() 関数は、第一引数に整形したい値(この場合は number )、第二引数にフォーマット指定子(ここでは'.2f')を渡します。.2fは、小数点以下 2 桁までの浮動小数点数として表示することを意味します。

文字列メソッド str.format()

str.format() メソッドは、文字列の中に変数や値を埋め込むための方法です。これを使うことで、動的なメッセージやレポートを簡単に作成できます。

str.format() メソッドの基本的な使い方

以下の例は、名前と年齢を文字列に埋め込む方法です。

名前と年齢を文字列に埋め込む
name = "太郎"
age = 20
message = "私の名前は {} で、年齢は {} 歳です。".format(name, age)
print(message)
出力結果
私の名前は 太郎 で、年齢は 20 歳です。

解説: str.format() メソッドでは、文字列内の{}に対して、format() 関数の引数として渡された値が順番に埋め込まれます。

フォーマット指定子の使い方

str.format() メソッドでは、フォーマット指定子を使って値の表示方法を細かく指定できます。

フォーマット指定子
number = 255
hex_number = "16進数の値は: {:x}".format(number)
print(hex_number)  # 出力: 16進数の値は: ff

解説: {:x}は、数値を 16 進数で表示する指定子です。ここでは、数値255 が 16 進数でff として表示されます。

数値の書式指定の例

次に、format() 関数を使って数値を特定の形式で表示するための具体的な例をいくつか紹介します。

整数の書式指定

整数を特定の桁数に揃えたり、ゼロで埋める方法です。

ゼロで埋める
number = 7
formatted_number = format(number, '03')
print(formatted_number)  # 出力: 007

解説: '03' は、 3 桁で表示し、足りない桁はゼロで埋めることを意味します。
'02' は、 2 桁で 出力: 07 ,'04' は、 4 桁で 出力: 0007 と表示します。

浮動小数点数の書式指定

浮動小数点数の小数点以下の桁数を指定して表示します。

小数点以下の桁数を指定して表示
number = 3.14159
formatted_number = format(number, '.2f')
print(formatted_number)  # 出力: 3.14

解説: '.2f'は、小数点以下 2 桁まで表示する指定子です。
'.1f'は、小数点以下 1 桁で 出力: 123.5 , '.4f'は、小数点以下 3 桁で 出力: 123.4560 と表示します。

桁区切りや符号の付加

大きな数値に対して、桁区切りを追加、符号を付加する方法です。

桁区切りや符号の付加
number = 1000000
formatted_number = format(number, '+,')
print(formatted_number)  # 出力: +1,000,000

解説: '+,'は、数値にカンマ区切りを付け、符号を表示する指定子です。正の数である場合に + が付きます。
負の数 -1000000 の場合は、出力: -1,000,000 と表示します。

文字列の書式指定の例

次に、文字列の表示方法をカスタマイズするための具体例を紹介します。

文字列の幅や詰め物(パディング)の指定

文字列の幅を指定し、特定の文字で埋める方法です。

文字列の幅や詰め物の指定
text = "Python"
formatted_text = format(text, '*^10')
print(formatted_text)  # 出力: **Python**

解説: '*^10'は、文字列を中央揃えで 10 文字幅にし、余白を*で埋める指定子です。
'-<10'は、出力: Hello—– , '>10'のように文字を選択しない場合は、余白にはスペースが入ります。

10 進数や 16 進数の表示

数値を 10 進数や 16 進数で表示する方法です。

10 進数や 16 進数の表示
number = 255
decimal = format(number, 'd')  # 10 進数
hexadecimal = format(number, 'x')  # 16 進数
print(decimal)       # 10進数の出力: 255
print(hexadecimal)  # 16進数の出力: ff

解説: 'd'は 10 進数、'x'は 16 進数で数値を表示する指定子です。
'b' 指定子を使うと、数値を 2 進数、'o' 指定子を使うと、数値を 8 進数で表示します。

日付や時刻の表示

datetimeモジュールを使用して、日付や時刻を指定した形式で表示します。
 (注意点:Google Colab で実行すると日本の時刻ではなく、サーバーが置いてある場所の時刻になります。)

日付や時刻の表示
from datetime import datetime
now = datetime.now()
formatted_date = format(now, '%Y-%m-%d %H:%M:%S')
print(formatted_date)  # 出力例: 2024-01-01 10:30:00

解説: '%Y-%m-%d %H:%M:%S'は、年-月-日 時:分:秒の形式で日付と時刻を表示するフォーマット指定子です。

format 関数の応用

format()関数を使った応用的な使い方をいくつか紹介します。

format 関数を用いたテンプレート文字列の作成

テンプレート文字列に複数の変数を挿入する方法です。

テンプレート文字列の作成
template = """
{customer_name} 様

ご注文いただきありがとうございます。以下の商品を発送しました。
注文番号: {order_id}
商品: {product}

お届けまでお待ちください。

ショップ名
"""

order = {
    "customer_name": "田中",
    "order_id": "12345",
    "product": "ノートパソコン"
}

message = template.format(**order)
print(message)
出力結果
田中 様

ご注文いただきありがとうございます。以下の商品を発送しました。
注文番号: 12345
商品: ノートパソコン

お届けまでお待ちください。

ショップ名

解説: **orderは辞書の内容を使って、特定の場所に値を入れる作業をします。これによって、テンプレート内の{customer_name}{order_id}{product}が、それぞれのお客様の名前、注文番号、商品名に置き換えられます。

複数の変数を含んだフォーマット

複数の変数を同時にフォーマットする方法です。

複数の変数を同時にフォーマット
id = "12345"
product = "スマートフォン"
price = 50000
message = "注文番号:{0}, 商品: {1}, 価格: {2}円".format(id,product, price)
print(message)  # 出力: 注文番号:12345, 商品: スマートフォン, 価格: 50000円

解説: {0}{1}{2}は、format()関数の引数の順番に対応しています。これにより、複数の変数を簡単に挿入できます。

format 関数の注意点

ここでは、format()関数を使用する際の注意点を紹介します。

予約語や特殊文字の表示方法

format()関数内で予約語や特殊文字を扱う際も、適切にエスケープする必要があります。特に、文字列内にプレースホルダー以外の波括弧や特殊文字を含めたい場合には注意が必要です。

特殊文字を含む文字列のフォーマット
template = "計算結果: {value} (単位: {{kg}})"
value = 75.5

formatted_text = format(template.format(value=value))
print(formatted_text)  # 出力: 計算結果: 75.5 (単位: {kg})

解説: テンプレート内の {{kg}} により、実際の波括弧 {} を表示しつつ、プレースホルダー {value} に数値を挿入しています。このように、特殊文字を含む文字列を扱う際には、エスケープが必要です。

補足
・予約語とは、Pythonが特別な意味を持っているため、変数名や関数名として使用できない単語のことです。例えば、for、if、else、class などが予約語です。

特殊文字とは、プログラミングにおいて特別な機能や意味を持つ文字のことです。例えば、改行を表す \n やタブを表す \t、クオート('")などが特殊文字に該当します。

format 関数の戻り値の利用方法

format() 関数は新しい文字列を返すため、元の文字列や数値は変更されません。そのため、フォーマット後の値を別の変数に代入して使用します。

戻り値の利用
num = 1234.567
formatted_num = format(num, '.2f')
print(formatted_num)  # 出力: 1234.57
print(num) # 元の出力:1234.567

解説: formatted_num にフォーマットされた結果を代入し、元のnum は変更されません。

for 文と組み合わせた format() の便利な使い方

for 文とformat() 関数を組み合わせることで、複数のデータを効率的にフォーマットして処理できます。以下に具体的な例を示します。

以下の記事では、 for 文を詳しく紹介しています。併せてご覧ください!

1 . 複数の注文データを自動的にメールメッセージに変換

ECサイトなどで複数の注文がある場合、各注文に対して個別のメールメッセージを生成する必要があります。for 文とformat() 関数を組み合わせることで、これを簡単に自動化できます。

顧客ごとの注文確認メールの自動生成
# 注文データ(例)
orders = [
    {"customer_name": "田中", "order_id": "123", "product": "ノートパソコン"},
    {"customer_name": "佐藤", "order_id": "124", "product": "スマートフォン"},
    {"customer_name": "鈴木", "order_id": "125", "product": "タブレット"}
]

# メールテンプレート
template = """
{customer_name} 様

ご注文いただきありがとうございます。以下の商品を発送しました。
注文番号: {order_id}
商品: {product}

お届けまでお待ちください。

ショップ名
---------------------------
"""

# 各注文に対してメールメッセージを生成
for order in orders:
    message = template.format(**order)
    print(message)
出力結果
田中 様

ご注文いただきありがとうございます。以下の商品を発送しました。
注文番号: 123
商品: ノートパソコン

お届けまでお待ちください。

ショップ名
---------------------------
佐藤 様

ご注文いただきありがとうございます。以下の商品を発送しました。
注文番号: 124
商品: スマートフォン

お届けまでお待ちください。

ショップ名
---------------------------
鈴木 様

ご注文いただきありがとうございます。以下の商品を発送しました。
注文番号: 125
商品: タブレット

お届けまでお待ちください。

ショップ名
---------------------------

解説:
orders には、各顧客の注文情報が辞書形式で格納されています。
for 文を使ってリスト内の各注文データを順番に取り出し、format() 関数でテンプレートにデータを挿入しています。これにより、各顧客に対してカスタマイズされたメールメッセージを自動的に生成できます。

2 . 売上データの自動レポート生成

月ごとの売上データを自動的に整形し、見やすいレポート形式で出力します。

月別売上レポートの自動生成
# 売上データ(例: 年月、部門、売上金額)
sales_data = [
    {"year_month": "2023-01", "department": "営業", "sales": 1234567},
    {"year_month": "2023-01", "department": "マーケティング", "sales": 765432},
    {"year_month": "2023-02", "department": "営業", "sales": 987654},
    {"year_month": "2023-02", "department": "マーケティング", "sales": 543210}
]

# レポートのフォーマットを定義
report_template = """
レポート: {year_month}
部門: {department}
売上金額: ¥{sales:,}円
---------------------------
"""

# レポート自動生成
for record in sales_data:
    report = report_template.format(
        year_month=record["year_month"],
        department=record["department"],
        sales=record["sales"]
    )
    print(report)
出力結果
レポート: 2023-01
部門: 営業
売上金額: ¥1,234,567円
---------------------------

レポート: 2023-01
部門: マーケティング
売上金額: ¥765,432円
---------------------------

レポート: 2023-02
部門: 営業
売上金額: ¥987,654円
---------------------------

レポート: 2023-02
部門: マーケティング
売上金額: ¥543,210円
---------------------------

解説:
sales_data には、各月ごとの部門別売上データが辞書形式で格納されています。
for 文を使って各売上レコードを順番に処理し、format() 関数でテンプレートにデータを挿入しています。
:{,}のフォーマット指定子を使用することで、売上金額にカンマ区切りを追加し、読みやすい形式に整形しています。

3 . 商品リストの自動フォーマット表示

商品リストを表形式で整形し、見やすく表示します。

商品リストのフォーマット表示
products = [
    {"name": "ノートパソコン", "price": 120000},
    {"name": "スマートフォン", "price": 80000},
    {"name": "タブレット", "price": 60000}
]

# ヘッダーの表示
header = "{:<15} {:>10}".format("商品名", "価格 (円)")
print(header)
print("-" * 25)

# 各商品の情報をフォーマットして表示
for product in products:
    line = "{:<15} {:>10,}".format(product["name"], product["price"])
    print(line)
出力結果
商品名               価格 (円)
-------------------------
ノートパソコン          120,000
スマートフォン           80,000
タブレット               60,000

解説:
products には、各商品の名前と価格が辞書形式で格納されています。
・ヘッダー部分をフォーマットして表示し、区切り線を引いています。
for文を使って各商品の情報を取り出し、format()関数で整形しています。
:<15は文字列を左寄せで15文字幅に、>:10,は数値を右寄せで10文字幅にカンマ区切りで表示する指定子です。

今回は、注文や売上のデータを直接記述していますが、CSV データを読み込んで利用することもできます。CSV の操作方は、以下の記事をご覧ください!

まとめ

Pythonのformat()関数は、数値や文字列を様々な書式に変換できます。特に、forと組み合わせて、複数のデータを効率的に処理し、動的なコンテンツを生成できます。この記事を通じて、format()関数の基本から応用までを理解し、実際の業務やプロジェクトで活用できることを目指しました。具体的な例を通じてその利便性を実感していただければ幸いです。

format()関数を積極的に取り入れ、効率的かつ効果的なデータ処理を実現してください!