連載
» 2019年04月23日 05時00分 公開

Python入門:[Python入門]文字列の書式指定 (1/4)

文字列中で値を0埋めするなどの書式指定を行う方法をformatメソッドを中心に説明する。f文字列や以前の形式の書式指定についても取り上げる。

[かわさきしんじ,Deep Insider編集部]
「Python入門」のインデックス

連載目次

 前回は、Pythonの文字列をさまざまに操作するメソッドを見た。それらのメソッドの中には、元の文字列の一部を書き換えた結果を反映する「新しい文字列」を作成するメソッドが多数あった。今回紹介するformatメソッドもそうしたメソッドの1つで、「文字列の書式指定」と呼ばれる処理を行うものだ。

書式指定とは:formatメソッド

 ユーザーにメッセージを表示するときなどには、変数の値や何らかの計算の結果をそこに含めることがよくある。そのときには定型的な文字列のひな型(これを「書式指定文字列」と呼ぶ)を用意しておき、そこにそれらの値を埋め込むことができる。これを行うのが文字列のformatメソッドだ。

Pythonでの文字列の書式指定 Pythonでの文字列の書式指定

 formatメソッドの呼び出し方は前回に取り上げたメソッドと同様、以下のようになる。

formatメソッド

'書式指定文字列'.format(*args)

formatメソッドの構文

 '書式指定文字列'と引数群(*args)を基に、新たな文字列を作成して返す。

引数/戻り値 説明
*args 書式指定文字列に埋め込む値を順番に、あるいは「置換フィールド名=その値」のような形式で指定(複数ある時にはカンマで区切る)
戻り値 書式指定文字列'に記述されている書式指定に従って、「引数群」に指定した値(数値、文字列など)を埋め込んだ新しい文字列
formatメソッドの引数と戻り値


 formatメソッドの引数には書式指定文字列に埋め込む値を順番に、あるいは「置換フィールド名=その値」のような形式で指定する。戻り値は'書式指定文字列'に記述されている書式指定に従って、「引数群」に指定した値(数値、文字列など)を埋め込んだものだ(元の文字列はそのまま維持されることにも注意しよう)。

 この書式指定文字列は、通常の文字列の部分と「置換フィールド」と呼ばれる、実際に値が埋め込まれる部分の2種類で構成される。

置換フィールド

 '書式指定文字列'で値を埋め込みたい部分は波かっこ「{}」で示す。この「{}」のことを「置換フィールド」と呼ぶ。置換フィールドに埋め込む値はformatメソッドの引数として渡す。書式指定文字列に引数の値を埋め込んだものが、formatメソッドの戻り値となる。なお、'書式指定文字列'に波かっこ「{}」を含めるには「{{」または「}}」のように波かっこを重ねて表記する。

 例えば、2つの変数xとyの加算結果を書式指定文字列に埋め込みたいとしよう。このとき、書式指定文字列は次のように書ける(formatメソッドの引数については後述)。

'x + y = {}'.format(……)

置換フィールド「{}」を含む、書式指定文字列

 この書式指定文字列の「x + y = 」という部分が上で述べた「通常の文字列の部分」(変更されることがない部分)であり、その隣にある「{}」(置換フィールド)に計算結果が埋め込まれる。この書式指定文字列に対してformatメソッドを呼び出して、その引数(上の「……」の部分)に「変数xとyを加算する式」を書けば、その結果が「{}」に埋め込まれるというわけだ。これを行う実際のコードは次のようになる。

x = 1
y = 100
result = 'x + y = {}'.format(x + y)
print(result)

はじめての書式指定文字列

 実行結果を以下に示す。

置換フィールドに変数xとyの加算結果が埋め込まれた 置換フィールドに変数xとyの加算結果が埋め込まれた

 これがformatメソッドを使った文字列の書式設定の基本形となる。

 次に、変数xとyの値も埋め込んでみよう。これにもやはり置換フィールドの「{}」を使用する。このとき、書式指定文字列は「'{} + {} = {}'」のように書ける。そして、formatメソッドには変数xとy、その加算式を埋め込みたい順に渡せばよい。

x = 1
y = 100
result = '{} + {} = {}'.format(x, y, x + y)
print(result)

置換フィールドが複数ある場合には、それらに埋め込む順番にformatメソッドに引数を渡す

 置換フィールドが複数あるときには、formatメソッドに渡された順番に、それらが置換フィールドに埋め込まれる。

今度は変数xとyの値も置換フィールドに埋め込まれるようになった 今度は変数xとyの値も置換フィールドに埋め込まれるようになった

置換フィールドに番号や名前を付ける

 置換フィールドには、formatメソッドに渡された引数の順番を表す数値を含めることが可能だ(0始まり)。以下に例を示す(実行結果は上と変わらないので省略する)。

x = 1
y = 100
result = '{1} + {2} = {0}'.format(x + y, x, y)
print(result)

formatメソッドに渡された引数を置換フィールドに埋め込む順番を指定

 この例では、formatメソッドには「x + y」「x」「y」の順番で値を渡している。そのため、「x + y」の計算結果を表示するべき最後の置換フィールドにformatメソッドの最初の引数であることを表す「0」を含めている(他の2つの置換フィールドも同様)。

