Pythonで文字列をパディングする

文字列のパディングとは、通常、文字列の片端または両端に情報量の少ない文字を追加することを指します。

これは、出力の書式設定や位置合わせの目的で行われることがほとんどですが、実用上有用な用途があります。

文字列のパディングの頻繁な使用例は、表のような情報を表形式で出力することです。

これは様々な方法で行うことができ、Pandasを使ってデータを実際のテーブルに変換することもできます。

この方法では、Pythonはそれ自体で出力の書式設定を処理することになります。

この記事では、Pythonで文字列をパッドする方法を説明します。

例えば、以下の3つのリストがあるとします。

medicine1 = ['Morning', 'dispirine', '1 mg']
medicine2 = ['Noon', 'arinic', '2 mg']
medicine3 = ['Evening', 'Long_capsule_name', '32 mg']


これらを文字列にするには、 join() 関数を使用します。

print(str.join(' ', medicine1))
print(str.join(' ', medicine2))
print(str.join(' ', medicine3))


という、ちょっと不格好な出力が得られます。

Morning Dispirine 1 mg
Noon Arinic 2 mg
Evening Long_capsule_name 32 mg


これに対処するために、for/whileループを書いて、文字列が一定の長さに達するまでスペースを追加し、すべてのデータが視覚的に簡単に検査できるように適切に整列されていることを確認することができます。

また、同じ目標を達成するための組み込み関数を使用することもできます。

この記事で取り上げるのは、以下の関数です。

ljust()center()rjust()zfill()format()` です。

これらの関数はいずれも、文字列の両端にスペースを含む一定の文字数を追加するために使用することができます。

パディングの種類

上記の関数を詳しく見る前に、パディングの種類を説明します。

左側パディング

文字列に左詰めをすることは、文字列の先頭に指定された文字を追加して、指定された長さにすることです。

左詰めは、単純な書式設定とアラインメントの理由以外では、連続した番号で始まるファイルに名前を付けるときに非常に便利です。

たとえば、11個のファイルに名前を付ける必要があり、それぞれが1から11までの数字で始まるとします。

単にファイルの先頭に番号を付けただけなら、ほとんどのオペレーティングシステムは次のような順序でファイルをソートするでしょう。

1,10,11,2`, という具合に。

もちろん、これは辞書式ソートの規則によるものですが、ファイル名の先頭に0を1つ以上付けることで、このような状況を避けることができます(例:01, 02, 03…)。

これは、数字を適切な数のゼロで効果的に左詰めにすることで、元の値を維持することができます。

これは、文字列が左寄せになるような効果をもたらします。

センターパディング

これは、新しい文字列が与えられた長さに達するまで、与えられた文字を文字列の両側に等しく追加することを意味します。

これを使うと、文字列が指定された長さの中心に効果的に配置されます。

これは通常の文字列です。

これは、通常の文字列です。

これは、センターパディングされた文字列です。

右詰め

右詰めは、左詰めに似ています。

文字列が一定の長さに達するまで、指定した文字が文字列の末尾に追加されます。

文字列のパディングのためのPython関数

Pythonは文字列をフォーマットして扱うための多くの関数を提供しますが、それらの使い方はユースケースと開発者の個人的な好みに依存します。

これから説明する関数のほとんどは、文字列の片側にパディングを追加するテキストジャスティフィケーション(文字列の両端揃え)を扱います。

たとえば、文字列を左寄せにするには、文字列の末尾(右側)にパディングを追加する必要があります。

注意: width または len パラメータを必要とするすべての関数では、元の文字列が指定した width または len よりも長い場合、文字列全体がそのまま使用されます。

そのため、 width の値を選択する際には、最も長い文字列を考慮するか、長さの上限を設定する必要があります。

ljust()

ljust()` 関数は、文字列を左寄せにして、右詰めをします。

ljust()関数は 2 つのパラメータを受け取ります。

widthfillcharです。

width は必須で、パディングを追加した後の文字列の長さを指定します。

2番目のパラメータはオプションで、元の文字列に追加される文字を表します。

デフォルト値はスペース文字、つまり ' ' です。

これは、冒頭の例のように、表のようなデータを印刷するときに特に有効なオプションです。

medicine1 = ['Morning', 'Dispirine', '1 mg']
medicine2 = ['Noon', 'Arinic', '2 mg']
medicine3 = ['Evening', 'Long_capsule_name', '32 mg']


for medicine in [medicine1, medicine2, medicine3]:
    for entry in medicine:
        print(entry.ljust(25), end='')
    print()


この場合、次のような出力が得られます。

Morning                  Dispirine                1 mg                     
Noon                     Arinic                   2 mg                     
Evening                  Long_capsule_name        32 mg


center()

center()関数は、文字列を指定されたwidthの中央に揃え、両側に均等にパディングを追加します。

パラメータはljust()関数と同じで、必須のwidthと、オプションのfillchar` パラメータです。

