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文字列として扱ってしまうことである。