2016-03-21 6 views
0

文字列を特定の長さ(端末幅)にトリミングする方法はありますか?文字列を端末の幅に合わせますが、TABのようなワイド文字を考慮に入れてください。

が、私はこれらの行を持って、lineはバイト文字列であるとmax_widthは132に評価されます

max_width = shutil.get_terminal_size().columns 
output = "{:>6d}: {}".format(n, line.decode(codec, "replace")).rstrip("\n") 
print(output[:max_width]) 
print(len(output[:max_width])) 

そして出力例は、このようになります:

23: ��G&S��.��+��HL=`����W9�yi��l�����p����:��d*p��i�6L�h<�� 
v�I��S�� �u�`:%��#            ��/����TAE����{�(y�Ij��B����33o3 
132 

だから、のpython3はそれだけだと思っ132文字ですが、端末(gnome-terminal、Ubuntu 15.10)は、wcによると、それを293文字に解釈します。

1行に正しく収まるように、行を正しく切り詰めるにはどうすればよいですか?

+0

TAB文字に使用するスペースの数は、完全に端末/アプリケーション/ユーザーまでです。これは、整列のためにタブを使用しない理由です。スペースに変換してください。 –

+0

文字列を切り捨てる前に、すべての「ワイド」文字を固定数のスペースで置き換えることはできますか? TAB以外のキャラクターは、私が当てにしなければならないものは何ですか? (ラインフィードやキャリッジリターンなど)一度にすべてを処理する最も簡単な方法は何ですか? –

答えて

0

ここで、各文字列を再構成して、印刷できないすべての文字を単純に省略します。
これはおそらく最速の方法ではありませんが、動作します。

output = line.decode(codec, "replace") 
if max_width: 
    output = "".join(c for c in output if c.isprintable()) 
    print(output[:max_width]) 
else: 
    print(output) 
関連する問題