環境設定
プログラム作成
書式付き出力
tkinter
|
Python書式付き出力書式付き出力に関するメモです.str.format()を使うと,変数を任意の文字列に変換できます. 目次はじめにPython のようなスクリプト言語では,文字列の処理は大変重要です. str.format()メソッドstr.format() は,C言語の「sprintf()」関数と同じようなことができます.文字列(str)で書式指定し,そこに埋め込む変数は format の引数で与えます.具体的には,書式指定文字列.format(変数やリテラルの並び) と書きます. sprintf みたい文字列の生成には,C言語の「sprintf()」関数は大変便利です.これを使うと,文字や数字の入った任意の文字列が生成できます.pythonで同じようなことを行う場合には,str.format()メソッドを使うことになります.まずは,例を示します.これで,大部分のことが分かるでしょう. 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に,文字列データを文字列に変換する書式指定を示します.詰め物はフィールドが空いた場合に入れる文字です.配置はフィールド内の配置方法の指定です.ドットを挟んで最小フィールド幅と最大フィールド幅を指定します.
具体的な使い方は,次のプログラムで確認します.「What is honour? a wrod.」(名誉ってなんだ.ただの言葉さ.) はシェークスピアの戯曲「ヘンリー四世」の有名な台詞です. 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 文字を出力します.
具体的な使い方は,次のプログラムで確認します. 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 倍し,%を付けます.
具体的な使い方は,次のプログラムで確認します. 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() には複素数に対応した書式は有りません.代わりに,実数部と虚数部を取り出して浮動小数点型で表示します.具体例を以下に示します. 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 ページ作成情報参考資料
更新履歴
|