Yamamoto's Laboratory
 
環境設定
 
プログラム作成
  書き方
 
書式付き出力
 
 
 
tkinter
 
 
 
 
 
 
コンピューター Python 書式付き出力

Python書式付き出力

書式付き出力に関するメモです.str.format()を使うと,変数を任意の文字列に変換できます.

目次


はじめに

Python のようなスクリプト言語では,文字列の処理は大変重要です.

str.format()メソッド

str.format() は,C言語の「sprintf()」関数と同じようなことができます.文字列(str)で書式指定し,そこに埋め込む変数は format の引数で与えます.具体的には,書式指定文字列.format(変数やリテラルの並び) と書きます.

sprintf みたい

文字列の生成には,C言語の「sprintf()」関数は大変便利です.これを使うと,文字や数字の入った任意の文字列が生成できます.pythonで同じようなことを行う場合には,str.format()メソッドを使うことになります.まずは,例を示します.これで,大部分のことが分かるでしょう.

str.formatを使ったプログラム(ichiro.py)

001   #!/usr/bin/python3
002   
003   profile = "{0} is {1} years old and lives in {2}.".format("Ichiro Suzuki", 36, "Seattle");
004   
005   bat = [690, 214]
006   bat.append(bat[1]/bat[0])
007   
008   Nbat  = "\tBats:\t\t{0[0]}\n".format(bat)
009   Nhit  = "\tHits:\t\t{0[1]}\n".format(bat)
010   av  = "\tAverage:\t{0[2]:5.3f}\n".format(bat)
011   
012   bat = Nbat + Nhit + av
013   
014   print("\n", profile)
015   print(bat)

このプログラムを実行すると,以下の結果が得られます.

Ichiro Suzuki is 36 years old and lives in Seattle.
        Bats:            690
        Hits:            214
        Average:      0.310

003行目の文字列変数 basic_profime の値(正確には参照している文字列)は,書式指定 "{0} is {1} years old and lives in {2}."により変換された文字列になります.format メソッドの引数 "Ichiro Suzuki", 36, "Seattle" が書式の {0}, {1}, {2}に変換されます.006行目は,append() メソッドを使い打率を計算し配列 bat に追加します.008行目の書式指定の {0[0]}は,最初の引数「配列 bat」の最初の値を示しています.010 行目では,書式指定の {0[2]:5.3f} 最初の引数「配列 bat」の3番目の値を 5.3f 形式に変換します.これは,5カラムで小数点以下 3桁という意味です.

書式指定

ここでは,str.format()を使った書式指定の方法を示します.str の部分に書式指定文字列を記述します.{文字列の指定:書式} で任意の文字列を指定の書式の文字列で出力できます.

文字列

表1に,文字列データを文字列に変換する書式指定を示します.詰め物はフィールドが空いた場合に入れる文字です.配置はフィールド内の配置方法の指定です.ドットを挟んで最小フィールド幅と最大フィールド幅を指定します.

文字列の書式
詰め物 配置 フィールド幅(最小)   フィールド幅(最大)
'}'以外の文字 左揃え 0以上の整数 . 0以上の整数
中央揃え
右揃え

具体的な使い方は,次のプログラムで確認します.「What is honour? a wrod.」(名誉ってなんだ.ただの言葉さ.) はシェークスピアの戯曲「ヘンリー四世」の有名な台詞です.

文字列の書式設定を使ったプログラム例(format_str.py)

001   #!/usr/bin/python3
002   ws    = "Shakespeare"                   # 11 charactors
003   henry = "What is honour? a word.";      # 23 charactors
004   
005   str1  = "{0:!<30}".format(henry)        # What is honour? a word.!!!!!!!
006   str2  = "{0:@^30}".format(henry)        # @@@What is honour? a word.@@@@
007   str3  = "{0:->30}".format(henry)        # -------What is honour? a word.
008   
009   str4  = "|{0:<30}|".format(henry)       # |What is honour? a word.       |
010   str5  = "|{0:^30}|".format(henry)       # |   What is honour? a word.    |
011   str6  = "|{0:>30}|".format(henry)       # |       What is honour? a word.|
012   
013   str7  = "|{0:5.20}|".format(ws)          # Shakespeare|
014   str8  = "|{0:15.20}|".format(ws)         # Shakespeare    |
015   str9  = "|{0:1.5}|".format(ws)           # Shake|
016   str10 = "|{0:1.15}|".format(ws)          # Shakespeare|
017   
018   str11 = "\"{0}\" by ".format(henry)+ws  # "What is honour? a word." by Shakespeare
019   
020   
021   print("{0:!<30}\t",   str1)
022   print("{0:@^30}\t",   str2)
023   print("{0:#>30}\t",   str3)
024   
025   print("|{0:<30}|\t",  str4)
026   print("|{0:^30}|\t",  str5)
027   print("|{0:>30}|\t",  str6)
028   
029   print("|{0:5.20}|\t",  str7)
030   print("|{0:15.20}|\t", str8)
031   print("|{0:1.5}|\t",   str9)
032   print("|{0:1.15}|\t",  str10)
033   
034   print("\t\t",         str11)

