まくまくPythonノート
文字列の中で変数を展開する(書式文字列によるフォーマット) (str#format, %演算子)
2019-06-04

Python 3 で文字列の中に変数の値を展開するには、str.format() を使う方法と、% 演算子を使う方法があります。 Python 3 の開発当初は % 演算子を使った方法は deprecated(廃止予定)となっていましたが、今はそのような話はなくなったようです。 % 演算子を使ったほうが簡潔に書けることが多いので、残したいという要望が多かったのでしょうね。

str.format() メソッドを使う方法

文字列の中に {} というプレースホルダを含んでおくと、format メソッドでその位置に値を挿入することができます。

print('I am {}'.format('Maku'))  #=> I am Maku

任意の数のプレースホルダを含むことができます。

print('{}+{}={}'.format(1, 2, 1+2))  #=> 1+2=3

プレースホルダにインデックスを含めると、format のパラメータで指定した値のうちどの場所のパラメータを参照するかを指定できます。

print('{0}+{0}={1}'.format(1, 1*2))  #=> 1+1=2

フォーマット指定いろいろ

小数点以下 5 桁まで表示(四捨五入)

print('{:.5f}'.format(1.23456789))  #=> 1.23457

小数点以下を四捨五入

print('{:.0f}'.format(1.50))  #=> 2

3ケタごとにカンマを入れる

print('{:,}'.format(1234567890))  #=> 1,234,567,890

2進数表記/8進数表記/16進数表記

print('{:b}'.format(255))  #=> 11111111
print('{:o}'.format(255))  #=> 377
print('{:x}'.format(255))  #=> ff
print('{:X}'.format(255))  #=> FF

左寄せ/右寄せ/中央寄せ

print('{:10}'.format(123))     #=> '      123'
print('{:<10}'.format(123))    #=> '123      '
print('{:>10}'.format(123))    #=> '      123'
print('{:^10}'.format(123))    #=> '   123   '
print('{:10}'.format('ABC'))   #=> 'ABC      '
print('{:<10}'.format('ABC'))  #=> 'ABC      '
print('{:>10}'.format('ABC'))  #=> '      ABC'
print('{:^10}'.format('ABC'))  #=> '   ABC   '

数値はデフォルトで右寄せ、文字列はデフォルトで左寄せになります。

0 パディング

print('{}-{:02}-{:02}'.format(2019, 5, 7))  #=> 2019-05-07
print('{:08b}'.format(127))   #=> 01111111
print('{:08x}'.format(127))   #=> 0000007f
print('{:<08x}'.format(127))  #=> 7f000000

名前付き引数

print('{hour:02}時{min:02}分{sec:02}秒'.format(hour=23, min=45, sec=0))  #=> 23時45分00秒

%演算子を使用する方法

文字列に対して % 演算子を使用すると、C 言語の printf 的なフォーマットで値の展開を行うことができます。

print('I am %s' % 'Maku')  #=> I am Maku

複数の値を展開するときは、% の右側にタプルで指定します。

print('%d + %d = %d' % (1, 2, 1+2))  #=> 1 + 2 = 3

フォーマット指定いろいろ

小数点以下 5 桁まで表示(四捨五入)

print('%.5f' % 1.23456789)  #=> 1.23457

桁数の指定をパラメータにすることもできます。

print('%.*f' % (5, 1.23456789))  #=> 1.23457

小数点以下を四捨五入

print('%.f' % 1.50)  #=> 2

0 パディング

print('%d-%02d-%02d' % (2019, 5, 7))  #=> 2019-05-07
print('%08x' % 127)  #=> 0000007f

右寄せ/左寄せ

print('%10d' % 123)     #=> '       123'
print('%10s' % 'ABC')   #=> '       ABC'
print('%-10d' % 123)    #=> '123       '
print('%-10s' % 'ABC')  #=> 'ABC       '

数値も文字列もデフォルトで右寄せになります。

名前付き引数

print('%(year)d-%(month)02d-%(day)02d' % {'year':2019, 'month':5, 'day':7})  #=> 2019-05-07
2019-06-04