list_of_strings = ["This can give us", "text that's center aligned", "within the specified width"]


for s in list_of_strings:
    print(s.center(50, ' '))


出力

出力: “`
This can give us
text that’s center aligned
within the specified width




#### rjust()

前の2つの関数と同様に、 `rjust()` は文字列の左側 (先頭) にパディングを追加することで、文字列を右寄せにする関数です。

ここでも、パラメータは必須の `width` とオプションの `fillchar` です。前に述べたように、この関数はより直感的にソートできるため、数字で始まるファイル名を付けるときに非常に便利です。

list_of_names_original = []
list_of_names_padded = []

for n in range(1, 13):
list_of_names_original.append(str(n) + “_name”)
list_of_names_padded.append(str(n).rjust(2, ‘0’) + “_name”)

print(“Lexicographical sorting without padding:”)
print(sorted(list_of_names_original))
print()

print(“Lexicographical sorting with padding:”)
print(sorted(list_of_names_padded))


このコードを実行すると、次のようになります。

Lexicographical sorting without padding:
[’10_name’, ’11_name’, ’12_name’, ‘1_name’, ‘2_name’, ‘3_name’, ‘4_name’, ‘5_name’, ‘6_name’, ‘7_name’, ‘8_name’, ‘9_name’]

Lexicographical sorting with padding:
[’01_name’, ’02_name’, ’03_name’, ’04_name’, ’05_name’, ’06_name’, ’07_name’, ’08_name’, ’09_name’, ’10_name’, ’11_name’, ’12_name’]




#### zfill()

zfill()` 関数は、ゼロを指定した `rjust()` と非常によく似た動作をします。これは、文字列が指定された長さに達するまで、与えられた文字列をゼロで埋め尽くします。

唯一の違いは、文字列がプラス(`+`)またはマイナス(`-`)記号で始まっている場合、パディングはその記号の後から始まるということです。

neutral = ’15’
positive = ‘+15’
negative = ‘-15’
length = 4

print(neutral.zfill(length))
print(positive.zfill(length+1))
print(negative.zfill(length+1))


これは、文字列が数値であった場合に、数値の元の値を維持するために行われます。このコードを実行すると、次のようになります。

0015
+0015
-0015




#### format()

format()` 関数は、このリストの中で最も高度なものです。この関数ひとつで、左、右、そして中央のパディングを行うことができます。また、他のフォーマットにも使用されますが、ここではパディングの機能のみを取り上げます。

この関数は、指定された値をフォーマットし、`{}` で定義されたプレースホルダーに格納した文字列を返します。

プレースホルダーは、名前付きインデックス、番号付きインデックス、あるいは空の中括弧で識別することができます。この関数を使ってパディングを追加する方法を見る前に、これらのプレースホルダーがどのように見えるかを簡単に例示しておきます。

print(“Placeholders can given by {0}, or with {value}”.format(“adding a number”, value=”a named value”))
print(“They can also be given {}, without adding a {} or {}”.format(“implicitly”, “number”, “name”))


この場合、次のようになります。

Placeholders can given by adding a number, or with a named value
They can also be given implicitly, without adding a number or name


これらのプレースホルダーには、さまざまな書式オプションがあります。これらのオプションを使用して、さまざまな種類の文字列のパディングを実現する方法を見てみましょう。

* 左詰め。文字列を右寄せにする(先頭に文字を追加する)には、プレースホルダーの内側で `>` とその幅を指定する数字を使用します。

txt = “We {:8} Python.”
print(txt.format(‘love’))


とすると、次のようになります。

We love Python.

* センターパディング。同様に、`^` を使って中央揃えにすることができます。

txt = “We {:^8} Python.”
print(txt.format(‘love’))


We love Python.

* 右詰め。プレースホルダーの中で `<` を使うと、文字列を左寄せにすることができます。

txt = “We {:<8} Python.”
print(txt.format(‘love’))


We love Python.


また、空白文字以外の文字を追加するには、`&gt;`、`^`、`&lt;`の前に指定した文字を追加します。

print(‘{:*^50}’.format(‘Center padding with a specific character’))


*Center padding with a specific character***

“`

format()` 関数のさまざまな可能性については、Guide to Formatting Strings with Python で詳しく説明しています。

結論

Pythonで文字列にパディングを追加するのは比較的簡単な処理ですが、特にデータをテーブルのように読み取ることができる場合は、出力の可読性を著しく向上させることができます。

この記事では、Pythonの文字列のパディングに対するビルトインのアプローチとして、 ljust(), rjust(), center(), zfill()format() 関数を取り上げました。

タイトルとURLをコピーしました