format関数による文字列の操作

文字列の中に変数を挿入したい場面は多い。
例えば、ファイルパスを生成する時である。

文字列の中に変数を挿入する方法は何種類かあるのだが、個人的にはformat関数が読みやすいのでよく使用する。

サンプルコード

def exp_format_func(save_dir, file_num):
    save_path = r"{0}\file_num_{1}.txt".format(
        save_dir,
        file_num
    )
    return save_path

def study_format_func():
    save_dir = r"C:\Documents\save"
    for file_num in range(5):
        path = exp_format_func(save_dir, file_num)
        print(path)

if __name__ == "__main__":
    study_format_func()

実行結果

C:\Documents\save\file_num_0.txt
C:\Documents\save\file_num_1.txt
C:\Documents\save\file_num_2.txt
C:\Documents\save\file_num_3.txt
C:\Documents\save\file_num_4.txt

簡単な解説

記述方法

まず、ベースとなる文字列の任意の位置に{}を挿入しておく。
この挿入した{}を置換フィールドと呼ぶ。
置換フィールドには{0}, {1} のようにインデックスをつけることができる。
インデックスを省略した場合は、先頭から 0, 1, 2... と割り当てられてる。

次に、ベースとなる文字列に続けて.format(引数)を記述する。
format関数の第1引数に渡した値は、置換フィールドの{0}に代入される。
format関数の第2引数に渡した値は、置換フィールドの{1}に代入される。
...
format関数の第x引数に渡した値は、置換フィールドの{x-1}に代入される。


エスケープシーケンス文字に関する補足

問い:
サンプルコード内で "(文字列を示すダブルクォーテーション)の前にあるrは何か?

答え:
その文字列が raw文字列 の形式であることを示すもの。
raw文字列とは、すべての文字をそのままの状態で扱うということである。

問い:
そのままの状態で扱わない文字なんてあるのか?

答え:
エスケープシーケンスと呼ばれる、\(バックスラッシュ)と特定の文字を組み合わせて特殊な意味をもたせる仕組みがある。

Pythonのエスケープシーケンス(抜粋)

エスケープシーケンス 意味
\\ バックスラッシュ \
\' 一重引用符 '
\" 二重引用符 "
\a ASCII 端末ベル BEL
\b ASCII バックスペース BS
\f ASCII フォームフィード FF
\n ASCII 行送り LF
\r ASCII 復帰 CR
\t ASCII 水平タブ TAB
\v ASCII 垂直タブ VT

そして、都合の悪いことにWindowsのファイルパスはフォルダの階層が\で表現される。
これにより、フォルダ・ファイル名との組み合わせによって意図しないエスケープシーケンスが発生する場合がある。
サンプルコードで言えば、C:\Documents\save\file_num_0.txtの中程にある\fがそれに当たる。

意図しないエスケープシーケンス文字の発生を回避する方法はいくつかあるが、お手軽な方法はraw文字列として扱ってしまうことである。