置換フィールドに書いた番号(引数名)と、formatメソッドに渡す引数の関係 置換フィールドに書いた番号(引数名)と、formatメソッドに渡す引数の関係

 さらに、置換フィールドには「名前」を付けることも可能だ(実際には上で見た番号も扱いは同じである)。これには「{}」内にそのフィールドの名前を含めればよい。例えば、最初の置換フィールドに「x」と、次の置換フィールドに「y」と、最後の置換フィールドに「add_result」という名前を付けてみよう。

'{x} + {y} = {add_result}'

置換フィールドに名前を付けた

 置換フィールドに名前を付けたときには、formatメソッドには「フィールド名=その値」という形式でデータを渡していく。この場合は「x=……」「y=……」「add_result=……」をカンマで区切って渡す。よって、formatメソッド呼び出し全体は次のようになる(実行結果はこれまで通りなので省略する)。

x = 1
y = 100
result = '{x} + {y} = {add_result}'.format(add_result=x+y, x=x, y=y)
print(result)

置換フィールドに名前を付けたコードにformatメソッドで引数を渡す

 フィールドに名前が付いているので、formatメソッドに渡す値の順番は自由だ。

辞書を引数としてformatメソッドを呼び出す

 フィールドに番号や名前を付けた場合、Pythonの「辞書」と呼ばれるデータ構造を使って、formatメソッドにそれらのフィールドの値を渡すこともできる。辞書については以降の回で詳しく取り上げるが、ここでは「キーと値の対で表されるデータをまとめたもの」と考えてほしい。

 辞書は波かっこ「{}」に囲んで、「キー: 値」の対をカンマで区切って並べていく。以下に例を示す。ここではキーと値はいずれも文字列となっているが、他の型のデータ(例えば、整数値)でもキーや値に使用できる(実際には制約もあるが、これについては辞書を詳しく取り上げる際に説明しよう)。

svo = {'subject': '私の名前は', 'verb': 'です', 'obj': '中野'}

キーに'subject'と'verb'と'obj'を持つ辞書

 辞書の値を取り出すには、前回の「文字列の要素を取得する:インデックス指定」で紹介した波かっこ「[]」にインデックスを指定するのと似た書き方をする。ただし、文字列の要素の取り出しではインデックスとして整数値を指定したが、ここでは「キー」を指定する。これにより、そのキーと対になる「値」が取り出せる。ここではキーは文字列なので、シングルクオートで囲んでいる。

svo = {'subject': '私の名前は', 'verb': 'です', 'obj': '中野'}
print(svo['subject'] + svo['obj'] + svo['verb'])

辞書から値を取り出して出力

 print関数にそのまま値を渡すのなら、上のようにすればよいだけだ。だが、ここでは書式指定文字列を話題にしているので、書式指定文字列の置換フィールドでの値の取り出し方を見てみよう。基本的には、上で紹介したものと同じだ。ただし、上では文字列キーをシングルクオート(またはダブルクオートなど)で囲んだが、置換フィールド内ではその必要はない。すなわち、「{置換フィールドの番号や名前[subject]}」のような書き方をすればよい。このときには、フィールドに番号か名前を割り当てる必要があることには注意しよう。

 従って、書式指定文字列に辞書の値を埋め込むコードは次のようになる。以下ではフィールドに「0」という番号を割り当てている。formatメソッドには0番目の引数として変数svoを渡している。置換フィールドでは番号に続けて今述べたように各かっこ「[]」内に辞書のキーを指定している(全ての置換フィールドで0番目の引数である辞書を使用するので、全てのフィールドで番号が「0」になっている点にも注意)。

svo = {'subject': '私の名前は', 'verb': 'です', 'object': '中野'}
result = '{0[subject]}{0[object]}{0[verb]}'.format(svo)
print(result)

formatメソッドに辞書を使って、表示する値を渡すコード

 実行結果を以下に示す。

実行結果 実行結果

 置換フィールドに名前を付けるのであれば、次のようなコードになる(実行結果は省略)。

svo = {'subject': '私の名前は', 'verb': 'です', 'object': '中野'}
result = '{svo[subject]}{svo[object]}{svo[verb]}'.format(svo=svo)
print(result)

formatメソッドに辞書を使って、表示する値を渡すコード

 表示結果を組み立てるために、複数のデータを辞書にまとめるというよりは、辞書の形でさまざまなデータをひとまとめにして扱った後に、それらを画面に出力するといった場合には、こうした使い方をすることになるだろう。

 置換フィールドでは、表示幅の指定や、右寄せ/左寄せなどの指定を行うことも可能だ。次にその方法について見ていこう(置換フィールドに続けて「!s」「!r」「!a」を記述できる。これらは順にPythonに組み込みの「str関数」「repr関数」「ascii関数」を呼び出して、置換フィールドに埋め込む値の文字列化を行うものだが、これらについては本稿では説明を省略する)。

       1|2|3|4 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。