Python 3で文字列フォーマッターを使用する方法

###導入

Pythonのstr.format()メソッドは、stringクラスの一部であり、変数の置換と値のフォーマットを行うことができます。これにより、文字列内で要素を位置指定して連結することができます。

このチュートリアルでは、Pythonのフォーマッタの一般的な使用方法について説明します。これにより、コードやプログラムをより読みやすく、ユーザーフレンドリーにすることができます。

前提条件

Python 3がインストールされ、コンピューターまたはサーバーにプログラミング環境が設定されている必要があります。プログラミング環境が設定されていない場合は、OS(Ubuntu、CentOS、Debianなど)に適したローカルプログラミング環境またはサーバー上のプログラミング環境のインストールおよび設定ガイドを参照できます。

##フォーマッタの使用

フォーマッターは、文字列に1つ以上の置換フィールドまたはプレースホルダーを配置し、{}で定義されたものを呼び出すことで機能します。そして、str.format()メソッドを呼び出します。メソッドには、文字列と連結したい値を渡します。この値は、プログラムを実行する際にプレースホルダーが配置されている場所と同じ位置に渡されます。

フォーマッターを使用した文字列を出力してみましょう:

情報:このチュートリアルの例コードに従って作業するには、ローカルシステムでPythonインタラクティブシェルを開き、python3コマンドを実行します。その後、>>>プロンプトの後に例を追加、コピー、または貼り付けることができます。

print("Sammy has {} balloons.".format(5))
Output
Sammy has 5 balloons.

上記の例では、プレースホルダーとして一対の中括弧を持つ文字列を構築しました:

"Sammy has {} balloons."

その後、str.format()メソッドを追加し、そのメソッドに整数5の値を渡しました。これにより、中括弧の場所に5の値が文字列に挿入されます:

Sammy has 5 balloons.

また、フォーマッターのプレースホルダーの値を代入するために変数を割り当てることもできます:

open_string = "Sammy loves {}."
print(open_string.format("open source"))
Output
Sammy loves open source.

この2番目の例では、文字列"open source"を元の文字列の中の中括弧に置き換えて、より大きな文字列と連結しました。

Pythonのフォーマッターを使用すると、str.format()メソッドで渡す値のプレースホルダーとして中括弧を使用できます。

##複数のプレースホルダーを使用したフォーマッター

複数のペアの中括弧を使用すると、フォーマッタを使用できます。上記の文章にもう1つの変数の代入を追加したい場合は、元の文字列に2番目の中括弧のペアを追加し、メソッドに2つ目の値を渡すことで行うことができます。

new_open_string = "Sammy loves {} {}."                      #2 {} プレースホルダ
print(new_open_string.format("open-source", "software"))    #コンマで区切られた2つの文字列をメソッドに渡す
Output
Sammy loves open-source software.

別の代入を追加するには、元の文字列に2番目の中括弧のペアを追加しました。次に、2つの文字列をstr.format()メソッドにコンマで区切って渡しました。

同じ構文に従って、追加の代入を追加することができます。

sammy_string = "Sammy loves {} {}, and has {} {}."                      #4 {} プレースホルダ
print(sammy_string.format("open-source", "software", 5, "balloons"))    #メソッドに4つの文字列を渡す
Output
Sammy loves open-source software, and has 5 balloons.

sammy_stringでは、変数の代入のために4組の中括弧を追加しました。次に、4つの値をstr.format()メソッドに渡し、文字列と整数のデータ型を混在させました。これらの値はそれぞれ、コンマで区切られています。

##位置引数とキーワード引数を使用したフォーマッタの並べ替え

中括弧を空のままにしてパラメータを指定しない場合、Pythonはstr.format()メソッドを通じて渡される値を順番に置き換えます。これまで見てきたように、2つの空の中括弧と2つの値が渡されたフォーマッタの構築は次のようになります。

print("Sammy the {} has a pet {}!".format("shark", "pilot fish"))
Output
Sammy the shark has a pet pilot fish!

最初の中括弧のペアは、"shark"の文字列値に置き換えられ、2番目のペアは"pilot fish"の文字列値に置き換えられます。

メソッド内に存在する値は次のように見えます:

("shark", "pilot fish")

基本的に、それらはタプルデータ型であり、タプルに含まれる各個々の値は、そのインデックス番号を使用して呼び出すことができます。 インデックス番号は0から始まります。

これらのインデックス番号を元の文字列内のプレースホルダーとして使用することができます:

print("Sammy the {0} has a pet {1}!".format("shark", "pilot fish"))

上記の例では、インデックス番号をブレースに渡さないで呼び出しているため、出力は次のとおりです:

Output
Sammy the shark has a pet pilot fish!

ただし、プレースホルダーのパラメーターでインデックス番号を逆にすると、文字列に渡される値を逆にすることができます:

print("Sammy the {1} has a pet {0}!".format("shark", "pilot fish"))
Output
Sammy the pilot fish has a pet shark!

