Pythonでデータを扱う際、特定の桁数に合わせるために「0」で埋める処理は頻繁に発生します。
これを一般に「0埋め」または「ゼロパディング」と呼びます。
Pythonにはこの操作を簡潔に行うための専用メソッドである zfill() が用意されています。
本記事では、 zfill() の基本的な使い方から、実務で直面する特殊なケース、他のメソッドとの違いまでを解説します。
初心者の方から実務での応用を考えている方まで、幅広く役立つ内容となっています。
zfill()メソッドの基本仕様
zfill() は、Pythonの文字列(str)型に標準で備わっているメソッドです。
このメソッドは、指定した長さになるまで文字列の左側に 0 を追加します。
基本的な構文は string.zfill(width) となり、引数には全体の文字数を指定します。
まずは、最もシンプルな使用例を見てみましょう。
# 基本的なzfillの使用例
number_str = "42"
result = number_str.zfill(5)
print(result)
00042
このように、元の文字列が2文字で指定した幅が5の場合、不足している3文字分が 0 で埋められます。
注意すべき点は、元の文字列が指定した幅をすでに超えている場合、文字列はそのまま返されるという点です。
文字列が削られることはないため、データの欠損を防ぐ安全な設計となっています。
符号を含む文字列への特殊な動作
zfill() の最大の特徴は、プラス「+」やマイナス「-」といった符号を含む文字列を正しく処理できることにあります。
通常、単純な右詰め処理では符号の前に 0 が配置されてしまいます。
しかし、 zfill() は符号を認識し、符号の後に 0 を挿入してくれます。
# 符号を含む場合の挙動
positive = "+123"
negative = "-123"
print(positive.zfill(6))
print(negative.zfill(6))
+00123
-00123
この仕様により、金融系の数値データや科学計算のログ出力において、数値としての意味を崩さずにフォーマットを統一できます。
これは rjust() メソッドなどにはない、 zfill() 特有の便利な振る舞いです。
実務で役立つ活用パターン
ここからは、実際の開発現場で zfill() がどのように活用されるか、具体的なパターンを見ていきましょう。
1. 管理番号やIDのフォーマット統一
データベースの主キーや顧客IDなどを、一定の桁数で揃えたいケースは非常に多いです。
特にCSV出力などを行う際、桁数がバラバラだと並び替え(ソート)が正しく行われないことがあります。
# IDを5桁に統一する例
user_ids = ["1", "25", "304", "1500"]
formatted_ids = [uid.zfill(5) for uid in user_ids]
print(formatted_ids)
['00001', '00025', '00304', '01500']
このようにリスト内包表記と組み合わせることで、大量のデータを一括で整形することが可能です。
2. ファイル名の連番作成
スクレイピングで取得した画像や、機械学習用のデータセットに連番を振る際にも zfill() は重宝します。
ファイル名が「1.jpg」「10.jpg」「2.jpg」のように並んでしまうと、OS上での管理が不便になります。
# ファイル名用の連番を生成
for i in range(1, 11):
file_name = f"image_{str(i).zfill(3)}.jpg"
print(file_name)
image_001.jpg
image_002.jpg
...
image_010.jpg
3桁で 0 埋めしておくことで、ファイルシステム上で正しく昇順に並ぶようになります。
3. 日付や時刻データの補完
外部APIや古いシステムから取得した日付データが、 2026/5/7 のように月日が1桁になっている場合があります。
これを 2026/05/07 のような標準的な形式に変換する際にも役立ちます。
# 日付パーツの整形
year = "2026"
month = "5"
day = "7"
formatted_date = f"{year}/{month.zfill(2)}/{day.zfill(2)}"
print(formatted_date)
2026/05/07
他の0埋め手法との使い分け
Pythonには zfill() 以外にも、数値を 0 埋めする方法がいくつか存在します。
それぞれの特徴を理解し、状況に応じて適切な方法を選択することが重要です。
| メソッド名 | 主な用途 | 特徴 |
|---|---|---|
zfill() | 単純な文字列の0埋め | 符号を考慮してくれる。文字列専用。 |
| f-string | 複雑な文字列埋め込み | f"{num:05d}" のように記述。可読性が高い。 |
format() | 従来のフォーマット指定 | "{:05d}".format(num) 。古いコードでよく見かける。 |
rjust() | 任意の文字での埋め処理 | "123".rjust(5, '0') 。 0 以外の文字も使えるが符号は考慮しない。 |
f-strings(f文字列)との比較
現代的なPython開発では、 f-strings が主流となっています。
数値型を直接扱っている場合は、 f-strings を使ったほうが直感的な場合があります。
# f-stringによる0埋め
num = 123
print(f"{num:05d}")
00123
しかし、対象がすでに str 型であり、単純に桁数を揃えたいだけであれば、 zfill() のほうがコードが短く、意図が伝わりやすいというメリットがあります。
また、 「すでにある文字列がプラスから始まるかマイナスから始まるか不明」という動的なケースでは、 zfill() の符号考慮機能が強力な武器になります。
使用時の注意点とエラー回避策
zfill() を使用する際に、いくつかハマりやすいポイントがあります。
1. 数値型には直接使用できない
zfill() は文字列メソッドであるため、整数(int)や浮動小数点数(float)に直接使うことはできません。
数値に対して行いたい場合は、必ず str() 関数で文字列に変換する必要があります。
# エラーになる例
num = 100
# print(num.zfill(5)) # AttributeError: 'int' object has no attribute 'zfill'
# 正しい書き方
print(str(num).zfill(5))
2. None型への考慮
データベースから取得した値が None である可能性がある場合、そのまま zfill() を呼び出すとエラーになります。
実務では、値が存在するかどうかをチェックするか、空文字に変換してから処理する工夫が必要です。
# Noneを考慮した安全な処理
val = None
safe_val = (val or "").zfill(5)
print(f"'{safe_val}'")
'00000'
このように書くことで、データが欠損している場合でもプログラムを停止させずに処理を継続できます。
3. 全角数字の扱い
zfill() はあくまで 「半角の0」 で埋めるメソッドです。
対象の文字列が全角数字であっても、追加されるのは半角の 0 になります。
全角・半角が混在するデータを取り扱う際は、事前に正規化を行うなどの対応を検討してください。
まとめ
Pythonの zfill() メソッドは、文字列の 0 埋めを非常にシンプルに実現できる便利なツールです。
特に符号の前後を正しく判定して 0 を挿入する挙動は、他のメソッドにはない独自の強みと言えます。
管理番号の生成やファイル名の整形、ログデータのフォーマット統一など、その用途は多岐にわたります。
「文字列の桁数を揃えたい」という要件が出てきた際には、まず zfill() の活用を検討してみてください。
今回解説した符号の扱いや数値型からの変換といった注意点を押さえておくことで、より堅牢なコードを記述できるようになります。
他のフォーマット手法である f-strings や format() とも使い分けながら、効率的なプログラミングを実践していきましょう。
