【Python】formatを用いた書式設定の基本

str.format()は文字列の書式を設定することができます。例えば、

  • 小数点以下の桁数を3桁にしたい
  • 文字列を右詰めして、空いた左側は*で埋めたい
  • 10進数を2進数に変換して表示したい
  • 数値を3桁毎にカンマ(,)で区切りたい

本記事では、str.format()の使い方と併せて、書式設定の書き方を具体例を中心にまとめます。
尚、書式設定のみをはやく知りたい!と言う場合はコチラにSkipください!
# 2020/1/26 記事更新

確認した環境

  • OS: Ubuntu16.04LTS
  • Python 3.7.4

str.format()の基本的な使い方

str.format() は文字列のメソッドで、以下の書式で用いられます。

str.format(*args, **kwargs)

ここで、文字列str置換フィールドを含めることができます。
置換フィールドは{ }で囲われ、format()の引数が代入されます。
また、次項に述べるように書式設定もここに記述します。

>>> a = "Hibikisan"
>>> b = 10
>>> c = "カレーライス"
>>> "{0}は{1}時に{2}を食べた".format(a, b, c)
'Hibikisanは10時にカレーライスを食べた'

置換フィールド{ }の構成

置換フィールドは下記の通りfield_nameformat_specで構成されます。

field_nameの設定方法

field_nameは、その置換フィールドがどの引数に対応しているかを表すもので、

  • 数値(位置引数のインデックス)、または
  • キーワード

を設定します。

  • field_nameが数値の場合
  • 下記の様に、そのインデックスに一致する位置引数を参照します。

    >>> a = "A"
    >>> b = "B"
    >>> c = "C"
    
    >>> "{2} - {0} - {1}".format(a, b, c)
    'C - A - B'

    インデックスを省略すると左から順番に引数が割り当てられます。

    >>> "{} - {} - {}".format(a, b, c)
    'A - B - C'
  • field_nameがキーワードの場合
  • 下記の通り指定されたキーワード引数を参照します。

    >>> '{n3} - {n2} - {n1}'.format(n1 = a, n2 = b, n3 = c)
    'C - B - A'

format_specの設定方法

format_specには以下のフォーマットで文字列の書式を設定します。

※各パラメータそれぞれの詳細はコチラ

末尾のパラメータtypeは文字種別を表しています。主な設定値は下記参照。

type 文字種別
d 整数(10進数)
f 浮動小数点
s 文字列
b/o/x 2進数、8進数、16進数

以下の章では、これらそれぞれの書式設定について、具体例を挙げながら示します。

参考)公式リファレンス:string — 一般的な文字列操作 | 書式指定ミニ言語仕様

整数(10進数)の書式設定

整数(10進数)はtype=’d’に設定します。その他の書式は下記の通りです。

整数(10進数)表示(書式設定なし)

>>> a = 1234567
>>> '{:d}'.format(a)
'1234567'

フィールド幅を指定し、右寄せ/左寄せ/中央配置にする

フィールド幅(表示する文字列の幅)はwidthパラメータ、また文字列の位置(右寄せ・左寄せ・中央)はalignパラメータで設定します。(下表参照)

align 設定内容
‘>’ 右寄せ
‘<' 左寄せ
‘^’ 中央配置
‘=’ 符号の後ろをfill値でパディング

・フィールド幅15、文字列の位置は設定なし(デフォルトで右寄せ)

>>> '{:15d}'.format(a)
'        1234567'

・右寄せ、フィールド幅15

>>> '{:>15d}'.format(a)
'        1234567'

・左寄せ、フィールド幅15

>>> '{:<15d}'.format(a)
'1234567        '

・中央配置、フィールド幅15

>>> '{:^15d}'.format(a)
'    1234567    '

空白部分を任意文字で埋める(パディング)

空白部分をどの文字で埋めるかは、fillパラメータで設定します。

・'*'でパディング、右寄せ、フィールド幅15

>>> a = 1234567
>>> '{:*>15d}'.format(a)
'********1234567'
    
または
>>> '{:*=15d}'.format(a)
'********1234567'

・(負の整数の場合)(-)符号の後ろを'*'でパディング

>>> b = -1234567
>>> '{:*=15d}'.format(b)
'-*******1234567'

・(負の整数の場合)(-)符号の前を'*'でパディング

>>> b = -1234567
>>> '{:*>15d}'.format(b)
'*******-1234567'

パディングの文字列を省略すると空白で穴埋めされます(こちらの方が分かりやすいかも)

>>> b = -1234567
>>> '{:=15d}'.format(b)
'-       1234567'

>>> '{:>15d}'.format(b)
'       -1234567'

・"*"でパディング、左寄せ、フィールド幅15

>>> a = 1234567
>>> '{:*<15d}'.format(a)
'1234567********'

