2016-05-19 8 views
8

Pythonはパッドにそれが簡単になり、ASCII文字列を合わせ、そのような:ユニコード文字列をPythonの特殊文字で埋めて整列する方法は?

>>> print "%20s and stuff" % ("test") 
       test and stuff 
>>> print "{:>20} and stuff".format("test") 
       test and stuff 

しかし、どのように、私は適切に特殊文字を含むUnicode文字列をパッドと整合させることができますか?私はいくつかの方法を試してみたが、それらのどれも動作するようには思えません:これは、Python 2.7を使用している

with_format 
       xTest1x stuff 
      ツTestツ stuff 
    ♠️ Test ♠️ stuff 
       ~Test2~ stuff 
with_oldstyle 
      xTest1x stuff 
      ツTestツ stuff 
    ♠️ Test ♠️ stuff 
      ~Test2~ stuff 
with_oldstyle utf8 
      xTest1x stuff 
       ツTestツ stuff 
      ♠️ Test ♠️ stuff 
      ~Test2~ stuff 
manual: 
      xTest1x stuff 
      ツTestツ stuff 
    ♠️ Test ♠️ stuff 
      ~Test2~ stuff 
manual utf8: 
      xTest1x stuff 
       ツTestツ stuff 
      ♠️ Test ♠️ stuff 
      ~Test2~ stuff 

:これは、多様な出力を提供します

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

def manual(data): 
    for s in data: 
     size = len(s) 
     print ' ' * (20 - size) + s + " stuff" 

def with_format(data): 
    for s in data: 
     print " {:>20} stuff".format(s) 

def with_oldstyle(data): 
    for s in data: 
     print "%20s stuff" % (s) 

if __name__ == "__main__": 
    data = ("xTest1x", "ツTestツ", "♠️ Test ♠️", "~Test2~") 
    data_utf8 = map(lambda s: s.decode("utf8"), data) 

    print "with_format" 
    with_format(data) 
    print "with_oldstyle" 
    with_oldstyle(data) 
    print "with_oldstyle utf8" 
    with_oldstyle(data_utf8) 
    print "manual:" 
    manual(data) 
    print "manual utf8:" 
    manual(data_utf8) 

+2

'data_utf8'は後者を含むので、' data_unicode'に名前を変更する方が良いと思います。 – robyschek

+1

それはおそらくこの質問に関連している:http://stackoverflow.com/questions/4622357/how-to-control-padding-of-unicode-string-containing-east-asia-characters –

+1

ユニコード標準の概念["grapheme cluster"](http://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries)は、テキストを読むユーザが知覚する文字とおおよそ対応し、コンピューティングのための第三者モジュールgrapheme clusters、['uniseg.graphemecluster'](http://uniseg-python.readthedocs.io/en/latest/graphemecluster.html)のように。しかし、幅がゼロの文字に対して何らかの追加の処理をしたいかもしれませんが、もちろんモノスペースでないフォントの場合、パディングは非常に異なって動作します。 – user2357112

答えて

2

​​モジュールがpip経由で入手できます。

test.py:Linuxのコンソールで

import wcwidth 
def manual_wcwidth(data): 
    for s in data: 
     size = wcwidth.wcswidth(s) 
     print ' ' * (20 - size) + s + " stuff" 
data = (u"xTest1x", u"ツTestツ", u"♠️ Test ♠️", u"~Test2~") 
manual_wcwidth(data) 

私完全に整列ラインのため、このスクリプト利回り:私はPyCharmでスクリプトを実行すると

console screenshot

しかしカナとの行がありますまだ1文字左にシフトしているので、これもフォントとレンダラーに依存します。

pycharm screenshot

+0

これは私たちの目的のためにうまくいきます(私たちはOS X Terminalを使ってテキストを表示しています)。ヒントをありがとう! "pip install wcwidth"が必要です。 – camomilk

+0

日本語と中国語の文字は全角文字で、ほとんどの(すべて?)フォントでは他の文字よりもわずかに広いです。約3文字の全角文字は4文字の正規文字に等しいので、文字列に2文字しか含まない場合は、丸めによってわずかにずれてしまいます。 –

関連する問題