[解決!Python]数値を0埋めして文字列化するには:解決!Python
Pythonで数値を0埋めして文字列化するには、f文字列、formatメソッド、format関数、%演算子などの方法がある。
* 本稿は2020年8月21日に公開された記事をPython 3.12.1で動作確認したものです(確認日:2024年2月1日)。
# 数値「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文字列と同様なものが指定できる。
以下に幾つか例を示す。
num = 12
# 埋め文字を「_」に、左寄せ、最小幅は5
s = '{:_<5}'.format(num)
print(s) # 12___
# 符号を常に表示、最小幅は4
s = '{:+4}'.format(num)
print(s) # +12(符号の前を空白で埋めている)
# 符号を常に表示、符号の後を0埋め、最小幅は5
s = '{:+05}'.format(num) # '{:0=+5}'.format(num)と同じ
print(s) # +0012
format関数
Pythonに組み込みのformat関数は、第0引数に指定した値を、第1引数に渡した書式指定子に従って書式化した値を返す。この書式指定子には、f文字列の説明で紹介したものを指定できる。注意するのは、第1引数には書式指定子で構成される文字列のみを渡すことだ(波かっこや変数名や式、コロンなどは不要)。
以下に例を示す。
num = 12
# 数値「12」を文字列「0012」に書式化
# 「0埋めを意味する0」「最小幅4」を指定
s = format(num, '04')
print(s) # 0012
# 埋め文字を「_」に、左寄せ、最小幅は5
s = format(num, '_<5')
print(s) # 12___
# 符号を常に表示、最小幅は4
s = format(num, '+4')
print(s) # +12(符号の前を空白で埋めている)
# 符号を常に表示、符号の後を0埋め、最小幅は5
s = format(num, '+05') # format(num, '0=+5')と同じ
print(s) # +0012
%演算子
%演算子による文字列の書式化は古い方法であり、これまでに見てきた方法を使うのが望ましい。ここでは簡単に触れておく。
「文字列 % 値」という式は、「変換指定子」を含んだ「文字列」に対して、「値」(単一の値、または辞書、タプル)を書式化して埋め込んだものが、その結果となる。
変換指定子は「%」で始まり、その後に以下を指定する(一部抜粋。詳細はPython 2.7のドキュメント「文字列フォーマット操作」などを参照のこと)。
- マップキー:%演算子の右項に辞書を指定した場合に、その要素にアクセスするためのキー(オプション)
- 変換フラグ:変換時のフラグ(0埋め、文字寄せ、符号の有無など)を指定する(オプション)
- 最小幅:変換後の最小幅を指定する(オプション)
- 変換型:変換対象の値をどのように表現するかを指定する。'd'(符号付き10進整数)、'x'(符号付き16進数)、'e'(指数表記)、'f'(10進浮動小数点数)などを指定可能
以下に例を示す。
num = 12
# 数値「12」を文字列「0012」に書式化
# 「0埋めを意味する0」「最小幅4」「表示型d」を指定
s = '%04d' % num
print(s) # 0012
# 符号を常に表示、符号の後を0埋め、最小幅は5
s = '%+05d' % num
print(s) # +0012
# 左寄せ、最小幅は5
s = '%-5d' % num
print(s) # 12 (埋め文字は空白文字となる)
# 右寄せ、最小幅は5
s = '% 5d' % num
print(s) # 12(埋め文字は空白文字となる)
# 符号を常に表示、最小幅は4
s = '%+4d' % num
print(s) # +12(符号の前を空白で埋めている)
以下は%演算子の右項にタプルや辞書を指定する例だ。
# 複数の値をタプルにまとめる
x = 1
y = 2
s = 'x: %04d, y: %04d' % (x, y) # タプルにまとめることで、複数の要素を書式化
print(s) # x: 0001, y: 0002
# 辞書を使って複数の値を渡す
d = {'x': 12, 'y': 34}
s = 'x: %(x)04d, y: %(y)04d' % d # マップキーは%に続けてかっこ「()」で囲んで指定
print(s) # x: 0012, y: 0034
Copyright© Digital Advantage Corp. All Rights Reserved.