・ゼロ(0)パディング(2つのやり方があります)

# [fill][align]パラメータを使う 
>>> '{:0=15d}'.format(a)
'000000001234567'

# [0]パラメータを設定する
>>> '{:015d}'.format(a)
'000000001234567'

数値をカンマ(,)で3桁に区切る

grouping_option = ","を設定することで3桁区切りも出来ます。
但し、10進数の整数(type="d")の場合のみ。
2進数、8進数、16進数の場合は4桁区切りとなります。詳細はこちら

・10進数の整数を3桁に区切る(フィールド幅は15)

>>> a = 1234567
>>> '{:15,d}'.format(a)
'      1,234,567'

・10進数の整数を3桁に区切る(フィールド幅は15、*でパディング)

>>> '{:*=15,d}'.format(a)
'******1,234,567'

符号(+/-)を付ける

signを使うと、下記の様に+/-の符号を表示することができます。

sign 設定内容
'+' 正・負の両方に符号(+/-)を付与
'-' 負数だけに符号を付与

・正の整数にも符号(+)を付ける(フィールド幅15)

>>> a = 1234567
>>> b = -1234567

>>> '{:+15,d}'.format(a)
'     +1,234,567'

>>> '{:+15,d}'.format(b)
'     -1,234,567'

・負の整数のみに符号(-)を付ける(フィールド幅15)

>>> a = 1234567
>>> b = -1234567

>>> '{:-15,d}'.format(a)
'      1,234,567'

>>> '{:-15,d}'.format(b)
'     -1,234,567'

※)正直、sign="-"の設定の使いみちが思いつきませんが・・・

浮動小数点の書式設定

浮動小数点は、type='f'とします。
フィールド幅の設定や文字列の位置、パディングの設定は整数(10進数)と同じですが、小数点の扱いが追加となります。

浮動小数点の表示(書式設定無し)

※特に指定がない場合は、デフォルトで小数点以下6桁表示です。

>>> a = 3.141592653589793
>>> '{:f}'.format(a)
'3.141593'

※置換フィールドに何も設定しない場合

>>> a = 3.141592653589793
>>> '{}'.format(a)
'3.141592653589793'

小数点以下の桁数を設定

.[precision]で小数点以下の桁数を指定します。ピリオドを忘れずに!

・小数点以下1桁まで表示(小数第2位を四捨五入)

>>> '{:.1f}'.format(a)
'3.1'

・小数点以下3桁まで表示(小数第4位を四捨五入)

>>> '{:.3f}'.format(a)
'3.142'

フィールド幅、文字列の位置、パディングなどの書式設定

配置(右寄せ/左寄せ/中央)、符号、3桁区切り等は整数値の場合と同じです。

・0パディング、右寄せ、フィールド幅10、小数点以下3桁まで表示

>>> a = 3.141592653589793
>>> '{:010.3f}'.format(a)
'000003.142'

または
>>> '{:0=10.3f}'.format(a)
'000003.142'

・"*"でパディング、右寄せ、フィールド幅10、小数点以下3桁まで表示

>>> '{:*>10.3f}'.format(a)
'*****3.142'

・"x"でパディング、中央寄せ、フィールド幅10、小数点以下4桁まで表示

>>> '{:x^10.4f}'.format(a)
'xx3.1416xx'

・左寄せ、符号(+)を付与、フィールド幅8、小数点以下4桁

>>> '{:<+8.3f}'.format(a)
'+3.142  '

・"*"でパディング、右寄せ、フィールド幅15、3桁区切り、小数点以下2桁

>>> '{:*>15,.2f}'.format(c)
'***3,141,592.65'

文字列の書式設定

文字列は、type='s'を設定します。フィールド幅と文字列の位置、パディングの設定のみですね。

文字列の表示(書式設定無し)

>>> s = 'abcdef'
>>> '{:s}'.format(s)
'abcdef'

フィールド幅、文字列の位置、パディングなどの書式設定

文字列の場合はデフォルトで左詰めです。

・フィールド幅15、左寄せ(デフォルト)

>>> '{:15s}'.format(s)
'abcdef         '

・"*"でパディング、左寄せ、フィールド幅15

>>> '{:*<15s}'.format(s)
'abcdef*********'

・"*"でパディング、右寄せ、フィールド幅10

>>> '{:*>10s}'.format(s)
'****abcdef'

2進数、8進数、16進数の書式設定

10進数の整数を、2進数、8進数、16進数に変換することもできます。

ここで、typeの設定内容は下記です。

type 設定内容
’b’ 2進数
’o’ 8進数
’x’ 16進数

10進数 ⇔ 2進数/8進数/16進数(書式設定なし)

※10進数から接頭辞(0b、0o、0x)付けて変換する場合は#を付けます。

