ページへ戻る

− Links

 印刷 

Python​/文字列に書式を設定して出力する(%記法、format) :: XOOPS Cube Site

xpwiki:Python/文字列に書式を設定して出力する(%記法、format)

Pythonではデフォルトで変数を書式設定して出力するいろいろな方法が用意されています。

その中でよく使うのは次の二つです。

%記法を使った書式設定 anchor.png[1] Edit [2]

ちょっとした出力でよく使うのは%を使った記法です。

# -*- coding: utf-8 -*-

s = u"これは%sです" % u"テスト"

print s

結果

これはテストです

このように、「フォーマット文字列 % 変数」という形で、文字列の中に変数が埋め込めます。C言語などのprintfを使ったことがあれば、それと同じような物と思えば分かりやすいです。

変数が複数になる場合には変数の部分をタプルにします。また、埋め込みのフォーマット部分はprintfと同じ書式を使います。例えば整数は「%d」、文字列は「%s」などです。

s = u"これは%d回目の%sです" % (2,u"テスト")

print s

結果

これは2回目のテストです

他によく使う書式として、小数点以下のけた数を指定するものや

s = u"これは%.2fを表示する%sです" % (0.1234,u"テスト")

print s

結果

これは0.12を表示するテストです

先頭ゼロ詰めでけた数をあわせるなどがあります。

for i in (1,12,123):
    print u"%04d" % i

結果

0001
0012
0123

詳しくはprintfの書式について調べると良いでしょう。

また、printfはUnix系のコマンドとしても通常は実装されているため、コマンドを打ち込んですぐにチェックすることもできます。

$ printf "%02d,%.2f\n" 9 1.2345
09,1.23
Page Top

formatを使った書式設定 anchor.png[3] Edit [4]

ちょっとした書式設定とその出力には便利な%記法ですが、ある程度複雑な書式設定がしたいときには、今ひとつ使いづらい所があります。

例えば、前の例では文字列をソースコードの中で定義していましたが、プログラムとデータを分けるためにソースとは別ファイルに書式データなどを入れたとします。

すると、もしその書式の中で、変数の登場する順番を変えたいと思っても、%記法では変数の現れる順番はソースコードを修正しないと変えられないため、せっかくコードとデータを分けたのにソースの修正が必要になってしまいます。

例えば

大きい数が2、小さい数が1

という結果を得るために、

s = u"大きい数が%d、小さい数が%d" % (2,1)

というコードを書いたとします。その後何らかの仕様変更で

小さい数が1、大きい数が2

と出力されるようにしたいとすると、

s = u"小さい数が%d、大きい数が%d" % (1,2)

というコードが必要となり、書式設定だけではなく、(1,2)という変数の方も修正が必要です。 これは書式とコードの分離がされておらず、メンテナンス性が良くありません。

このような場合には「format」メソッドを使います。 formatは変数の場所に指定が可能なので、先ほどの例だと、

s = u"大きい数が{0}、小さい数が{1}".format(2,1)

結果

大きい数が2、小さい数が1

結果を入れ替えたいときは、

s = u"小さい数が{1}、大きい数が{0}".format(2,1)

結果

小さい数が1、大きい数が2

となって、変数の順番を変えずフォーマット文字列だけ変更して出力が可能です。

また、フォーマット文字列に使う変数に名前をつけることも可能です。

s = u"大きい数が{max}、小さい数が{min}".format(max=2,min=1)
print s
s = u"小さい数が{min}、大きい数が{max}".format(max=2,min=1)
print s

結果

大きい数が2、小さい数が1
小さい数が1、大きい数が2

このようにformatを使うと書式設定の柔軟性や可読性があがるので、複雑な書式設定が必要な場合などはこちらを使うのがおすすめです。

formatは「{}」の中を省略することも出来ます。 この場合は引数の順序通り出力されます。

print u"{}と{}".format("A","B")

結果

AとB

つまり、%記法と同じです。


Last-modified: 2017-06-11 (日) 14:27:35 (JST) (104d) by njf