Pythonのstr.formatで文字列の書式を決める

この記事では、文字列の書式をstr.formatを使って設定する方法を説明します。

文字列の幅や桁を揃えることでログが見やすくなるので、テクニックを取得しましょう。

書式指定文字列の文法のサイトです。

str.formatの基本

文字列.formatで文字列の書式操作を行います。

この文字列部分は、通常の文字と{}で区切られた置換フィールドで構成されます。

print('{0} {1} {2} {3}'.format('a', 'b', 1, 2))
# a b 1 2
# 置換フィールドは位置引数のインデックスナンバーで指定できる。

print('{0} {1} {0} {1}'.format('a', 'b', 1, 2))
# a b a b
# 置換フィールドは位置引数のインデックスナンバーで指定できる。


print('{0} {1} {2} {3} {4}'.format('a', 'b', 1, 2))
# IndexError: Replacement index 4 out of range for positional args tuple
# 置換フィールドの数に対して、引数の数が足りない場合はエラーになる。

print('{} {} {} {}'.format('a', 'b', 1, 2))
# a b 1 2
# 置換フィールドの数字は省略できる。

書式の指定方法

左詰め・右詰め・中央寄せ

アライメントの指定方法と、何かの文字で埋める方法です。

print('|{:<20}|'.format('left'))
# |left                |
# <:左詰め

print('|{:>20}|'.format('right'))
# |               right|
# >:右詰め

print('|{:^20}|'.format('center'))
# |       center       |
# ^:中央寄せ

print('|{:-^20}|'.format('center'))
# |-------center-------|
# "-"で埋める。

print('|{:*^20}|'.format('center'))
# |*******center*******|
# "*"で埋める。

上のコードの左右の”|“は見やすくするためのもので、オプションではありません。

符号

正数・負数に対する符号の付け方の指定です。

print('|{:+}|{:+}|{:+}|'.format(100, -100, 0))
# |+100|-100|+0|
# +:正数・負数の両方に符号を付ける。

print('|{:-}|{:-}|{:-}|'.format(100, -100, 0))
# |100|-100|0|
# -:負数にのみ符号を付ける。

print('|{: }|{: }|{: }|'.format(100, -100, 0))
#| 100|-100| 0|
# スペース:負数にのみ符号を付け、正数の前に空白を付ける。

1000の位の桁区切り

1000の位で桁区切りのカンマを付ける方法です。

print('{:,}'.format(987654321))
# 987,654,321

小数点以下の桁数

小数点以下の桁数と文字列の幅の決め方です。

print('{:10.2f}'.format(4444.4444))
print('{:10.2f}'.format(5555.5555))
#    4444.44
#    5555.56
# 指定桁数以降は四捨五入される。

print('{:10.0f}'.format(4444.4444))
print('{:10.0f}'.format(5555.5555))
#       4444
#       5556
# 整数部分のみの表示も可能。

print('{:10,.2f}'.format(5555.5555))
#   5,555.56
# 1000の桁のカンマ区切りも併用可能。

パーセント表示

print('{:.2%}'.format(0.555555))
# 55.56%

print('{:.2f}%'.format(0.555555 * 100))
# 55.56%
# %を使わなくても同じことができる。

10進数・8進数・16進数・2進数

メモリのアドレスを表示させてデバッグされる方は16進数を使うこともあると思います。

for num in range(7, 18):
    print('dec:{0:2d} oct:{0:2o} hex:{0:2x} HEX:{0:2X} bin:{0:06b}'.format(num))

# dec: 7 oct: 7 hex: 7 HEX: 7 bin:000111
# dec: 8 oct:10 hex: 8 HEX: 8 bin:001000
# dec: 9 oct:11 hex: 9 HEX: 9 bin:001001
# dec:10 oct:12 hex: a HEX: A bin:001010
# dec:11 oct:13 hex: b HEX: B bin:001011
# dec:12 oct:14 hex: c HEX: C bin:001100
# dec:13 oct:15 hex: d HEX: D bin:001101
# dec:14 oct:16 hex: e HEX: E bin:001110
# dec:15 oct:17 hex: f HEX: F bin:001111
# dec:16 oct:20 hex:10 HEX:10 bin:010000
# dec:17 oct:21 hex:11 HEX:11 bin:010001

指数表記

print('{:e}'.format(0.001))
# 1.000000e-03

print('{:e}'.format(0.1**10))
# 1.000000e-10

print('{:e}'.format(1000))
# 1.000000e+03

print('{:e}'.format(10**10))
# 1.000000e+10

print('{:E}'.format(0.001))
# 1.000000E-03
# 大文字のEも使える。

他にも書式操作方法はありますが、上記を覚えておけば問題ないと思います。