葛のメモ帳

自分で調べたことを忘れないためにメモっておきます

葛のメモ帳

自分で調べたことを忘れないためにメモっておきます


Pythonのstr.formatと書式指定文字列について

目次

  1. 公式docs紹介
  2. str.format
  3. 書式指定文字列
  4. 動作確認

公式docs紹介

str.format

str.formatの構文

str.format(*args, **kwargs)
  • 文字列の書式化操作を行います。このメソッドを呼び出す文字列は通常の文字、または、 {} で区切られた置換フィールドを含みます。
  • それぞれの置換フィールドは位置引数のインデックスナンバー、または、キーワード引数の名前を含みます。
  • 返り値は、それぞれの置換フィールドが対応する引数の文字列値で置換された文字列のコピーです。

書式指定文字列

書式指定文字列のBNF

replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
arg_name          ::=  [identifier | digit+]
attribute_name    ::=  identifier
element_index     ::=  digit+ | index_string
index_string      ::=  <any source character except "]"> +
conversion        ::=  "r" | "s" | "a"
format_spec       ::=  <described in the next section>

arg_name:         ::=   引数のこと。識別子か、数字で指定する
attibute_name:    ::=   引数としているオブジェクトの属性のこと。引数の属性を指定できる
element_index:    ::=   引数のインデックスのこと。リストやタプルなどのインデックスを指定できる
index_string:     ::=   文字列で指定するインデックス?(要確認)

