書式化演算子%を使った文字列の書式設定(printf形式の書式化)

書式化演算子の % を使用することで数値や文字列に対して書式を設定し新しい文字列を作成することができます。(他のプログラミング言語で使用されている printf 形式での書式化となります)。ここでは書式化演算子%を使って文字列の書式設定を行う方法について解説します。

※ 書式化演算子の % を使った方法はかなり以前に使われていたもので、現在は文字列型の format メソッドを使った方法やフォーマット済み文字列リテラルを利用する方法が主流となっています。詳しくは「formatメソッドを使った文字列の書式設定」および「フォーマット済み文字列リテラル(f文字列)を使った文字列の書式設定」を参照されてください。

(Last modified: )

書式化演算子 % を使った書式化でできること

まず最初に書式化を行うことでどのようなことができるのかを確認しておきます。

最初に数値に対する書式化の例です。

num1 = 30
result = "10進数では %d 、16進数では %x です" % (num1, num1)
print(result)

>> 10進数では 30 、16進数では 1e です

この例では数値が入った変数をそれぞれ 10 進数と 16 進数に変換し、変換した値をベースとなる文字列の指定した位置に挿入した新しい文字列を作成しています。

次に文字列に対する書式化の例です。

def mypoint(str1, num1):
    result = "My name is %-10s, point is %5d." % (str1, num1)
    print(result)

mypoint("Yamada", 75)
>> My name is Yamada    , point is    75.

mypoint("Sugiyama",1825)
>> My name is Sugiyama  , point is  1825.

今度の例では文字列と数値の桁数をそれぞれ指定し、文字列については左詰め、数値については右詰めにした新しい文字列を作成しています。

なお今回の 2 つの例では分かりやすいようにいったん新しい文字列を作成してから print 関数で出力していますが、書式化された文字列は print 関数で出力する時にだけ使用されることが多いので print 関数の中で記述されることが多いです。

num1 = 30
print("10進数では %d 、16進数では %x です" % (num1, num1))

>> 10進数では 30 、16進数では 1e です

変換指定子と変換する値の記述方法

書式を指定して新しい文字列を作成するには次のような形式となります。

変換指定子を含む文字列 % 値
変換指定子を含む文字列 % (値1, 値2, ...)

まず変換指定子を含む文字列についてです。例えば次のような文字列を例に考えてみます。

"名前はxxです。年齢はyy歳です。"

この文字列の名前の部分(xx)と年齢の部分(yy)に書式化を行った値を挿入した新しい文字列を作成したい場合、この xx と yy の部分にどのように値を書式化するのかを表す % で始まる変換指定子を指定します。今回は次のように %-8s と %03d をそれぞれ指定しました。

"名前は%-8sです。年齢は%03d歳です。"

次に書式化を行う値を指定します。今回変換指定子を文字列の中に 2 つ記述しましたので、変換する値も 2 つ記述する必要があります。値は文字列のあとに % を記述したあと、 (値1, 値2) のようにタプルオブジェクトとして指定します。タプルには変換指定子が記述された順番通りに要素として値を追加します。

"名前は%-8sです。年齢は%03d歳です。" % ("Suzuki", 18)

なお変換指定子が 1 つの場合、値も 1 つとなります。この場合はタプルではなく値だけを記述することができます。

"名前は%-8sです。" % "Suzuki"

これで最初の値 "Suzuki" が変換指定子 %-8s によって変換されて文字列の中に挿入され、次の値 10 が変換指定子 %03d によって変換された文字列の中に挿入されます。

次のサンプルを見てください。

name = "Suzuki"
old = 18
print("名前は%-8sです。年齢は%03d歳です。" % (name, old))

>> 名前はSuzuki  です。年齢は018歳です。

では変換指定子の指定方法について詳しくみていきます。

変換指定子の指定方法

変換指定子は次のように記述します。

% (マップキー) 変換フラグ 最小フィールド幅 精度 精度長変換子 変換型

変換指定子は % から始まり、(1)マップキー、(2)変換フラグ、(3)最小フィールド幅、(4)精度、(5)精度長変換子、(6)変換型、をそれぞれ指定します。この中で必須の項目は(6)変換型だけで、(1)から(5)はオプションです。

変換型

それでは最初に必須の項目である変換型からみていきます。変換型は次の値が用意されています。

"d" 符号付き 10 進整数
"i" 符号付き 10 進整数
"o" 符号付き 8 進数
"u" 旧式の型 -- 'd' と同じです
"x" 符号付き 16 進数 (小文字)
"X" 符号付き 16 進数 (大文字)
"e" 指数表記の浮動小数点数 (小文字)
"E" 指数表記の浮動小数点数 (大文字)
"f" 10 進浮動小数点数
"F" 10 進浮動小数点数
"g" 浮動小数点数。指数部が -4 以上または精度以下の場合には小文字指数表記、それ以外の場合には10進表記
"G" 浮動小数点数。指数部が -4 以上または精度以下の場合には大文字指数表記、それ以外の場合には10進表記
"c" 文字一文字 (整数または一文字からなる文字列を受理します)
"r" 文字列 (Python オブジェクトを repr() で変換します)
"s" 文字列 (Python オブジェクトを str() で変換します)
"a" 文字列 (Python オブジェクトを ascii() で変換します)
"%" 引数を変換せず、返される文字列中では文字 '%' になります

例えば数値の値を 10 進数に変換するには %d と記述し 16 進数に変換するには %x と記述します。

print("10進数=%d, 16進数=%x" % (20, 20))

>> 10進数=20, 16進数=14