このプログラムを実行すると,以下の結果が得られます.str1 は,変数 henry の文字列を詰め物 ! を使い左揃え (<) でフィールド幅 30 カラムで出力の文字列になります.str2 は中央揃え (^) で詰め物は @,str3 は - で右揃え (>) です.str4 – str6 は30カラムで詰め物無しです.文字列の範囲を明示するために,パイプ「|」を入れています.str7 – str10 はフィールド幅の指定の例です.str11 では,二重引用符を文字列中に含めるためには「\」でのエスケープ用います.

{0:!<30}     What is honour? a word.!!!!!!!
{0:@^30}     @@@What is honour? a word.@@@@
{0:#>30}     -------What is honour? a word.
|{0:<30}|     |What is honour? a word.       |
|{0:^30}|     |   What is honour? a word.    |
|{0:>30}|     |       What is honour? a word.|
|{0:5.20}|     |Shakespeare|
|{0:15.20}|   |Shakespeare    |
|{0:1.5}|       |Shake|
|{0:1.15}|     |Shakespeare|
                      "What is honour? a word." by Shakespeare

整数

表2に,整数データを文字列に変換する書式指定を示します.詰め物はフィールドが空いた場合に入れる文字です.配置はフィールド内の配置方法の指定です.符号(+, -),プレフィックス(0b, 0o, 0x),0詰めを指定します.整数を書き出すフィールド幅を指定します.最後に基数を指定します.

n はロケールに対応した10進数の整数を出力します.c は整数に対応した Unicode 文字を出力します.

整数の書式
詰め物 配置 符号 prefix 0詰め フィールド幅(最小) 基数
'}'以外の文字 左揃え 必ず表示 有り 有り 0以上の整数 2進数
中央揃え 必要な時 8進数
右揃え ' ' 空白/- 10進数
符号後に詰め物 10進数
16進数
16進数
文字

具体的な使い方は,次のプログラムで確認します.

整数の書式設定を使ったプログラム例(format_int.py)

001   #!/usr/bin/python3
002   
003   import locale
004   
005   intvar =    2**16-1                     # 65536
006   
007   #---------- b o d x X test -----------------------
008   int1  = "{0:b}".format(intvar)        # 1111111111111111
009   int2  = "{0:o}".format(intvar)        # 177777
010   int3  = "{0:d}".format(intvar)        # 65535
011   int4  = "{0:x}".format(intvar)        # ffff
012   int5  = "{0:X}".format(intvar)        # FFFF
013   
014   print("{0:b}\t", int1)
015   print("{0:o}\t", int2)
016   print("{0:d}\t", int3)
017   print("{0:x}\t", int4)
018   print("{0:X}\t", int5)
019   
020   #---------- prefix test -----------------------
021   int6  = "{0:#b}".format(intvar)        # 0b1111111111111111
022   int7  = "{0:#o}".format(intvar)        # 0o177777
023   int8  = "{0:#x}".format(intvar)        # 0xffff
024   
025   print("{0:#b}\t", int6)
026   print("{0:#o}\t", int7)
027   print("{0:#x}\t", int8)
028   
029   #---------- n test -----------------------
030   locale.setlocale(locale.LC_ALL, "en_US.UTF-8");
031   ntest = 2**32-1
032   int9  = int4  = "{0:n}".format(ntest)        # 4,294,967,295
033   print("{0:n}\t",   int9)
034   
035   #---------- c test -----------------------
036   char   = 0x42f
037   int10   = int4  = "{0:c}".format(char)       # Я
038   print("{0:c}\t",   int10)
039   
040   #---------- + - ' ' test -----------------------
041   intp = 1234
042   intm = -4321
043   int11 = "{0:+d}\t{1:+d}".format(intp, intm)
044   int12 = "{0:-d}\t{1:-d}".format(intp, intm)
045   int13 = "{0: d}\t{1: d}".format(intp, intm)
046   print("{0:+d} {1:+d}\t", int11)     # +1234  -4321
047   print("{0:-d} {1:-d}\t", int12)     # 1234   -4321
048   print("{0: d} {1: d}\t", int13)     #  1234  -4321
049   
050   #---------- 0 padding test -----------------------
051   int14 = "{0:+010d}\t{1:+010d}".format(intp, intm)
052   int15 = "{0:-010d}\t{1:-010d}".format(intp, intm)
053   int16 = "{0: 010d}\t{1: 010d}".format(intp, intm)
054   print("{0:+010d} {1:+010d}", int14)  # +000001234  -000004321
055   print("{0:-010d} {1:-010d}", int15)  # 0000001234  -000004321
056   print("{0: 010d} {1: 010d}", int16)  #  000001234  -000004321

このプログラムを実行すると,以下の結果が得られます.int1 – int5 では,整数が 2 進数, 8 進数, 10 進数, 16 進数(xタイプ), 16 進数(Xタイプ)の表示文字列に変換されます.int6 – int8 では,基数を表示するプレフィックスも出力します.int9 ではロケールに合わせた出力になります.欧米圏では整数を3桁ずつカンマで区切ります.int10 は整数に対応した Unicode 文字を出力します.int11 – int13 は,符号表示方法が異なっています.int14 – int15 では,0詰めの確認をします.

{0:b}    1111111111111111
{0:o}    177777
{0:d}    65535
{0:x}    ffff
{0:X}    FFFF
{0:#b}   0b1111111111111111
{0:#o}   0o177777
{0:#x}   0xffff
{0:n}    4,294,967,295
{0:c}   Я
{0:+d} {1:+d}   +1234   -4321
{0:-d} {1:-d}   1234    -4321
{0: d} {1: d}    1234   -4321
{0:+010d} {1:+010d} +000001234  -000004321
{0:-010d} {1:-010d} 0000001234  -000004321
{0: 010d} {1: 010d}  000001234  -000004321

浮動小数点数

表3に,浮動小数点データを文字列に変換する書式指定を示します.詰め物や配置,符号,フィールド幅は,文字列や整数の場合と同じです.ドットのあと小数点の桁数を示し,表示形式を決めます.表示形式の e – G は説明するまでもないでしょう.どんな人が使うのか分かりませんが,n は整数同様に3桁づつカンマを出力します.ただし,ロケールの依存性が有ります.% は値を 100 倍し,%を付けます.

浮動小数点の書式
詰め物 配置 符号 フィールド幅(最小)   小数点以下桁数 表示形式
'}'以外の文字 左揃え 必ず表示 0以上の整数 . 0以上の整数 指数形式
中央揃え 必要な時 指数形式
右揃え ' ' 空白/- 小数形式
符号後に詰め物 小数or指数
小数or指数
パーセント

具体的な使い方は,次のプログラムで確認します.

整数の書式設定を使ったプログラム例(format_float.py)

001   #!/usr/bin/python3
002   
003   fltvar =    987654321.12345
004   
005   #---------- e E f g G n % test -----------------------
006   flt1  = "{0:e}".format(fltvar)        # 9.876543e+08
007   flt2  = "{0:E}".format(fltvar)        # 9.876543E+08
008   flt3  = "{0:f}".format(fltvar)        # 987654321.123450
009   flt4  = "{0:g}".format(fltvar)        # 9.87654e+08
010   flt5  = "{0:G}".format(fltvar)        # 9.87654E+08
011   flt6  = "{0:n}".format(fltvar)        # 9.87654e+08
012   flt7  = "{0:%}".format(fltvar)        # 98765432112.345001%
013   
014   print("{0:e}\t", flt1)
015   print("{0:E}\t", flt2)
016   print("{0:f}\t", flt3)
017   print("{0:g}\t", flt4)
018   print("{0:G}\t", flt5)
019   print("{0:n}\t", flt6)
020   print("{0:%}\t", flt7)
021   
022   #---------- align test -----------------------
023   int8   = "{0:<20.3e}".format(fltvar)        #    9.877e+08
024   int9   = "{0:^20.3e}".format(fltvar)        #         9.877e+08
025   int10  = "{0:>20.3e}".format(fltvar)        #               9.877e+08
026   
027   print("{0:<20.3e}\t", int8)
028   print("{0:^20.3e}\t", int9)
029   print("{0:>20.3e}\t", int10)

このプログラムを実行すると,以下の結果が得られます.元の浮動小数点データの値が大きかったので,g/G タイプの出力は e/E と同じです.有る程度小さくなると f タイプで出力されます.

{0:e}    9.876543e+08
{0:E}    9.876543E+08
{0:f}    987654321.123450
{0:g}    9.87654e+08
{0:G}    9.87654E+08
{0:n}    9.87654e+08
{0:%}    98765432112.345001%
{0:<20.3e}       9.877e+08           
{0:^20.3e}            9.877e+08      
{0:>20.3e}                  9.877e+08

複素数型

Python は複素数を取り扱うことができます.しかし,str.format() には複素数に対応した書式は有りません.代わりに,実数部と虚数部を取り出して浮動小数点型で表示します.具体例を以下に示します.

複素数を使ったプログラム例(format_complex.py)

001   #!/usr/bin/python3
002   
003   import cmath
004   import math
005   
006   y = cmath.exp(math.pi*1j/4.0)
007   str  = "{0.real:g} + {0.imag:g}i".format(y)
008   
009   print(str)

このプログラムを実行すると,以下が得られます.複素数 y の実数部は「y.real」,虚数部は「y.imag」で取り出せます.

0.707107 + 0.707107i

ページ作成情報

参考資料

  1. str.formatについては,以下の書籍のp.76—p.86を参考にしました.
    Python 3 プログラミング徹底入門Python 3 プログラミング徹底入門
    マーク・サマーフィールド Mark Summerfield 長尾 高弘

    ピアソンエデュケーション 2009-12-15
    売り上げランキング : 124305

    Amazonで詳しく見る
    by G-Tools

更新履歴

2010年09月頃 ページの新規作成


no counter