タプル内のインデックス位置0と1に値があるタプルのインデックス番号2を呼び出すと、範囲外の値が呼び出されます。 範囲外のインデックス番号を呼び出すと、エラーメッセージが表示されます:

print("Sammy the {2} has a pet {1}!".format("shark", "pilot fish"))
Output
IndexError: tuple index out of range

見ているエラーメッセージは、タプルに値がインデックス番号0と1にしかないことを示しているため、インデックス番号2が範囲外になります。

よりよくフォーマットを並べ替える方法を理解するために、いくつかの追加のプレースホルダーとそれに渡すいくつかの値を追加しましょう。 まず、4つのプレースホルダーを含む新しい文字列を次に示します:

print("Sammy is a {}, {}, and {} {}!".format("happy", "smiling", "blue", "shark"))
Output
Sammy is a happy, smiling and blue shark!

パラメーターがない場合、str.format()メソッドに渡される値は順番に文字列に連結されます。

タプルに含まれる文字列値は、次のインデックス番号に対応します:

“happy” “smiling” “blue” “shark”
0 1 2 3

インデックス番号を使用して、文字列内で値が表示される順序を変更しましょう:

print("Sammy is a {3}, {2}, and {1} {0}!".format("happy", "smiling", "blue", "shark"))
Output
Sammy is a shark, blue, and smiling happy!

3番目のインデックス番号で開始したので、最初に"shark"の最後の値を呼び出しました。パラメーターとして含まれる他のインデックス番号は、元の文字列内で単語が表示される順序を変更します。

位置引数に加えて、キーワード引数も導入できます。これらはキーワード名によって呼び出されます:

print("Sammy the {0} {1} a {pr}.".format("shark", "made", pr = "pull request"))
Output
Sammy the shark made a pull request.

この例では、位置引数と一緒にキーワード引数が使用されています。位置引数と一緒にキーワード引数prを埋め込み、これらの引数を移動させて結果の文字列を変更できます:

print("Sammy the {pr} {1} a {0}.".format("shark", "made", pr = "pull request"))
Output
Sammy the pull request made a shark.

文字列フォーマッターを使用した位置引数とキーワード引数は、元の文字列を再配置して操作するためのより細かな制御を提供します。

##型の指定

構文の波括弧内にさらに多くのパラメーターを含めることができます。フォーマットコード構文{field_name:conversion}を使用します。ここでfield_nameは、再配置セクションで説明したstr.format()メソッドへの引数のインデックス番号を指定し、conversionはフォーマッターと一緒に使用するデータ型の変換コードを指します。

変換タイプは、Pythonが使用する単一文字型コードを指します。ここで使用するコードは、文字列にはs、10進整数(10進数)を表示するためにd、小数点以下の桁を持つ浮動小数点数を表示するために使用するfです。Python 3の公式ドキュメントでフォーマット仕様ミニ言語について詳しく読むことができます。

メソッドを介して整数が渡されたが、f変換タイプ引数を追加して浮動小数点数として表示したい場合の例を見てみましょう。

print("Sammy ate {0:f} percent of a {1}!".format(75, "pizza"))
Output
Sammy ate 75.000000 percent of a pizza!

最初の波括弧の置換フィールドに浮動小数点数を出力するために{field_name:conversion}の構文を使用しました。第2の波括弧は、{field_name}のみを使用します。

上記の例では、小数点以下に多くの数字が表示されていますが、それらを制限することができます。浮動小数点値に対してfを指定する場合、小数点の後に含める桁数を含むフルストップ.を追加することで、その値の精度をさらに指定できます。

サミーがピザの75.765367%を食べた場合でも、高い精度が必要ない場合は、変換タイプfの前に.3を追加することで小数点以下の桁数を3桁に制限できます。

print("Sammy ate {0:.3f} percent of a pizza!".format(75.765367))
Output
Sammy ate 75.765 percent of a pizza!

小数点以下1桁だけを表示したい場合は、文字列とメソッドを以下のように書き直すことができます。

print("Sammy ate {0:.1f} percent of a pizza!".format(75.765367))
Output
Sammy ate 75.8 percent of a pizza!

精度を変更すると、数値が四捨五入されることに注意してください。

数値を小数点以下の桁なしで表示する場合、floatとして表示されますが、d変換タイプを使用してfloatを整数に変換しようとすると、エラーが発生します。

print("Sammy ate {0:d} percent of a pizza!".format(75.765367))
Output
ValueError: Unknown format code 'd' for object of type 'float'

小数点以下の桁を表示したくない場合は、フォーマッタを次のように書くことができます。

print("Sammy ate {0:.0f} percent of a pizza!".format(75.765367))
Output
Sammy ate 76 percent of a pizza!

これにより、floatが整数に変換されるのではなく、小数点以下の表示桁数が制限されます。

##パディング変数の置換

