閉じる

Pythonの文字列幅を揃える方法: 0埋め・左寄せ・右寄せ・中央寄せ

文字列の見た目の幅をきれいに揃えると、ログや表の可読性が大きく向上します。

本記事では、Pythonで幅の指定と埋め文字の制御を行い、左寄せ・右寄せ・中央寄せ・0埋めを実現する方法を、組み込みメソッドとフォーマット指定子の両面から丁寧に解説します。

日本語など全角文字の扱いの注意点も取り上げます。

Pythonで文字列幅を揃える基本

幅(width)と埋め文字(fill)の考え方

幅とは、出力したい最終文字列の長さを指します。

例えば幅6に揃える場合、元の文字列が3文字なら残り3文字分を埋めて調整します。

埋める際の文字は' '(スペース)が既定ですが、'-''*'など任意の1文字に変更できます。

幅は最終形の長さ、埋め文字は不足分を満たす文字というイメージを持つと理解しやすいです。

左寄せ・右寄せ・中央寄せの違い

左寄せは左に詰めて右側に埋め文字を追加します。

右寄せは右に詰め、中央寄せは左右に均等になるよう埋めます。

中央寄せで余りが出る場合は右側に1文字多く入ります。

値の種類に応じて見やすい寄せ方を選ぶのが基本です。

例えば数値は桁を合わせたいので右寄せ、名前やラベルは左寄せが読みやすいことが多いです。

0埋めとスペース埋めの使い分け

0埋めは桁数が意味を持つIDや連番、数値の桁揃えに適します。

一方、可読性重視の表ではスペース埋めでの左寄せや右寄せが自然です。

0埋めは桁数で並び替えや比較をしやすくする目的に向き、スペース埋めは視覚的な整列に向きます。

メソッドで揃える(ljust/rjust/center/zfill)

Pythonの文字列メソッドは直感的で学びやすいです。

ここではljustrjustcenterzfillを扱います。

左寄せ(ljust)

str.ljust(width, fillchar=' ')は左寄せします。

埋め文字は1文字のみ指定可能です。

Python
# 左寄せの基本
s = "ABC"
print("|" + s.ljust(6) + "|")         # 既定はスペース埋め
print("|" + s.ljust(6, '-') + "|")    # 埋め文字を'-'に変更
print("|" + s.ljust(2) + "|")         # 幅が短い場合はそのまま返る
実行結果
|ABC   |
|ABC---|
|ABC|

右寄せ(rjust)

str.rjust(width, fillchar=' ')は右寄せします。

数値表示と相性が良いです。

Python
# 右寄せで桁を揃える
s = "42"
print("|" + s.rjust(6) + "|")
print("|" + s.rjust(6, '0') + "|")  # '0'を使うとゼロ埋めのように見える
実行結果
|    42|
|000042|

中央寄せ(center)

str.center(width, fillchar=' ')は中央寄せです。

余りが出ると右側が1文字多くなります。

Python
# 見出しなどに便利な中央寄せ
title = "LOG"
print("|" + title.center(8) + "|")
print("|" + title.center(8, '=') + "|")
実行結果
|  LOG   |
|==LOG===|

0埋め(zfill)

str.zfill(width)は左側を0で埋めます。

先頭の符号(+/-)は保持され、その直後から0が入ります。

数値文字列向けに設計されています。

Python
# 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"となり、先頭の'-'が先に出ます。

金額表示で括弧で負数を表したいなどの要件があるときはformatf-stringの書式指定で制御する方が安全です。

f-stringとformatで揃える

f"...""{}".format(...)は共通のフォーマット指定ミニ言語を使います。

整列・桁幅・埋め文字・符号の細かな制御が可能です。

配置指定(<, >, ^)で左寄せ/右寄せ/中央寄せ

{値:<幅}で左寄せ、{値:>幅}で右寄せ、{値:^幅}で中央寄せです。

Python
# 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フラグが自動的に符号考慮のゼロ埋めになります。

Python
# 数値のゼロ埋め
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文字のみです。

Python
# 埋め文字と配置の同時指定
label = "ID"
print(f"|{label:*^10}|")  # '*'で中央埋め
print(f"|{label:.<10}|")  # '.'で左寄せ
print(f"|{label:_>10}|")  # '_'で右寄せ
実行結果
|****ID****|
|ID........|
|________ID|

符号付き数値のゼロ埋め(=)

=符号と本体の間に埋め文字を入れる配置です。

0フラグを使わず、スペースで符号の後ろを埋めることもできます。

Python
# '=' は符号の直後にパディングを挿入
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

実用例と注意点

表形式の列を揃える

カラムごとに寄せ方を変えると見やすくなります。

ラベルは左寄せ、数値は右寄せが基本です。

Python
# 売上表の体裁を整える
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|

通貨やIDの桁数を0埋め

IDや伝票番号では固定桁にゼロ埋めすると扱いやすくなります。

検索や並び替えで桁が揃うためです。

Python
# 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

一方、通貨表示では読みやすさを優先してスペース埋めで右寄せにし、ゼロ埋めは避けることが多いです。

Python
# 通貨は右寄せ + カンマ区切り、必要なら通貨記号も
amounts = [0, 1250, 9876543]
for a in amounts:
    print(f"|{a:>12,} JPY|")
実行結果
|           0 JPY|
|       1,250 JPY|
|   9,876,543 JPY|

全角文字(日本語)を含む場合の幅の扱い

重要

Pythonの幅指定はコードポイント数であり、端末やフォントの表示幅とは一致しないことがあります。

日本語や絵文字は1文字でも表示幅2や環境依存幅になるため、{:<10}のような指定で列がずれることがあります。

Python
# 日本語を含む列のずれ例
names = ["Taro", "山田", "Alice", "佐藤"]
for name in names:
    print(f"|{name:<8}|<- end")
実行結果
|Taro    |<- end
|山田      |<- end
|Alice   |<- end
|佐藤      |<- end

ずれを厳密に抑えるには、表示幅に基づくパディングが必要です。

代表的にはwcwidthライブラリを用います。

Python
# 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などで表示幅ベースのパディングを行うと、列ずれを最小化できます。

用途に応じて桁数で揃えるのか、見た目で揃えるのかを意識し、ふさわしい手段を選択してください。

この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!