Pythonのformat()を使って1桁の16進数でも2桁で出力する方法
Pythonで「1桁の16進数でも2桁で出力するという方法」がいまいち分からずに手間取ったことがあるので、そのとき取った方法をまとめておきます。
以前のgnuplot関連のブログ
で、プロット例のグラフを出力するために、「RRGGBB」となるRGB値を作成する必要がありました。
要は「0xff0000」となる数値を必要な分だけ書き出すわけです。
gnuplotでプロットするときは以下のような命令となっています。
(上のグラフの場合はこれよりもっと長い命令文)
グラフだとプロット1つ毎にRRの値を加算していき、「00→ff」というように変化させていっています。これは10進数で表すと「0→255」です。
方法としてはGGとBBは「00」に固定して、RRだけ変化させて最後にRRGGBBとして結合する、という考えでRRGGBBを作成しようとしました。また16進数はループ変数の値(10進数)を変換して得ることとしました。
例えば hex(29) とすると 0x1d を返します。後々、RRGGBBとして結合する時に先頭の「0x」が邪魔になりますが、これは文字列操作で削ればいいでしょう。
と、ここまでは良かったのですが、0〜15までは1桁(0xも付くので3文字)で書き出されます。
欲しいのは2桁で構成されるRRの値なので、0〜15までの場合に先頭(0xの後)に「0」をくっつける処理が必要となります。
やって出来ないことはないのですが、やや処理が入り組んで煩雑になってしまうのでもう少しスマートな方法を探してみることにしました。
この中の変換形式の中に16進数として出力する「x」と「X」の2つの形式があります。前者はアルファベット表記を小文字で、後者は大文字で出力するものです。
方法としては以下のように書けばいいのですが、
ここでも出力される16進数は1桁の「f」として出てきます。しかし、format()の出力ではもっと細かい指定が可能なのでそれを利用します。
まず「x」の前に数字を与えるとその桁数で出力されます。では2桁で出力させたい場合に
とすればいいかというと、これだと「' f'」と先頭にスペースが付くだけです。先頭に「0」は付いてくれません。
で、もう少しformat()で使える指定方法を調べると、数値を出力するときに桁数を指定してさらに先頭のスペースを「0」で埋めたい場合
という書き方が出来ることが分かりました。ここでは「'0f'」と出力されるため、ちょうど思った通りの値を得ることが出来ました。
メソッドとして書くとこんな感じ
RRGGBBとして書き出すならこんな風に。
Amazon Python関連の書籍
以前のgnuplot関連のブログ
で、プロット例のグラフを出力するために、「RRGGBB」となるRGB値を作成する必要がありました。
要は「0xff0000」となる数値を必要な分だけ書き出すわけです。
gnuplotでプロットするときは以下のような命令となっています。
gnuplot>>> plot cos(x)+0.0 lc rgbcolor "0x000000", cos(x)+0.05 lc rgbcolor "0x050000", cos(x)+0.1 lc rgbcolor "0x0a0000"
(上のグラフの場合はこれよりもっと長い命令文)
グラフだとプロット1つ毎にRRの値を加算していき、「00→ff」というように変化させていっています。これは10進数で表すと「0→255」です。
方法としてはGGとBBは「00」に固定して、RRだけ変化させて最後にRRGGBBとして結合する、という考えでRRGGBBを作成しようとしました。また16進数はループ変数の値(10進数)を変換して得ることとしました。
hex()で出力する
10進数を16進数の形式で出力するものとして「hex()」という関数があります。例えば hex(29) とすると 0x1d を返します。後々、RRGGBBとして結合する時に先頭の「0x」が邪魔になりますが、これは文字列操作で削ればいいでしょう。
と、ここまでは良かったのですが、0〜15までは1桁(0xも付くので3文字)で書き出されます。
欲しいのは2桁で構成されるRRの値なので、0〜15までの場合に先頭(0xの後)に「0」をくっつける処理が必要となります。
やって出来ないことはないのですが、やや処理が入り組んで煩雑になってしまうのでもう少しスマートな方法を探してみることにしました。
format()で出力する
Pythonで出力形式を変換するものとしてformat()という関数が使えます。この中の変換形式の中に16進数として出力する「x」と「X」の2つの形式があります。前者はアルファベット表記を小文字で、後者は大文字で出力するものです。
方法としては以下のように書けばいいのですが、
format(15, 'x')
ここでも出力される16進数は1桁の「f」として出てきます。しかし、format()の出力ではもっと細かい指定が可能なのでそれを利用します。
まず「x」の前に数字を与えるとその桁数で出力されます。では2桁で出力させたい場合に
format(15, '2x')
とすればいいかというと、これだと「' f'」と先頭にスペースが付くだけです。先頭に「0」は付いてくれません。
で、もう少しformat()で使える指定方法を調べると、数値を出力するときに桁数を指定してさらに先頭のスペースを「0」で埋めたい場合
format(15, '02x')
という書き方が出来ることが分かりました。ここでは「'0f'」と出力されるため、ちょうど思った通りの値を得ることが出来ました。
メソッドとして書くとこんな感じ
'{:02x}'.format(15)
RRGGBBとして書き出すならこんな風に。
'0x{:02x}0000'.format(217)
最後に
実際にgnuplotでの命令文として書き出すときはもう少し違った処理で組んだのですが、基本的な部分はここで書いたような内容となっています。Amazon Python関連の書籍
コメント
コメントを投稿