2017-12-15 3 views
1

を開始します。Pythonのstr.format列Iは、次のフォーマット出力したい一定の間隔で

addr<-9->bit<-15->value<-13->name<-26->type 
....  ...  ......  ...... ...... #..... is the content of each row 

私はそれを達成するためにstr.formatを使用:

STRING_FORMATTER = '{0:13}{1:18}{2:18}{3:30}{4:10}\n' 
content = STRING_FORMATTER.format('addr', 'bit', 'value', 'name', 'type') 
content = content + STRING_FORMATTER.format('0123', 'LONG STRING THAT EXCEEDS 18 SPACES!!!!!!!!!!!!!!!!', '', '', 'reg') 
content = content + STRING_FORMATTER.format('00', '0', '0xAD', 'NAME', 'bit') 
..... 

私は基本的に文字列を作成タイプによって。上記の問題は、2番目の文字列が18個の文字スペースを超えると、後ろの文字列がプッシュされるという問題です。それを解決する方法はありますか?

文字列を前方に固定間隔で開始するより良い方法がありますか?

+0

あなたが長い文字列を遮断することにしますか? –

+0

私はそれを切り捨てることは望ましくない、私はロングストリングが14で始まることを望んでおり、サイズは18 + 18 + 30である。そして、型を最初の行と正確に揃えたい –

答えて

2

3つのフィールドに文字列を分割する必要があります。以下に使用される構文では、使用されるPEP 448 - Additional Unpacking Generalizations機能のPython 3.5以降が必要です。関数が張られている三つのフィールドの正しいフィールド幅に文字列を破る:

STRING_FORMATTER = '{0:13}{1:18}{2:18}{3:30}{4:10}\n' 

def split(s,*widths): 
    current = 0 
    for width in widths: 
     yield s[current:current + width] 
     current += width 

content = STRING_FORMATTER.format('addr', 'bit', 'value', 'name', 'type') 
content += STRING_FORMATTER.format('0123', *split('LONG STRING THAT EXCEEDS 18 SPACES!!!!!!!!!!!!!!!!',18,18,30), 'reg') 
content += STRING_FORMATTER.format('00', '0', '0xAD', 'NAME', 'bit') 
print(content) 

出力:

addr   bit    value    name       type 
LONG STRING THAT EXCEEDS 18 SPACES!!!!!!!!!!!!!!!!    reg 
00   0     0xAD    NAME       bit 
2

長すぎる文字列を切り捨て、フォーマット入力を囲む関数を作成することができます。

def truncate(*inputs, max_length=18): 
    return tuple(s[:max_length] for s in inputs) 

STRING_FORMATTER = '{0:13}{1:18}{2:18}{3:30}{4:10}\n' 
content = STRING_FORMATTER.format(
    *truncate('addr', 'bit', 'value', 'name', 'type')) 
content = content + STRING_FORMATTER.format(
    *truncate('0123', 'LONG STRING THAT EXCEEDS 18 SPACES!!!!!!!!!!!!!!!!', '', '', 'reg')) 
content = content + STRING_FORMATTER.format(
    *truncate('00', '0', '0xAD', 'NAME', 'bit'))