ページへ戻る

− Links

 印刷 

Python​/文字列に書式を設定して出力する(%記法、format) のバックアップの現在との差分(No.1) :: NJF Wiki

xpwiki:Python/文字列に書式を設定して出力する(%記法、format) のバックアップの現在との差分(No.1)

  Next »[4]
1: 2016-12-27 (火) 07:43:43 njf[5] ソース[6] バックアップ No.1 を復元して編集[7] 現: 2017-06-11 (日) 14:27:35 njf[5] ソース[8] 編集[9]
Line 4: Line 4:
*%記法を使った書式設定 [#y5324972] *%記法を使った書式設定 [#y5324972]
 +
 +ちょっとした出力でよく使うのは%を使った記法です。
 +
 + # -*- 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
*formatを使った書式設定 [#c858d965] *formatを使った書式設定 [#c858d965]
 +
 +ちょっとした書式設定とその出力には便利な%記法ですが、ある程度複雑な書式設定がしたいときには、今ひとつ使いづらい所があります。
 +
 +例えば、前の例では文字列をソースコードの中で定義していましたが、プログラムとデータを分けるためにソースとは別ファイルに書式データなどを入れたとします。
 +
 +すると、もしその書式の中で、変数の登場する順番を変えたいと思っても、%記法では変数の現れる順番はソースコードを修正しないと変えられないため、せっかくコードとデータを分けたのにソースの修正が必要になってしまいます。
 +
 +例えば
 + 大きい数が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
 +
 +つまり、%記法と同じです。
  Next »[4]