Python 3で文字列フォーマッタを使用する方法
###紹介
Pythonのstr.format()メソッドは、文字列クラスにおいて変数の置換と値のフォーマットを行うことができます。これにより、位置指定フォーマットを通じて文字列内の要素を結合することができます。
このチュートリアルでは、Pythonのフォーマッターの一般的な使い方について説明します。これは、コードとプログラムをより読みやすく、ユーザーフレンドリーにするのに役立ちます。
前提条件
Python 3がインストールされていて、コンピュータまたはサーバーにプログラミング環境がセットアップされている必要があります。プログラミング環境がセットアップされていない場合は、オペレーティングシステム(Ubuntu、CentOS、Debianなど)に適したローカルプログラミング環境またはサーバー上のプログラミング環境のインストールおよびセットアップガイドを参照できます。
##フォーマッターの使用
フォーマッターは、1つ以上の置換フィールドまたはプレースホルダーを文字列に入れ、str.format()メソッドを呼び出すことで動作します。メソッドには、文字列に連結したい値を渡します。この値は、プログラムを実行する際にプレースホルダーの位置にそのまま渡されます。
フォーマッターを使用した文字列を印刷しましょう:
情報:このチュートリアルの例コードに従うには、ローカルシステムで python3 コマンドを実行して Python インタラクティブシェルを開きます。そして、>>> プロンプトの後に例をコピー、貼り付け、または編集することができます。
print("Sammy has {} balloons.".format(5))
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"))
Sammy loves open source.
この二つ目の例では、元の文字列の波かっこを置き換えて、"オープンソース"という文字列を大きな文字列と連結しました。
Pythonのフォーマッタを使うと、値を挿入するためのプレースホルダーとして波括弧を使用でき、str.format()メソッドを通じて値を渡すことができます。
##複数のプレースホルダーを使用したフォーマッター
フォーマッターを使用する際に、複数の波括弧のペアを使用できます。上記の文に別の変数置換を追加したい場合は、2番目の波括弧のペアを追加し、そのメソッドに2番目の値を渡すことで実現できます。
new_open_string = "Sammy loves {} {}." #2 {} placeholders
print(new_open_string.format("open-source", "software")) #Pass 2 strings into method, separated by a comma
Sammy loves open-source software.
別の置換を追加するために、元の文字列に2番目の波括弧のペアを追加しました。それから、2つの文字列をカンマで区切ってstr.format()メソッドに渡しました。
同じ構文に従って、追加の置換を加えることができます:
sammy_string = "Sammy loves {} {}, and has {} {}." #4 {} placeholders
print(sammy_string.format("open-source", "software", 5, "balloons")) #Pass 4 strings into method
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"))
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"))
上記の例では、タプル内の値を順番に呼び出しているため、波括弧内にインデックス番号を渡さずに得られる出力になります:
Sammy the shark has a pet pilot fish!
しかし、プレースホルダーのパラメータでインデックス番号を逆にすると、文字列に渡される値を逆にすることができます:
print("Sammy the {1} has a pet {0}!".format("shark", "pilot fish"))
Sammy the pilot fish has a pet shark!
インデックス位置0と1に値があるタプルでインデックス番号2を呼び出すと、範囲外の値を呼び出していることになります。範囲外のインデックス番号を呼び出すと、エラーメッセージが表示されます。
print("Sammy the {2} has a pet {1}!".format("shark", "pilot fish"))
IndexError: tuple index out of range
エラーメッセージは、タプルがインデックス番号0と1にのみ値を持っていることを示しているため、インデックス番号2が範囲外であることを意味しています。
プレースホルダーをいくつか追加し、それに渡す値もいくつか追加して、フォーマッターの順序をもう少し理解できるようにしましょう。まず、こちらが4つのプレースホルダーを含む新しい文字列です:
print("Sammy is a {}, {}, and {} {}!".format("happy", "smiling", "blue", "shark"))
Sammy is a happy, smiling and blue shark!
パラメーターなしで、str.format() メソッドに渡された値は、順番に文字列に連結されます。
タプルに含まれる文字列の値は、次のインデックス番号に対応します。
| 「幸せ」 | 笑顔で | 青 | サメ |
|---|---|---|---|
| 1 | 2 | 3 |
値のインデックス番号を使用して、文字列内での表示順序を変更しましょう:
print("Sammy is a {3}, {2}, and {1} {0}!".format("happy", "smiling", "blue", "shark"))
Sammy is a shark, blue, and smiling happy!
インデックス番号3から始めたため、"shark"の最後の値を最初に呼び出しました。他のインデックス番号はパラメータとして含まれており、元の文字列内の単語の表示順序を変えます。
位置引数に加えて、キーワード名で呼び出されるキーワード引数を導入することもできます。
print("Sammy the {0} {1} a {pr}.".format("shark", "made", pr = "pull request"))
Sammy the shark made a pull request.
この例は、位置引数と共にキーワード引数が使用されていることを示しています。キーワード引数prを位置引数と一緒に記入することができ、これらの引数を移動させることで結果の文字列を変えることができます:
print("Sammy the {pr} {1} a {0}.".format("shark", "made", pr = "pull request"))
Sammy the pull request made a shark.
位置引数とキーワード引数を文字列フォーマッタで使用することで、元の文字列の操作を順序変更を通じてよりコントロールできるようになります。
##タイプの指定
私たちは構文の中で波かっこ内にもっと多くのパラメータを含めることができます。フォーマットコード構文{field_name:conversion}を使用します。ここで、field_nameは、私たちが再配置セクションで説明したstr.format()メソッドに対する引数のインデックス番号を指定し、conversionはフォーマッタで使用しているデータ型の変換コードを指します。
変換タイプは、Pythonが使用する1文字のタイプコードを指します。ここで使用するコードは、文字列にはs、10進数の整数を表示するにはd、小数点以下の桁数を持つ浮動小数点数を表示するために使用するfです。Python 3の公式ドキュメントでフォーマット仕様ミニ言語についてもっと読むことができます。
整数がメソッドを通じて渡される例を見てみましょう。しかし、f変換タイプ引数を追加することで、浮動小数点数として表示したいです:
print("Sammy ate {0:f} percent of a {1}!".format(75, "pizza"))
Sammy ate 75.000000 percent of a pizza!
最初の波かっこ置換フィールドに対して浮動小数点数を出力するために、{field_name:conversion} の構文を使用しました。2番目の波かっこのみが最初のパラメータ{field_name}を使用しています。
上記の例では、10進法の小数点以下に多くの数字が表示されていますが、それを制限することができます。浮動小数点の値に対して f を指定する際には、小数点以下の桁数を含めるために、ピリオド . を追加して、その後に含めたい桁数を指定することができます。
もしサミーがピザの75.765367%を食べたのなら、しかし高い精度を必要としないので、小数点以下を3桁に制限するために、変換タイプfの前に.3を追加することができます:
print("Sammy ate {0:.3f} percent of a pizza!".format(75.765367))
Sammy ate 75.765 percent of a pizza!
もし小数点以下1桁のみが必要な場合は、文字列とメソッドを次のように書き換えることができます。
print("Sammy ate {0:.1f} percent of a pizza!".format(75.765367))
Sammy ate 75.8 percent of a pizza!
精度を変更すると、数値が丸められることに注意してください。
小数点がない数値を浮動小数点数として表示しても、d変換タイプを使用して浮動小数点数を整数に変換しようとすると、エラーが発生します:
print("Sammy ate {0:d} percent of a pizza!".format(75.765367))
ValueError: Unknown format code 'd' for object of type 'float'
小数点以下の桁を表示したくない場合は、フォーマッタを次のように書くことができます。
print("Sammy ate {0:.0f} percent of a pizza!".format(75.765367))
Sammy ate 76 percent of a pizza!
これは浮動小数点数を整数に変換するのではなく、小数点以下に表示される桁数を制限します。
##パディング変数置換
プレースホルダーは置き換えフィールドであるため、追加のパラメータを通じてフィールドサイズを増加させることで、要素の周りに余白を作ることができます。これは、多くのデータを視覚的に整理する必要がある場合に役立ちます。
コロン : の後に中括弧内の構文にフィールドサイズを示す数字(文字数に関して)を追加できます:
print("Sammy has {0:4} red {1:16}!".format(5, "balloons"))
Sammy has 5 red balloons !
上記の例では、数値5に文字フィールドのサイズ4を与え、文字列balloonsには文字フィールドのサイズ16を与えました(長い文字列のため)。
私たちが見るように、デフォルトでは文字列はフィールド内で左揃えになっており、数字は右揃えになっています。これを変更するには、コロンの後に配置コードを置くことができます。< はフィールド内のテキストを左揃えにし、^ はフィールド内のテキストを中央揃えにし、> は右揃えにします。
数字を左揃えにして、文字列を中央揃えにしましょう:
print("Sammy has {0:<4} red {1:^16}!".format(5, "balloons"))
Sammy has 5 red balloons !
今、私たちは5が左揃えになっており、redの前にスペースがあることを見ています。そして、balloonsはそのフィールドの中央に配置され、左右にスペースがあります。
デフォルトでは、フォーマッターでフィールドを大きくすると、Pythonはそのフィールドを空白文字で埋めます。それを変更して別の文字を指定することができ、その文字はコロンの後に直接書きます。
print("{:*^20s}".format("Sammy"))
*******Sammy********
私たちは、他に指定しなかったため、コロンを含むstr.format()に渡される文字列をインデックス位置0で受け入れています。また、空白の代わりに*を使用してフィールドを埋めることを指定します。文字列を^で中央に配置し、フィールドは20文字のサイズであることを指定し、さらにsを含めることで文字列変換タイプに取り組んでいることを示しています。
これらのパラメータを、これまでに使用した他のパラメータと組み合わせることができます:
print("Sammy ate {0:5.0f} percent of a pizza!".format(75.765367))
Sammy ate 76 percent of a pizza!
波括弧内のパラメータでは、浮動小数点数のインデックスフィールド番号を指定し、コロンを含め、フィールド番号のサイズを示し、ピリオドを含め、小数点以下の桁数を指定し、その後にfの変換タイプを指定しました。
##変数の使用
これまで、整数、浮動小数点数、文字列を str.format() メソッドに渡してきましたが、変数をメソッドに渡すこともできます。これは他の変数と同じように機能します。
nBalloons = 8
print("Sammy has {} balloons today!".format(nBalloons))
Sammy has 8 balloons today!
元の文字列とメソッドに渡されるものの両方に変数を使用できます。
sammy = "Sammy has {} balloons today!"
nBalloons = 8
print(sammy.format(nBalloons))
Sammy has 8 balloons today!
変数は、私たちのフォーマッタ構文の各部分に容易に代入できます。これにより、ユーザー生成の入力を受け取り、その値を変数に割り当てるときに作業が容易になります。
##フォーマッターを使用してデータを整理する
フォーマッターは、多くのデータを視覚的に整理するために使用されているときに最も効果的です。データベースをユーザーに表示する場合、フォーマッターを使用してフィールドのサイズを大きくし、整列を変更すると、出力がより読みやすくなります。
3から12までの範囲で、i、i*i、およびi*i*iを出力するPythonの典型的なforループを見てみましょう:
for i in range(3,13):
print(i, i*i, i*i*i)
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つの余分な文字スペースを確保しているため、出力は次のようになります:
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))
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
私たちは、テキストの整列用に <、^、> を追加することで列の整列を操作することもでき、d を f に変更して小数点以下の桁数を追加し、フィールド名のインデックス番号を変更するなどして、表示したい形でデータを表示できるようにします。
##結論
変数の置換にフォーマッターを使用することは、文字列を連結し、値やデータを整理するための効果的な方法です。フォーマッターは、文字列に変数の置換を渡す基本的ですが説明的ではない方法を表しており、出力が読みやすく、ユーザーフレンドリーであることを保証するのに役立ちます。