文字列の見た目の幅をきれいに揃えると、ログや表の可読性が大きく向上します。
本記事では、Pythonで幅の指定と埋め文字の制御を行い、左寄せ・右寄せ・中央寄せ・0埋めを実現する方法を、組み込みメソッドとフォーマット指定子の両面から丁寧に解説します。
日本語など全角文字の扱いの注意点も取り上げます。
Pythonで文字列幅を揃える基本
幅(width)と埋め文字(fill)の考え方
幅とは、出力したい最終文字列の長さを指します。
例えば幅6に揃える場合、元の文字列が3文字なら残り3文字分を埋めて調整します。
埋める際の文字は' '(スペース)が既定ですが、'-'や'*'など任意の1文字に変更できます。
幅は最終形の長さ、埋め文字は不足分を満たす文字というイメージを持つと理解しやすいです。
左寄せ・右寄せ・中央寄せの違い
左寄せは左に詰めて右側に埋め文字を追加します。
右寄せは右に詰め、中央寄せは左右に均等になるよう埋めます。
中央寄せで余りが出る場合は右側に1文字多く入ります。
値の種類に応じて見やすい寄せ方を選ぶのが基本です。
例えば数値は桁を合わせたいので右寄せ、名前やラベルは左寄せが読みやすいことが多いです。
0埋めとスペース埋めの使い分け
0埋めは桁数が意味を持つIDや連番、数値の桁揃えに適します。
一方、可読性重視の表ではスペース埋めでの左寄せや右寄せが自然です。
0埋めは桁数で並び替えや比較をしやすくする目的に向き、スペース埋めは視覚的な整列に向きます。
メソッドで揃える(ljust/rjust/center/zfill)
Pythonの文字列メソッドは直感的で学びやすいです。
ここではljust、rjust、center、zfillを扱います。
左寄せ(ljust)
str.ljust(width, fillchar=' ')は左寄せします。
埋め文字は1文字のみ指定可能です。
# 左寄せの基本
s = "ABC"
print("|" + s.ljust(6) + "|") # 既定はスペース埋め
print("|" + s.ljust(6, '-') + "|") # 埋め文字を'-'に変更
print("|" + s.ljust(2) + "|") # 幅が短い場合はそのまま返る
|ABC |
|ABC---|
|ABC|
右寄せ(rjust)
str.rjust(width, fillchar=' ')は右寄せします。
数値表示と相性が良いです。
# 右寄せで桁を揃える
s = "42"
print("|" + s.rjust(6) + "|")
print("|" + s.rjust(6, '0') + "|") # '0'を使うとゼロ埋めのように見える
| 42|
|000042|
中央寄せ(center)
str.center(width, fillchar=' ')は中央寄せです。
余りが出ると右側が1文字多くなります。
# 見出しなどに便利な中央寄せ
title = "LOG"
print("|" + title.center(8) + "|")
print("|" + title.center(8, '=') + "|")
| LOG |
|==LOG===|
0埋め(zfill)
str.zfill(width)は左側を0で埋めます。
先頭の符号(+/-)は保持され、その直後から0が入ります。
数値文字列向けに設計されています。
# zfillは符号の直後から0を入れる
print("42".zfill(6)) # 正数
print("-42".zfill(6)) # 負数
print("+42".zfill(6)) # 正符号付き
print("abc".zfill(6)) # 数値以外でも動くが意図に注意
000042
-00042
+00042
000abc
マイナス符号とzfillの注意
zfillは符号位置を固定したまま0を挿入します。
負数を扱う場合、"-42".zfill(6)は"-00042"となり、先頭の'-'が先に出ます。
金額表示で括弧で負数を表したいなどの要件があるときはformatやf-stringの書式指定で制御する方が安全です。
f-stringとformatで揃える
f"..."と"{}".format(...)は共通のフォーマット指定ミニ言語を使います。
整列・桁幅・埋め文字・符号の細かな制御が可能です。
配置指定(<, >, ^)で左寄せ/右寄せ/中央寄せ
{値:<幅}で左寄せ、{値:>幅}で右寄せ、{値:^幅}で中央寄せです。
# f-stringで配置を指定
s = "ABC"
print(f"|{s:<6}|") # 左寄せ
print(f"|{s:>6}|") # 右寄せ
print(f"|{s:^6}|") # 中央寄せ
# formatメソッドでも同じ
print("|{0:<6}|{0:>6}|{0:^6}|".format("XY"))
|ABC |
| ABC|
| ABC |
|XY || XY|| XY |
0埋めは0フラグと桁幅(例: {n:08d})
数値をゼロ埋めする場合は0フラグと幅を組み合わせます。
数値型では0フラグが自動的に符号考慮のゼロ埋めになります。
# 数値のゼロ埋め
n1, n2 = 42, -42
print(f"{n1:08d}") # 8桁で0埋め
print(f"{n2:08d}") # 符号の後ろに0が入る
print("{:+08d}".format(n1)) # 正数にも+を表示
00000042
-0000042
+0000042
fillとalignの組み合わせ(例: {:*^10})
埋め文字と配置は{fill}{align}の順で書きます。
埋め文字は1文字のみです。
# 埋め文字と配置の同時指定
label = "ID"
print(f"|{label:*^10}|") # '*'で中央埋め
print(f"|{label:.<10}|") # '.'で左寄せ
print(f"|{label:_>10}|") # '_'で右寄せ
|****ID****|
|ID........|
|________ID|
符号付き数値のゼロ埋め(=)
=は符号と本体の間に埋め文字を入れる配置です。
0フラグを使わず、スペースで符号の後ろを埋めることもできます。
# '=' は符号の直後にパディングを挿入
n = -42
print(f"{n:=6d}") # スペースで6幅、符号の直後に入る
print(f"{n:=06d}") # 0埋めで6幅、符号の直後に0を入れる
# 正符号を常に出す例
p = 42
print(f"{p:=+6d}") # 符号の後ろにスペース
print(f"{p:=+06d}") # 符号の後ろに0
- 42
-00042
+ 42
+00042
実用例と注意点
表形式の列を揃える
カラムごとに寄せ方を変えると見やすくなります。
ラベルは左寄せ、数値は右寄せが基本です。
# 売上表の体裁を整える
rows = [
("Apple", 1200, 3),
("Banana", 85, 12),
("Cherry", 5300, 1),
]
# 見出し
print(f"|{'Item':<10}|{'Price':>8}|{'Qty':>5}|")
print("-" * 27)
# 行
for item, price, qty in rows:
print(f"|{item:<10}|{price:>8,d}|{qty:>5}|") # 価格はカンマ区切りに
|Item | Price| Qty|
---------------------------
|Apple | 1,200| 3|
|Banana | 85| 12|
|Cherry | 5,300| 1|
- 関連記事:リスト(list)の使い方
通貨やIDの桁数を0埋め
IDや伝票番号では固定桁にゼロ埋めすると扱いやすくなります。
検索や並び替えで桁が揃うためです。
# 8桁のゼロ埋めID
ids = [7, 123, 98765]
for n in ids:
print(f"INV-{n:08d}") # f-string
# 同等: str(n).zfill(8)
INV-00000007
INV-00000123
INV-00098765
一方、通貨表示では読みやすさを優先してスペース埋めで右寄せにし、ゼロ埋めは避けることが多いです。
# 通貨は右寄せ + カンマ区切り、必要なら通貨記号も
amounts = [0, 1250, 9876543]
for a in amounts:
print(f"|{a:>12,} JPY|")
| 0 JPY|
| 1,250 JPY|
| 9,876,543 JPY|
- 関連記事:f-string書式指定まとめ
全角文字(日本語)を含む場合の幅の扱い
Pythonの幅指定はコードポイント数であり、端末やフォントの表示幅とは一致しないことがあります。
日本語や絵文字は1文字でも表示幅2や環境依存幅になるため、{:<10}のような指定で列がずれることがあります。
# 日本語を含む列のずれ例
names = ["Taro", "山田", "Alice", "佐藤"]
for name in names:
print(f"|{name:<8}|<- end")
|Taro |<- end
|山田 |<- end
|Alice |<- end
|佐藤 |<- end
ずれを厳密に抑えるには、表示幅に基づくパディングが必要です。
代表的にはwcwidthライブラリを用います。
# pipでwcwidthをインストールしてから実行してください:
# pip install wcwidth
from wcwidth import wcswidth
def pad_display_width(s: str, width: int, align: str = '<', fill: str = ' ') -> str:
"""
表示幅(width)に合わせてパディングするユーティリティ。
align: '<' 左寄せ, '>' 右寄せ, '^' 中央寄せ
fill : 1文字の埋め文字
"""
assert len(fill) == 1, "fillは1文字で指定してください"
w = wcswidth(s)
if w < 0: # 制御文字などが含まれると-1になる
w = len(s)
if w >= width:
return s
remain = width - w
if align == '<':
return s + fill * remain
elif align == '>':
return fill * remain + s
elif align == '^':
left = remain // 2
right = remain - left
return fill * left + s + fill * right
else:
raise ValueError("alignは'<','>','^'のいずれかを指定してください")
# 使用例
for name in ["Taro", "山田", "Alice", "佐藤"]:
print("|" + pad_display_width(name, 8, '<', '.') + "|<- end")
|Taro....|<- end
|山田......|<- end
|Alice...|<- end
|佐藤......|<- end
環境のフォント設定や端末によって絵文字や一部記号の幅は変動することがある点にも注意してください。
印字や表計算に出力するなら、最終出力先で確認することが大切です。
- 関連記事:文字列の長さを調べる
以下に、主な手段の違いを簡単に整理します。
表: 文字揃え手段の比較
| 手段 | 対象 | 埋め文字 | 符号の扱い | 0埋めの明示性 | 備考 |
|---|---|---|---|---|---|
| ljust/rjust/center | 文字列全般 | 1文字のみ可 | そのまま | 明示不可 | シンプルで読みやすい |
| zfill | 数値用文字列 | 0固定 | 符号の直後に0 | 明示的 | 数値文字列前提。一般文字列には不向き |
| f-string/format | 文字列・数値 | 1文字のみ可 | =で符号後にパディング | 明示的 | 柔軟。<,>,^,=,0,+,幅,型指定が利用可能 |
| wcwidth利用 | 画面表示幅 | 実装次第 | 実装次第 | 実装次第 | 日本語や絵文字のずれ対策に有効 |
まずはf-stringでの整形を基本にし、必要に応じてメソッドやライブラリを使い分けると実務で安定します。
- 関連記事:外部ライブラリを使う理由と選び方
まとめ
本記事では、Pythonで文字列の幅を揃える方法を体系的に解説しました。
ljust・rjust・center・zfillの基本に加え、f-stringとformatの書式指定を使えば、左寄せ・右寄せ・中央寄せ・0埋め・符号位置制御まで柔軟に扱えます。
さらに、日本語など全角文字が混在する場合はwcwidthなどで表示幅ベースのパディングを行うと、列ずれを最小化できます。
用途に応じて桁数で揃えるのか、見た目で揃えるのかを意識し、ふさわしい手段を選択してください。