また小数点を含む数値の値を指数表記に変換するには %e と記述し 10 進数の浮動小数点数(実際には固定小数点表記と思われる)に変換するには %f と記述します。

print("指数表記=%e, 固定小数点表記=%f" % (0.0752, 0.0752))

>> 指数表記=7.520000e-02, 固定小数点表記=0.075200

マップキー

次にマップキーです。マップキーは省略可能なオプションで、値を指定する時にタプルではなく辞書などのマップ型オブジェクトを使用する場合に使います。マップキーは () で囲って指定します。

次の例をみてください。 2 つの変換指定子にそれぞれ (decum) と (hexnum) というマップキーを指定しています。そして値を指定する時にタプルではなく辞書を使い、辞書の要素毎にキーには変換指定子に指定したマップキーを七指定し、値には変換指定子に渡す値を指定します。

print("10進数=%(decnum)d, 16進数=%(hexnum)x" % {"hexnum":20, "decnum":20})

>> 10進数=20, 16進数=14

辞書の要素には順序という概念がありませんので、要素はどのような順に記述されていても構いません。

変換フラグ

次に変換フラグです。変換フラグも省略可能なオプションで、次の値が用意されています。

"#" 値の変換に"別の形式" を使う
"0" 数値型に対してゼロパディングを行う
"-" 変換された値を左寄せにする
" " 符号付きの変換で正の数の場合、前に一つスペースを空ける。そうでない場合は空文字になる
"+" 変換の先頭に符号文字 ('+' または '-') を付ける

変換フラグに "#" を指定した場合、変換型として "o" を指定すると 8 進数を表す接頭辞 ('0o') が最初の数字の前に挿入されます。また "x" を指定すると 16 進数を表す接頭辞 '0x' が最初の数字の前に挿入され、 "X" を指定すると 16 進数を表す接頭辞 '0X' が最初の数字の前に挿入されます。

print("数値1=%x, 数値2=%#x" % (30, 30))

>> 数値1=1e, 数値2=0x1e

変換フラグに "0" を指定した場合、後で解説する最小フィールド幅よりも数値の桁数が小さかった場合に 0 で埋められます。この変換フラグを指定していない場合は空白で埋められます。

print("数値1=%5d, 数値2=%05d" % (30, 30))

>> 数値1=   30, 数値2=00030

変換フラグに "-" を指定した場合、後で解説する最小フィールド幅よりも値の桁数が小さかった場合に左寄せで表示します。この変換フラグを指定していない場合は右寄せで表示します。(左寄せなのが分かるように下記では括弧[]を付けて表示しています)。

print("数値1=[%5d], 数値2=[%-5d]" % (30, 30))

>> 数値1=[   30], 数値2=[30   ]

変換フラグに " " を指定した場合、正の数の場合だけ数値の前に空白を 1 文字分空けます。

print("数値1=%d, 数値2=%d, 数値3=% d, 数値4=% d" % (30, -30, 30, -30))

>> 数値1=30, 数値2=-30, 数値3= 30, 数値4=-30

変換フラグに "+" を指定した場合、数値の先頭に "+" または "-" を付けます。

print("数値1=%+d, 数値2=%+d" % (30, -30))

>> 数値1=+30, 数値2=-30

最小フィールド幅

次に最小フィールド幅です。最小フィールド幅も省略可能なオプションで、少なくとも確保される桁数を指定します。例えば数値や文字列が 3 桁で、最小フィールド幅が 5 だった場合には、 5 桁の場所に 3 桁の数値や文字列を表示します。デフォルトでは右寄せで表示され、空いている部分は空白が表示されますが変換フラグを指定することで左寄せにしたり 0 で埋めたりすることができます。また最小フィールド幅よりも値が大きい桁数だった場合はそのまま表示されます。

print("数値1=%d, 数値2=%4d, 数値3=%4d" % (30, 30, 72536))

>> 数値1=30, 数値2=  30, 数値3=72536

なお最小フィールド幅に "*" を指定した場合、最小フィールド幅を値の方で指定することができます。この場合、最初に最小フィールド幅を指定してから実際の値を指定します。次の例を参考にしてください。

print("数値1=%d, 数値2=%*d" % (18, 5, 42))

>> 数値1=18, 数値2=   42

変換指定子は 2 つですが、値の方は 3 つ指定しています。最初の値は最初の変換指定子で変換する値。 2 つ目の値は 2 つ目の変換指定子の最小フィールド幅。 3 つ目の値は 2 つ目の変換指定子で変換する値です。最小フィールド幅の方から先に値を記述する点に注意してください。

精度/精度長変換子

最後に精度です。精度も省略可能なオプションで、小数部分の精度(桁数)を指定します。デフォルトでは 6 桁となります。指定する場合はドット(.)のあとに桁数を指定してください。

print("数値1=%f, 数値2=%.3f" % (1/3, 1/3))

>> 数値1=0.333333, 数値2=0.333

なお精度に "*" を指定した場合、精度を値の方で指定することができます。この場合、最初に精度を指定してから実際の値を指定します。次の例を参考にしてください。

print("数値1=%f, 数値2=%.*f" % (1/3, 3, 1/3))

>> 数値1=0.333333, 数値2=0.333

変換指定子は 2 つですが、値の方は 3 つ指定しています。最初の値は最初の変換指定子で変換する値。 2 つ目の値は 2 つ目の変換指定子の精度。 3 つ目の値は 2 つ目の変換指定子で変換する値です。精度の方から先に値を記述する点に注意してください。

精度長変換子については現時点では Python で使用されません。

-- --

書式化演算子%を使って指定した書式で新しい文字列を作成する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。