プレースホルダは置換フィールドであるため、追加のパラメータを使用してフィールドサイズを増やすことによって、要素の周囲にパディングを追加したり、スペースを作成したりすることができます。これは、多くのデータを視覚的に整理する必要がある場合に便利です。

構文の波括弧の中のコロン:の後に文字列のフィールドサイズを示す数字を追加します。

print("Sammy has {0:4} red {1:16}!".format(5, "balloons"))
Output
Sammy has 5 red balloons !

上記の例では、数字5に文字フィールドサイズ4を、文字列balloonsには(長い文字列なので)文字フィールドサイズ16を指定しました。

デフォルトでは、文字列はフィールド内で左寄せされ、数字は右寄せされます。これを変更するには、コロンの後に配置コードを置きます。<はフィールド内のテキストを左寄せし、^はテキストをフィールド内で中央寄せし、>は右寄せします。

数値を左寄せし、文字列を中央寄せにしてみましょう。

print("Sammy has {0:<4} red {1:^16}!".format(5, "balloons"))
Output
Sammy has 5 red balloons !

今、5が左寄せされ、redの前のフィールドにスペースが提供され、balloonsはそのフィールドで中央揃えされ、その両側にスペースがあります。

デフォルトでは、フォーマッターでフィールドを拡張すると、Pythonはそのフィールドを空白文字で埋めます。私たちは、その文字を指定することで、別の文字に変更することができます。例えば、コロンの直後に欲しい文字を指定することで:

print("{:*^20s}".format("Sammy"))
Output
*******Sammy********

str.format()に渡される文字列を、0のインデックス位置に受け入れています。私たちは、別の方法を指定しなかったので、コロンを含み、フィールドを埋めるのにスペースの代わりに*を使用することを指定しています。文字列は^で中央揃えされ、フィールドのサイズは20文字であり、文字列変換タイプであることも示しています。

これらのパラメータを以前使用したパラメータと組み合わせることができます:

print("Sammy ate {0:5.0f} percent of a pizza!".format(75.765367))
Output
Sammy ate 76 percent of a pizza!

中括弧内のパラメータでは、フロートのインデックスフィールド番号とコロンを指定し、フィールド番号のサイズとフルストップを含め、小数点以下の桁数を記述し、fの変換タイプを指定しました。

##変数の使用

これまで、整数、浮動小数点数、文字列をstr.format()メソッドに渡してきましたが、変数も同様にメソッドを通じて渡すことができます。これは他の変数と同じように機能します。

nBalloons = 8
print("Sammy has {} balloons today!".format(nBalloons))
Output
Sammy has 8 balloons today!

元の文字列とメソッドに渡される内容の両方に変数を使用できます:

sammy = "Sammy has {} balloons today!"
nBalloons = 8
print(sammy.format(nBalloons))
Output
Sammy has 8 balloons today!

変数は、フォーマッター構文の各部分に簡単に代入できます。これにより、ユーザー生成の入力を受け取り、それらの値を変数に割り当てる際に作業しやすくなります。

##データの整理にフォーマッターを使用する

フォーマッターは、大量のデータを視覚的に整理する際に最適な方法で使用されています。データベースをユーザーに表示する場合、フォーマッターを使用してフィールドのサイズを拡大し、配置を変更することで、出力をより読みやすくすることができます。

Pythonの典型的なforループを見てみましょう。これは、3から12までの範囲でii*i、およびi*i*iを出力します。

for i in range(3,13):
    print(i, i*i, i*i*i)
Output
3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 11 121 1331 12 144 1728

出力はある程度整理されていますが、数字がお互いの列にオーバーフローしているため、出力の下部が読みにくくなっています。多くの小さい数値と大きな数値からなる大きなデータセットを扱っている場合、これは問題になります。

これらの数字にもっとスペースを与えるためにフォーマッターを使用しましょう:

for i in range(3,13):
    print("{:3d} {:4d} {:5d}".format(i, i*i, i*i*i))

ここでは、波括弧の中に、インデックス番号のフィールド名を追加せずに、コロンで始めて、フィールドのサイズの数値を続け、整数で作業しているのでd変換タイプを記述しました。この例では、各期待される出力のサイズに対応して、最大可能な数値サイズに応じて2つの追加の文字スペースを与えました。そのため、出力は次のようになります:

Output
3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 11 121 1331 12 144 1728

より大きな数値に対応するために、一貫したフィールドサイズ番号を指定できます。これにより、均一な列を持つことができ、より大きな数値に対応できます。

for i in range(3,13):
    print("{:6d} {:6d} {:6d}".format(i, i*i, i*i*i))
Output
3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 11 121 1331 12 144 1728

## 結論

変数の置換にフォーマッターを使用することは、文字列を連結し値とデータを整理する効果的な方法です。フォーマッターは、変数の置換を文字列に渡すための基本的ですが非記述的な方法を表し、出力が読みやすくユーザーフレンドリーであることを確認するのに役立ちます。

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-string-formatters-in-python-3