検索
連載

[Python入門]文字列の書式指定Python入門(2/4 ページ)

文字列中で値を0埋めするなどの書式指定を行う方法をformatメソッドを中心に説明する。f文字列や以前の形式の書式指定についても取り上げる。

PC用表示 関連情報
Share
Tweet
LINE
Hatena

置換フィールド内での書式指定

 置換フィールドでは、表示幅の指定や、右寄せ/左寄せなどの指定も行える。これを「書式指定」と呼び、その記述方法は「書式指定ミニ言語仕様」で定められている。書式指定は、置換フィールドにコロン「:」を書き、その後に続けて記述する。

 コロンの後ろには、次のような項目で構成される「書式指定子」を記述する。

  • [[fill]align][sign][#][width][grouping_option][.precision][type]

 全ての項目は省略可能だ。また、実際の書式指定子には上掲の「fill」や「width」などを記述するのではなく、これらの指定部分に以下の表の「指定可能な値」に記した値を記述していく。

指定可能な値
[fill]align fillには、埋め込まれる内容が、この置換フィールドの幅よりも少ないときに余った部分を埋める文字を指定する(省略時は空白文字)。
alignには以下を指定
「<」:左寄せ
「^」:中央寄せ
「>」:右寄せ
「=」:符号の後をfillで指定した文字で埋める
'{0:*<8}'.format(1)→'1*******'
説明:文字埋め(fill)に「*」を使い、「<」を指定しているので左寄せ(align)。末尾の「8」はフィールドの最小の文字幅
'{0:&=8}'.format(-1)→'-&&&&&&1'
説明:マイナス符号と値(1)の間を「&」で埋める
sign 「+」:正負の符号を常に表示
「-」:負値の場合にだけ符号を表示
「 」(空白文字):正値では符号の代わりに空白文字を表示する
数値を指定する場合のみ有効
'{0:^+8}'.format(100)→'  +100  '
説明:正値でも符号付きで表示。alignに「^」を指定しているので中央寄せ。最小の文字幅は「8」
# 以下のtypeに「b」を指定したときには「0b」を前置
以下のtypeに「o」を指定したときには「0o」を前置
以下のtypeに「x」または「X」を指定したときには「0x」を前置
10進数表記で数値を表示する場合は、常に小数点を表示するなど
'{0:#8x}'.format(255)→'    0xff'
説明:10進数値の「255」を書式化するが、typeに「x」を指定して、「#」を追加しているので「0x」が前置される
'{0:8x}'.format(255)→'      ff'
上記と同様だが「#」がないので「0x」が前置されない
0 上の「[fill]align」に「0=」を指定したのと同値(符号の後を0埋め)。上記の「[fill]align」を未指定の場合にのみ有効 '{0:08}'.format(-1)→'-0000001'
説明:符号と数値の間を0埋め。「8」は最小の文字列幅の指定
width その置換フィールドの最小の表示幅を数値で指定。省略時は表示内容によって表示幅が決定される '{0:<#8b}'.format(27)→'0b11011 '
説明:10進数値「27」を書式化する。最小文字幅は「8」文字で左寄せ(<)。typeが「b」で「#」があるので2進数表現で先頭に「0b」を前置
'{0:4}'.format(10000)→'10000'
説明:最小の文字幅(4)を超えているが、「10000」がそのまま埋め込まれる
grouping_option 「,」:10進数表記での表示では3桁ごとに桁区切りのカンマを表示
「_」:10進数表記では3桁ごとに、2進数/8進数/16進数表記では4桁ごとに桁区切りのアンダースコアを表示
'{0:<#8_b}'.format(27)→'0b1_1011'
説明:上記の例と同様だが、「_」があるので4桁ごとに「_」が表示される
'{0:,}'.format(12345)→'12,345'
3桁ごとに「,」が表示される
.precision 以下のtypeに「f」「F」を指定した場合は、小数点以下の有効桁数を指定
以下のtypeに「g」「G」を指定した場合は、小数点前後の有効桁数を指定
ドット「.」を忘れないようにすること。また整数値の表示では指定できない
'{0:.4f}'.format(1.23456)→'1.2346'
説明:小数点以下を4桁に
'{0:.4}'.format(1.23456)→'1.235'
説明:小数点前後の桁数を4桁に
type 以下を指定可能(抜粋)
「b」:2進数表記
「c」:文字(対応する数値を文字に変換)
「d」:10進数表記
「e」または「E」:指数表記(「e」は指数を示すのに「e」を使用、「E」は指数を示すのに「E」を使用)
「f」または「F」:固定小数点表記
「g」または「G」:汎用フォーマット
「o」:8進数表記
「s」:文字列
「x」または「X」:16進数表記(「x」はアルファベットを小文字で表記、「X」はアルファベットを大文字で表記)
「%」:パーセント表記
'{0:b}'.format(13)→'1101'
説明:10進数値を2進数値として表示
'{0:c}'.format(65)→'A'
「65」をコードポイントとする文字'A'を表示
'{0:.5e}'.format(10000)→'1.00000e+04'
説明:「10000」を指数表記。有効桁数は5
書式指定に使える指定子

 以下は何も指定を行っていないコードだ(符号の有無による変化や浮動小数点数も例に挙げたいので、変数yの値を変更している)。

x = 1
y = -2.1
result = '{x} + {y} = {result}'.format(result=x+y, x=x, y=y)
print(result)

書式指定を含んでいない書式指定文字列

 この実行結果を以下に示す。

書式指定がない場合の表示結果
書式指定がない場合の表示結果

 書式指定を行うことで、これがどのように変化していくかを以下では見ていこう。

表示幅の指定

 まず、表示幅を指定する。文字寄せや文字埋めなどを指定しない場合は、単にコロン「:」に続けて、数値を書けば、表示幅の指定となる。

x = 1
y = -2.1
result = '{x:8} + {y:8} = {result:8}'.format(result=x+y, x=x, y=y)
print(result)

表示幅(width)の指定

 これにより、書式指定文字列の各置換フィールドの表示幅が8文字分取られるようになる(浮動小数点数値の場合は、小数点の表示に1文字の幅が使われる)。これはあくまでも「最小の表示幅」であることに注意しよう(これよりも多くの幅を使って表示が行われることもある)。

 以下に実行結果を示す。表示幅が上の実行例よりも広くなっていることが分かるはずだ。

表示幅を設定した場合の出力
表示幅を設定した場合の出力

文字寄せと文字埋め

 埋め込む値を、左寄せ/中央寄せ/右寄せにするには以下を指定する。これらは書式指定を始めるコロン「:」の直後に「[fill]align」の形式で指定する。「fill」には、表示内容が指定した表示幅に足りない場合に不足部分に表示される文字を指定する(省略した場合は空白文字が使われる)。alignには以下を指定する。

  • '<':左寄せ
  • '>':右寄せ
  • '^':中央寄せ
  • '=':符号を表示する場合、符号の後をパディング文字で埋める

 では、これらを実際に使ってみる。置換フィールドxはパディング文字なしで左寄せに、置換フィールドyは符号と数値の間をパディング文字「0」で埋めてみることにしよう。そのためには置換フィールドxには「<」という書式指定を、置換フィールドyには「0=」という書式指定を追加する(表示幅の前に記述)。違いを見るために、置換フィールドresultには「=」という書式指定のみを追加する。

x = 1
y = -2.1
result = '{x:<8} + {y:0=8} = {result:=8}'.format(result=x+y, x=x, y=y)
print(result)

文字寄せと文字埋めの指定

 これにより表示は次のように変化する。

置換フィールドxは左揃えになり、置換フィールドyは「-」符号の後が0埋めされた。置換フィールドresultは「-」符号の後が空白文字で埋められている
置換フィールドxは左寄せになり、置換フィールドyは「-」符号の後が0埋めされた。置換フィールドresultは「-」符号の後が空白文字で埋められている

 置換フィールドyでは0でマイナス符号と2.1の間が埋められ、置換フィールドresultでは空白文字がマイナス符号と計算結果の間に含まれるようになったことが分かる。なお、置換フィールドyで使用している「0=」という書式指定は、表示幅の指定の前に「0」を置くことでも実現できる(実行結果は上と同様なので省略)。

x = 1
y = -2.1
result = '{x:<8} + {y:08} = {result:=8}'.format(result=x+y, x=x, y=y)
print(result)

「0=」という書式指定は、「0」を表示幅の前に置くのと同じ

Copyright© Digital Advantage Corp. All Rights Reserved.

[an error occurred while processing this directive]
ページトップに戻る