【Python】文字列に変数を入れて文字列を動的に変更させる(format、f_strings)

時計 2020.12.05 / 時計

【Python】文字列に変数を入れて文字列を動的に変更させる(format、f_strings)

Pythonでは文字列内に変数を埋め込み、変数の値によって文字列を動的に変更させることができます。

ユーザーが指定・入力した値を文字列に組み込みたい場合など、多くの場面で使用する技術です。

本記事では、format()メソッドとf_strings()メソッドを用いた方法を解説していきます。

これらメソッドを使用せずとも、同じそうな動作がPythonでは実現可能ですが、これらメソッドを用いることで、プログラム全体がより可読性に優れたプログラムになります。

サンプルプログラム

例えば以下のようなユーザーにタイトル・数値を入力してもらい、そのタイトルのエクセルファイルを数値分作成するプログラムを見てみましょう。

# sample.py
import openpyxl

title = input('タイトルを入力してください: ')
number = input('作成するエクセルの数を入力してください: ')
for i in range(int(number)):
    wb = openpyxl.Workbook()
    wb.save(title + '_' + i + '.xlsx')

上記のプログラムで問題なく実行することはできます。しかしタイトル名を付ける部分である
wb.save(title + '_' + i + '.xlsx')
をより可読性をよくすることができます。

その方法を解説していきます。

format()メソッド

format()メソッドとは

format()メソッドは、文字列の指定箇所に変数の値を入れる便利なメソッドです。

Python2.7以上から使用可能です。Python2.6以下では使えないので注意してください。
Python2.6以下では%sなど%演算子を使った%記法を使っていました。ここでは%記法の使い方は割愛します。

以下の文法でformat()メソッドは記載します。

    "文字列{}文字列".format(変数)

文法を見てもらうとわかるようにformat()メソッドは穴埋め式となっています。
ここでは波かっこ{}で囲まれた箇所を「置換フィールド」と呼びます。

置換フィールドを文字列に埋め込み、format()メソッドの引数の値を{}と置換します。

以下のように置換フィールドは複数埋め込むことが可能です。
埋め込んだ数の引数をformat()メソッドに持たせる必要があります。

a = "Office"
b = 54
print("文字列{0}文字列{1}".format(a, b))
# 文字列Office文字列54

置換フィールド{}は左から順に変数と対になっています。
このままでも問題ありませんが、インデックスを加えてより可読性を向上させることもできます。

    "文字列{0}文字列{1}文字列{2}".format(変数1, 変数2, 変数3)

ここで注意が必要なのが、インデクスは0から始まることです。

その他にもキーワード引数で指定する方法もあります。

a = "Office"
b = 54
print("文字列{k1}文字列{k2}".format(k1=a, k2=b))    # キーワード引数
# 文字列Office文字列54

書式指定

format()メソッドは文字列内に変数をただ埋め込むだけでなく、埋め込む値の書式を指定することもできます。

    "文字列{0:書式指定}文字列".format(変数)

上記のようにインデックスに続けてコロン:を入れ、その後に書式を指定できます。

小数点以下2桁で表示する場合は「.2f」と指定します。

a = 12.3456
b = 54.321
print("{0:.2f} & {1:.2f}".format(a, b))
# 12.35 & 54.32

3桁ごとにカンマ,で区切りを入れたい場合は、書式にカンマ,を入れるだけで自動的にカンマで区切ってくれます。

a = 123456
b = 654321
print("{0:,.2f} & {1:,.2f}".format(a, b))
# 123,456.00 & 654,321.00

サンプルプログラムに適用

それではサンプルプログラムにformat()メソッドを使用してみましょう。

# sample.py
import openpyxl

title = input('タイトルを入力してください: ')
number = input('作成するエクセルの数を入力してください: ')
for i in range(int(number)):
    wb = openpyxl.Workbook()
    wb.save('{0}_{1}.xlsx').format(title, i)

もとのサンプルプログラムよりもわかりやすくなったと思いませんか?

このようにformat()メソッドを用いることでプログラムの可読性を向上させることができます。

f-strings(f文字列)

f-stringsとは

Python3.6からf-strings(f文字列)という文字列フォーマットの仕組みが導入されました。
前述したformat()メソッドよりも文字列のフォーマットが簡単になりました。

以下の文法でf-stringsは使用します。

    f"文字列{変数1}文字列{変数2}"

f-stringsは、上記からわかるように文字列の前にf文字列またはF文字列を置くだけです。
文字列の中には波かっこ{}を埋め込み、変数を指定します。

format()メソッドとの違いは、先頭にfを付けること、置換フィールド{}に変数を指定することです。
format()メソッドよりf-stringsの方がすっきりしますし簡単ですね。

文字列は一重引用符 (‘)や二重引用符 (“)、三連の一重引用符(”’)、三連の二重引用符(“””)どれでも使えます。

format()メソッドと同様に書式指定もできます。

サンプルプログラムに適用

それではサンプルプログラムにf-strings(f文字列)を使用してみましょう。

# sample.py
import openpyxl

title = input('タイトルを入力してください: ')
number = input('作成するエクセルの数を入力してください: ')
for i in range(int(number)):
    wb = openpyxl.Workbook()
    wb.save(f'{title}_{i}.xlsx')

サンプルプログラムやformat()メソッドよりも短くなり、可読性もよくなったと思います。