午後から→オーバークロック

駆け出しハッカー()によるプログラミング・サービス開発備忘録。

Pythonのstr.ljustが日本語だと左揃えにならないので日本語用メソッドを用意した

python(2.7.3)でfor文の中で複数項目を標準出力する場合がある。 例えば以下。

>>> for v in [["Column1","Column2"],["apple","1"],["programming","2"]]:
...     print v[0],v[1]
... 
Column1 Column2
apple 1
programming 2

これだとcolumn1とcolumn2の内容が縦に並ばない(v[1]が左揃えに出力されない)ので困る。 これに抗ってタブ\tを使うときがある。 しかし今回の場合だと上手く表示されない。

>>> for v in [["Column1","Column2"],["apple","1"],["programming","2"]]:
...     print v[0],"\t",v[1]
... 
Column1     Column2
apple   1
programming     2

そこでstr.ljustを使うと、指定した文字列長になるまで後ろを空白で埋めてくれる。

>>> for v in [["Column1","Column2"],["apple","1"],["programming","2"]]:
...     print v[0].ljust(30),v[1]
... 
Column1                        Column2
apple                          1
programming                    2

ここまではいいのだが、日本語が混じると上手く表示されない。
pythonは日本語1文字のlengthを3と認識するが、
出力される際の幅はTerminalだと日本語1文字と英数字2文字が等しいので、
このような現象が起きる。

>>> for v in [["Column1","Column2"],["りんご","1"],["プログラミング","2"]]:
...     print v[0].ljust(30),v[1]
... 
Column1                        Column2
りんご                      1
プログラミング          2

そこで、以下のようなメソッドを用意する。

def ljust(string,length):
    count_length = 0
    for char in string.decode('utf8'):
        if ord(char) <= 255:
            count_length += 1
        else:
            count_length += 2
    return string + (length-count_length) * ' '
>>> for v in [["Column1","Column2"],["りんご","1"],["プログラミング","2"]]:
...     print ljust(v[0],30),v[1]
... 
Column1                        Column2
りんご                         1
プログラミング                 2

正しく表示されてないorz、けどmacのTerminalのデフォルトフォントとかだと正しく表示されます。