・10進数 → 2進数に変換

>>> a = 1000
>>> '{:b}'.format(a)
'1111101000'

・10進数 → 2進数に変換(接頭辞0b付き)

>>> a = 1000
>>> '{:#b}'.format(a)
'0b1111101000'

・2進数 → 10進数に変換
※接頭辞"0b"がついた2進数を10進数に変換します。

>>> a = 0b1000
>>> '{:d}'.format(a)
'8'

・10進数 → 8進数に変換

>>> a = 1000
>>> '{:o}'.format(a)
'1750'

・10進数 → 8進数に変換(接頭辞0o付き)

>>> a = 1000
>>> '{:#o}'.format(a)
'0o1750'

・8進数 → 10進数に変換
※接頭辞"0o"がついた8進数を10進数に変換します。

>>> a = 0o1000
>>> '{:d}'.format(a)
'512'

・10進数 → 16進数に変換

>>> a = 1000
>>> '{:x}'.format(a)
'3e8'

・10進数 → 16進数に変換(接頭辞0x付き)

>>> a = 1000
>>> '{:#x}'.format(a)
'0x3e8'

・16進数 → 10進数に変換
※接頭辞"0x"がついた16進数を10進数に変換します。

>>> a = 0x1000
>>> '{:d}'.format(a)
'4096'

フィールド幅、文字列の位置、パディングなどの書式設定

フィールド幅、配置(右寄せ/左寄せ/中央)、パディングも整数と同様。
尚、grouping_optionパラメータを設定すると4桁区切りに出来ます(Python3.6以降)。

・フィールド幅10、10進数→16進数に変換

>>> a = 1000
>>> '{:10x}'.format(a)
'       3e8'

・左寄せ、接頭辞0b付き、フィールド幅15、10進数→2進数に変換

>>> a = 1000
>>> '{:<#15b}'.format(a)
'0b1111101000   '

・"*"でパディング、右寄せ、フィールド幅15、10進数→8進数に変換

>>> a = 1000
>>> '{:*>15o}'.format(a)
'***********1750'

・"*"でパディング、右寄せ、フィールド幅15、4桁区切り、10進数→2進数に変換
※Python3.6以降

>>> a = 1000
>>> '{:*>15_b}'.format(a)
'***11_1110_1000'

(参考)書式設定の詳細

各パラメータについて表にまとめました。

オプション名 設定内容
[fill]align [fill]
 右寄せ・左寄せの際に空いた場所を埋める任意の文字。省略された場合はデフォルトの空白文字
[align]
 < :左寄せ
 > :右寄せ
 = : 符号 (があれば) の後ろを'fill'で埋める(数値型のみ有効)
 ^ :中央寄せ
sign 数値型に対してのみ有効
+ :正・負の両方に符号(+/-)を付与
- :負数のみ'-'を付与(デフォルト)
(空白):空白を正数の前に付け、'-'を負数の前に付与
[#][0]width # (widthの前に付与)
2進法、8進法、または16進法出力される値にそれぞれ '0b', '0o', '0x' 接頭辞を付与
0 (widthの前に付与)
符号の前を0パディングします。fill='0'且つalign:'='の設定と等価
[width]:10進数で指定
最小のフィールド幅を表す。指定が無い場合はその内容により決定
grouping_option ,(カンマ)
浮動小数点数の表現型と整数の表現型 'd'に対して千の位ごとの" ,"(カンマ)を挿入。

_(アンダーバー)
typeオプションが浮動小数点数の表現型と整数の表現型 'd'の場合、千の位ごとの"_"を挿入。
typeオプションが 'b', 'o', 'x', 'X'の場合は4桁ごとに区切りが挿入

precision 10進数を指定。'type'が
f、Fの場合 :小数点以下の桁数
g、Gの場合 :小数点の前後に表示される桁数
非数型に対しては最大フィールド幅を表します。整数型には使えません。
type <文字列の表現型>
s  :文字列

<整数の表現型>
b  :2進数
c  :Unicode 文字に変換
d  :10進数
o  :8進数
x、X :16進数
n   :数値('d'と等価)

<浮動小数点数の表現型>
e、E :指数を示す 'e' を使って数値を表示します。デフォルトの精度は 6
f、F :数値を固定小数点数として表示します。デフォルトの精度は 6
g、G :桁に応じて固定小数点か指数表記で表示
%   :数値は 100 倍され、固定小数点数フォーマット ('f') でパーセント記号付きで表示されます

参考資料:Pytho公式リファレンス 書式指定ミニ言語仕様

まとめ

str.format()を使って文字列を出力する為の書式設定の方法について、主に整数値(10進数)、浮動小数点、文字列、2進数/8進数/16進数の場合についてまとめました。

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!