はじめに

文字列はうまく扱えていますか?

プログラムでは、ユーザーインターフェースへの表示などで文字列を扱うことが少なくありません。
また、デバッグ時に必要な情報を得るためにも、文字列に頼ることが多いでしょう。

このため、変数などを適切な文字列に整形する必要があります。

多くの場合、そのまま変数を出力ことは適切ではないからです。
そのため、Pythonでは文字列クラス(str)に「formatメソッド」が用意されています。

この記事では、Python初心者の方向けに、formatメソッドによる文字列の整形について詳しくお伝えしていきます。

ひとつの引数を与える場合

まずは、シンプルにひとつの引数のみを与える場合をみてみましょう。

formatメソッドは文字列クラス(str)のインスタンスメソッドとして定義されているため、次のように文字列リテラル(インスタンス)から直接呼び出せます。

例:

s = "format"
print("hello, {}!".format(s))

 

引数がひとつの場合、文字列内にプレースホルダとして「{}」を記述します。

そして、文字列に埋め込みたい変数を引数に渡してやれば、プレースホルダの位置に変数の内容が埋め込まれた文字列が得られます。

次は、複数の引数を渡す場合です。

複数の引数を与える場合

変数ひとつだけなら、文字列連結で解決することもできます。

しかし、複数の変数となると、文字列連結ではわかりづらくなってしまいます。

ここは美しく、formatメソッドで解決しましょう。

それには、次のようにします。

例:

name = "Taro"
age = 17
sex = "Male"
print("name: {0}, age: {1}, sex:
{2}".format(name, age, sex))

 

先程の例とは違い、複数の引数を渡す場合にはプレースホルダにインデックスを記述します。

インデックスが0から始まることに注意して下さい。

一番目の引数が0、二番目が1三番目が3、4番目が…と続きます。

また、次のようにキーワード(名前)で指定することも可能です。

例:

name = "Taro"
age = 17
sex = "Male"
print("name: {name}, age: {age}, sex:
{sex}".format(name=name, age=age, sex=sex))

 

引数にリストやタプルなどを与える場合

formatメソッドには、単一の値だけでなく、リストやタプルなどを与えることもできます。

たとえば、次のようにします。

例:

foods = ["egg", "tomato", "bacon"]
print("{0[0]}, {0[1]} and
{0[2]}".format(foods))
student = ("Taro", 17, "Male")
print("name: {0[0]}, age: {0[1]}, sex:
{0[2]}".format(student))

 

リストやタプルを渡す場合には、プレースホルダ内に引数のインデックスに加え、リストやタプルのインデックスを記述します。

お気付きの通り、引数のインデックスも記述するため、複数のリストやタプルを渡すことも可能です。

また、次のようにディクショナリを渡すこともできます。

例:

student ={"name": "Taro", "age": 17, "sex": "Male"}
print("name: {name}, age: {age}, sex: {sex}".format(**student))

 

キーワードで指定する場合と似ていますが、ディクショナリを引数に渡すときに「**」をつけてアンパック(複数の引数に分解)してやる必要があることに注意しましょう。

引数に書式設定を加える

最後に、引数の書式設定を加える方法について説明していきます。

書式設定は、次のようにプレースホルダ内に記述します。

例:

students =[
      {"name":"Taro", "age":17, "sex":"Male"},
      {"name":"Hnako", "age":18, "sex":"Famale"},
      {"name":"Takeshi", "age":17, "sex":"Male"},
]
print("{0:^10}|{1:^3}|{2:^6}".format("NAME", "AGE", "SEX"))
for student in students:
     print("{name:<10}|{age:>3}|{sex:<6}".format(**student))

 

書式設定は、インデックスの後に「:(コロン)」で区切って記述します。

記号と数値で構成されており、「^(中央揃え)」「<(左揃え)」「>(右揃え)」と文字列が専有する幅を数値で指定します。

適切な幅を指定すれば、例のようにテーブルのように整形することも可能です。

また、よく使う書式設定として、次のような日付のフォーマット指定にも対応しています。

例:

from datetime import *
print("現在の日時は{0:%Y/%m/%D %H:%M:%S}です".format(datetime.now()))

 

日付の書式設定は、パーセント記号(%)とアルファベットを組み合わせて記述します。

それぞれ英単語の頭文字になっているのでわかりやすいですが、月は「m」分は「M」であることに注意して下さい。

ここではよく使う書式設定を説明してきました。

他にも進数の変換など、さまざまな書式設定があるので、書式設定に困ったら公式ドキュメントを調べてみましょう。

まとめ

文字列をうまく整形できるようになりましたか?

formatメソッドは非常に自由度が高く、変数をさまざまな形に整形できます。

単一の値だけでなく、リストやタプル、ディクショナリも扱えるため、積極的に活用していきましょう。