連載
» 2020年08月21日 05時00分 公開

解決!Python:[解決!Python]数値を0埋めして文字列化するには

Pythonで数値を0埋めして文字列化するには、f文字列、formatメソッド、format関数、%演算子などの方法がある。

[かわさきしんじ,Deep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

# 数値「12」を文字列「0012」に書式化
num = 12

# f文字列:Python 3.6以降
s = f'{num:04}'  # 0埋めで4文字

print(s)  # 0012

# formatメソッド:Python 2.6以降(3を含む)
# formatメソッドに渡した位置引数が{0}、{1}、……に渡される
s = '{0:04}'.format(num)  # 第0引数:0埋めで4文字

print(s)  # 0012

# format関数:Python 2.6以降(3を含む)
s = format(num, '04'# 0埋めで4文字

print(s)  # 0012

# %演算子
s = '%04d' % num  # 0埋めで4文字、10進整数

print(s)  # 0012


 以下ではこれらの方法について簡単に解説をする。

f文字列

 Python 3.6以降ではf文字列(フォーマット済み文字列)を使うと簡単に、数値や文字列の書式化を行える。f文字列は文字列を囲むシングルクオートやダブルクオートの前に「f」を置くことで作成できる。

 f文字列内には波かっこ「{}」で囲まれた「置換フィールド」を記述して、そこに「{式:書式指定子}」という形式で、書式化する対象となる式(変数名など)と、それをどのように書式化するかを指定する(「:書式指定子」の前には「!r」「!s」「!a」という「変換フィールド」を記述できる。これは「書式指定子」を使った書式化の前に、式の値をrepr関数、str関数、ascii関数で文字列化することを指示するもの。ただし、本稿では説明は省略する)。

 書式指定子としては例えば次のようなものを指定できる。詳細については「Python入門」の「文字列の書式指定」などを参照のこと。

  • 埋め文字:式を書式化する際に使用する埋め文字。デフォルトは空白文字
  • 文字寄せ:左寄せ('<')、右寄せ('>')、中央寄せ('^')、左寄せで符号と値の間を文字埋めするか('=')を指定
  • 符号:常に符号を表示('+')、負値のみ符号を表示('-')、正値では符号の代わりに空白文字を表示して、負値のときには負号を表示(' ')
  • 0:埋め文字に「0」、文字寄せに「=」を指定するのと同値(0埋めを意味する0)
  • 最小幅:書式指定後の文字列の最小文字数を指定。指定を省略したときには書式指定後の文字列長が表示幅となる

 上記例の「04」は上で強調書体とした「0埋めを意味する0」に続けて「最小幅」を指定したものと考えられる。f文字列(および次に取り上げるformatメソッド)においては、0埋めするにはこの指定を行うのが簡単だ。

 f文字列で書式指定を行う例を幾つか示す。

num = 12

# 埋め文字を「_」に、左寄せ、最小幅は5
s = f'{num:_<5}'

print(s)  # 12___

# 符号を常に表示、最小幅は4
s = f'{num:+4}'

print(s)  #  +12(符号の前を空白で埋めている)

# 符号を常に表示、符号の後を0埋め、最小幅は5
s = f'{num:+05}'  # f'{num:0=+5}'と同じ

print(s)  # +0012

# 置換フィールドに式を記述
x = 1
y = 2
s = f'{x:04} + {y:04} = {x+y:04}'

print(s)  # 0001 + 0002 = 0003


formatメソッド

 Python 2.6以降(Python 3を含む)では、文字列のformatメソッドを使っても書式化が可能だ。formatメソッドは「'書式指定文字列'.format(埋め込む値)」という形式で呼び出す。書式指定文字列内には、f文字列と同様に波かっこ「{}」で囲んだ「置換フィールド」を記述する。

 置換フィールドは「{置換フィールド名:書式指定子}」という形式で記述する。置換フィールド名としては、整数値または任意のキーワードを指定する。整数値を指定した場合、その置換フィールドはformatメソッドに渡された位置引数の値を順に参照していく(置換フィールド{0}は第0引数を、{1}は第1引数を、……のように)。キーワードを指定したときには、それらのフィールドはformatメソッドに渡されたキーワード引数の値を参照する。Python 2.7以降では置換フィールド名を省略すると、0から順番に整数値が割り当てられたものとして扱われる(f文字列と同様、「書式指定子」の前に「!r」「!s」「!a」という変換フィールドを記述できる)。

 辞書のキー/値の組から書式化を行う場合には、formatメソッドの引数指定で辞書から値を取り出す方法、位置引数やキーワード引数として辞書を渡し置換フィールド内でその値を取り出す方法、辞書のキー/値を展開してformatメソッドに渡す方法がある。

 以下に例を示す。

x = 12
y = 34

# 置換フィールド名を省略(Python 2.7以降)
s = 'x: {}, y:{}'.format(x, y)  # 2つの{}は位置引数に指定したxとyを順に参照

print(s)  # x: 12, y: 34

# 置換フィールドに整数値を指定
s = 'x: {1}, y: {0}'.format(y, x)  # {0}は第0引数yの値を、{1}は第1引数xの値を参照

print(s)  # x: 12, y: 34

# 置換フィールド名にキーワードを指定
s = 'x: {x}, y: {y}'.format(x=x, y=y)  # {x}と{y}はキーワード引数xとyの値を参照

print(s)  # x: 12, y: 34

d = {'x': 12, 'y': 34}

s = 'x: {}, y: {}'.format(d['x'], d['y'])  # 辞書のキーを指定して個々の値を渡す

print(s)  # x: 12, y: 34

s = 'x: {0[x]}, y: {0[y]}'.format(d)  # 第0引数dの要素に「0[x]」「0[y]」としてアクセス

print(s)  # x: 12, y: 34

s = 'x: {x}, y: {y}'.format(**d)  # 辞書の要素を展開してformatメソッドに渡す

print(s)  # x: 12, y: 34


 なお、f文字列ではコロン「:」の前に式を記述できたが、formatメソッドではオブジェクトの属性アクセス、インデックス指定を行うことは可能だが、それ以外の式は書けないことには注意(上のコード例の下から2つ目のコードでは、辞書のキーを指定して、その値を取り出しているが、このときには文字列キーを囲むシングルクオート/ダブルクオートは省略している点に注目)。

 書式指定子についてはf文字列と同様なものが指定できる。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。