format_spec     ::=  [[fill]align][sign][#][0][width][grouping_option][.precision][type]
fill            ::=  <any character>
align           ::=  "<" | ">" | "=" | "^"
sign            ::=  "+" | "-" | " "
width           ::=  digit+
grouping_option ::=  "_" | ","
precision       ::=  digit+
type            ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

説明

  • 以下の定義をもとに順番に説明していきます。
replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"

field_nameの説明

  • arg_name
    • 引数のこと。識別子か数字で指定する
  • attibute_name
    • 引数としているオブジェクトの属性のこと。引数の属性を指定できる
  • element_index
    • 引数のインデックスのこと。リストやタプルなどのインデックスを指定できる
  • index_string
    • 文字列で指定するインデックス

field_nameの例

"{0}yen + {1}yen = {2}yen".format(10, 50, 60)
> '10yen + 50yen = 60yen'

"20yen + 30yen = {result}yen".format(result=20+30)
> "20yen + 30yen = 50yen

dir = {"apple": "りんご", "pencil": "えんぴつ"}
"{0[apple]}, {0[pencil]}".format(dir)
> りんご、えんぴつ

conversionの説明

  • conversion
    • 置換
  • 現在 3つの変換フラグがサポートされています
    • str() を呼ぶ '!s'
    • repr() を呼ぶ '!r'
    • ascii() を呼ぶ '!a'。

conversionの例

"Harold's a clever {0!s}"        # Calls str() on the argument first
"Bring out the holy {name!r}"    # Calls repr() on the argument first
"More {!a}"                      # Calls ascii() on the argument first

format_specの説明

  • [[fill]align]
    • 文字を整列させます。paddingと読んだりしています。
  • [sign]
    • 符号の付与を行います。文字数に含まれます。
  • [width]
    • 文字列の長さを指定します。
  • [grouping_option]
    • 区切り文字をしてします。
  • [type]
    • 型を指定します。
align
option Meaning
'<' 利用可能なスペースにおいて、左詰めを強制します (ほとんどのオブジェクトにおいてのデフォルト)。
'>' 利用可能なスペースにおいて、右詰めを強制します (いくつかのオブジェクトにおいてのデフォルト)。
'=' 符号 (があれば) の後ろを埋めます。 '+000000120' のような形で表示されます。このオプションは数値型に対してのみ有効です。フィールド幅の直前が '0' の時はこれがデフォルトになります。
'^' 利用可能なスペースにおいて、中央寄せを強制します。

例: : + fill align + width

>>> "{:x>3}".format(2)  
'xx2'

>>> "{:9<4}".format(2) 
'2999'

>>> "{:9=6}".format(-20) 
'-99920'

>>> "{:9>6}".format(-20) 
'999-20'

>>> "{:9^6}".format(22) 
'992299'
option
option Meaning
'+' 符号の使用を、正数、負数の両方に対して指定します。
'-' 符号の使用を、負数に対してのみ指定します (デフォルトの挙動です)。
空白 空白を正数の前に付け、負号を負数の前に使用することを指定します。

例: ; + fill align + sign + width

>>> "{:0=-5}".format(-22) 
'-0022'
>>> "{:0=-5}".format(22)  
'00022'
>>> "{:0=+5}".format(22) 
'+0022'
group option
option Meaning
, 千の位のセパレータにカンマを使います。
_ 浮動小数点数の表現型と整数の表現型 'd' における千倍ごとの区切り文字にアンダースコアを使うというしるしです。

: fill + sign + width + group option

>>> "{:x=+12_}".format(1000000000)
'+1_000_000_000'
>>> "{:x=+12,}".format(1000000000) 
'+1,000,000,000'
[type]
option Meaning
'b' 2進数。出力される数値は2を基数とします。
'c' 文字。数値を対応する Unicode 文字に変換します。
'd' 10進数。出力される数値は10を基数とします。
'o' 8進数。出力される数値は8を基数とします。
'x' 16進数。出力される数値は16を基数とします。 10進で9を超える数字には小文字が使われます。
'X' 16進数。出力される数値は16を基数とします。 10進で9を越える数字には大文字が使われます。
'n' 数値。現在のロケールに従い、区切り文字を挿入することを除けば、 'd' と同じです。
None 'd' と同じです。
'e' 科学的記数法。与えられた精度pで、係数を指数から分離する文字「e」で数値を科学的記数法でフォーマットします。
'E' 科学的記数法。'e'区切り文字として大文字の「E」を使用することを除いて、同じです。
'f' 固定小数点表記。与えられた精度pで、数値を小数点以下の桁で10進数としてフォーマットします
'F' 固定小数点数表記です。nan が NAN に、inf が INF に変換されることを除き 'f' と同じです
'g' 与えられた精度に対して、これは数値を有効数字に丸め、その大きさに応じて、結果を固定小数点形式または科学的記数法のいずれかにフォーマットします。
'G' 汎用フォーマットです。数値が大きくなったとき、 'E' に切り替わることを除き、 'g' と同じです。無限大と NaN の表示も大文字になります。
'n' 数値です。現在のロケールに合わせて、数値分割文字が挿入されることを除き、 'g' と同じです。
'%' パーセンテージです。数値は 100 倍され、固定小数点数フォーマット ('f') でパーセント記号付きで表示されます。
>>> "{:b}".format(7)
'111'
>>> "{:c}".format(7) 
'\x07'
>>> "{:d}".format(7) 
'7'
>>> "{:0}".format(18) 
'18'
>>> "{:o}".format(18) 
'22'
>>> "{:x}".format(18) 
'12'
>>> "{:X}".format(18) 
'12'
>>> "{:X}".format(23) 
'17'
>>> "{:X}".format(36) 
'24'
>>> "{:X}".format(30) 
'1E'
>>> "{:x}".format(30) 
'1e'
>>> "{:n}".format(30) 
'30'
>>> "{:n}".format(30000) 
'30000'
>>> "{:n}".format(30,000) 
'30'
>>> "{:}".format(30,000)  
'30'
>>> "{:}".format(30.000) 
'30.0'
>>> "{:n}".format(30.000) 
'30'
>>> "{:e}".format(30.000) 
'3.000000e+01'
>>> "{:E}".format(30.000) 
'3.000000E+01'
>>> "{:f}".format(30.000) 
'30.000000'
>>> "{:f}".format(30.003) 
'30.003000'
>>> "{:F}".format(30.003) 
'30.003000'
>>> "{:g}".format(30.003) 
'30.003'
>>> "{:G}".format(30.003) 
'30.003'
>>> "{:%}".format(30.003) 
'3000.300000%'
>>> "{:%}".format(10)     
'1000.000000%'