note.nkmk.me

Pythonで文字列・数値をゼロ埋め(ゼロパディング)

Date: 2018-06-11 / tags: Python, 文字列操作
このエントリーをはてなブックマークに追加

Pythonで文字列(str型)や整数値(int型)をゼロ埋め(ゼロパディング)するにはいくつか方法がある。

それぞれをサンプルコードとともに説明する。

  • 右寄せゼロ埋め: zfill()
  • 右寄せ、左寄せ、中央寄せ: rjust(), ljust(), center()
  • 任意の書式変換: format(), f文字列
  • 文字列に対するパーセント演算子
スポンサーリンク

右寄せゼロ埋め: zfill

一番シンプルなのは文字列メソッドzfill()を使う方法。

引数に文字数を指定すると、元の文字列が右寄せされて残り(左側)がゼロで埋められた文字列を返す。

s = '1234'

s_zero = s.zfill(8)
print(s_zero)
# 00001234

print(type(s_zero))
# <class 'str'>

元の文字列の文字数よりも少ない数値を指定した場合は元の文字列のまま変化なし。

print(s.zfill(3))
# 1234

-または+が先頭についている場合、符号(-, +)のあとからゼロで埋められる。符号も文字数にカウントされるので注意。

s = '-1234'
print(s.zfill(8))
# -0001234

s = '+1234'
print(s.zfill(8))
# +0001234

元の文字列は数字でなくても同様に処理される。

s = 'abcd'
print(s.zfill(8))
# 0000abcd

zfill()は文字列(str型)のメソッドなので、整数値(int型)などほかの型からは呼び出せない。整数値をゼロ埋めした文字列を生成したい場合は、組み込み関数str()で整数値を文字列に変換してからzfill()を呼ぶ。

n = 1234

print(type(n))
# <class 'int'>

# print(n.zfill(8))
# AttributeError: 'int' object has no attribute 'zfill'

print(str(n).zfill(8))
# 00001234

右寄せ、左寄せ、中央寄せ: rjust, ljust, center

右寄せだけでなく、左寄せ、中央寄せでゼロ埋めしたい場合は、文字列メソッドrjust(), ljust(), center()を使う。

第二引数に'0'を指定する。

s = '1234'

print(s.rjust(8, '0'))
# 00001234

print(s.ljust(8, '0'))
# 12340000

print(s.center(8, '0'))
# 00123400

符号(-, +)は考慮されない。

s = '-1234'

print(s.rjust(8, '0'))
# 000-1234

print(s.ljust(8, '0'))
# -1234000

print(s.center(8, '0'))
# 0-123400

これらも文字列(str型)のメソッドなので、数値に適用したい場合は組み込み関数str()で文字列に変換してから呼び出す。

任意の書式変換: format, f文字列

組み込み関数format()または文字列メソッドformat()でゼロ埋めを含む様々な書式変換ができる。文字列メソッドformat()では置換フィールド{}を使って文字列中に値を挿入できる。

ここでは右寄せのゼロ埋めの例を示す。中央寄せや左寄せなど、そのほかの例や詳しい使い方は以下の記事を参照。

文字列に対しては0>[文字数]で書式を指定する。符号は考慮されない。

s = '1234'

print(format(s, '0>8'))
# 00001234

print('Zero Padding: {:0>8}'.format(s))
# Zero Padding: 00001234

s = '-1234'

print(format(s, '0>8'))
# 000-1234

print('Zero Padding: {:0>8}'.format(s))
# Zero Padding: 000-1234

後述のように数値に対しては符号が考慮されるので、符号を考慮したい場合はint()で数値に変換する。その場合は0[文字数]で書式を指定する。

print(format(int(s), '08'))
# -0001234

print('Zero Padding: {:0>8}'.format(int(s)))
# Zero Padding: 000-1234

数値に対しては0[文字数]でOK。符号も考慮される。16進数に変換してゼロ埋め、というような処理もできる。詳細は上記の関連記事参照。

n = 1234

print(format(n, '08'))
# 00001234

print('Zero Padding: {:08}'.format(n))
# Zero Padding: 00001234

print(format(n, '08x'))
# 000004d2

print('Zero Padding: {:08x}'.format(n))
# Zero Padding: 000004d2

n = -1234

print(format(n, '08'))
# -0001234

print('Zero Padding: {:08}'.format(n))
# Zero Padding: -0001234

Python3.6からはf文字列(フォーマット文字列)も使用可能。それより前のバージョンでは使えないので注意。

print(f'Zero Padding: {n:08}')
# Zero Padding: -0001234

f文字列についての詳細は以下の記事を参照。

文字列に対するパーセント演算子

文字列に対してパーセント演算子を使うことで、書式変換した文字列を取得することができる。

なお、公式ではformat()が推奨されている。

注釈 ここで述べる書式化演算には様々な癖があり、よく間違いの元になっています (タプルや辞書を正しく表示できないなど)。新しい フォーマット文字列リテラル や str.format() インタフェースの方が間違いにくく、より強力で、柔軟で、さらに拡張可能です。
4. 組み込み型 — Python 3.6.5 ドキュメント

整数値に対しては%0[文字数]dでゼロ埋めが可能。符号も考慮される。

n = 1234

print('Zero Padding: %08d' % n)
# Zero Padding: 00001234

n = -1234

print('Zero Padding: %08d' % n)
# Zero Padding: -0001234

文字列に対しては空白(スペース)で埋められる。ゼロで埋めたい場合はint()で整数値に変換して処理する。

s = '1234'

print('Zero Padding: %08s' % s)
# Zero Padding:     1234

print('Zero Padding: %08d' % int(s))
# Zero Padding: 00001234
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事