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のデフォルトフォントとかだと正しく表示されます。