web-dev-qa-db-ja.com

Python文字列の間隔と整列

「」を使用せずに、2つの文字列変数の間にテキストを揃えるためにスペースを追加しようとしています

2列目を揃えて、テキストをこのように表示しようとしています。

Location: 10-10-10-10       Revision: 1
District: Tower             Date: May 16, 2012
User: LOD                   Time: 10:15

現在、スペースを使用して、このようにコーディングしています...

"Location: " + Location + "               Revision: " + Revision + '\n'

String.rjustとsrting.ljustを試してみましたが、役に立ちませんでした。

提案?

42
Tristan Forward

Formatメソッドを使用できるはずです。

"Location: {0:20} Revision {1}".format(Location,Revision)

ラベルの長さに応じて、各行の形式の長さを把握する必要があります。ユーザー行には、ロケーション行または地区行よりも広いフォーマット幅が必要です。

59
IronMensan

%*sおよび%-*sおよび各文字列の前に列幅を付けます。

>>> print "Location: %-*s  Revision: %s" % (20,"10-10-10-10","1")
Location: 10-10-10-10           Revision: 1
>>> print "District: %-*s  Date: %s" % (20,"Tower","May 16, 2012")
District: Tower                 Date: May 16, 2012
40
Charles Beattie

次のように、expandtabsを使用してタブストップを指定できます。

>>> print ('Location:'+'10-10-10-10'+'\t'+ 'Revision: 1').expandtabs(30)
>>> print ('District: Tower'+'\t'+ 'Date: May 16, 2012').expandtabs(30)
#Output:
Location:10-10-10-10          Revision: 1
District: Tower               Date: May 16, 2012
23
fraxel

@IronMensanのformatメソッドの答えが道です。しかし、公正に関するあなたの質問に答えるために:

>>> def printit():
...     print 'Location: 10-10-10-10'.ljust(40) + 'Revision: 1'
...     print 'District: Tower'.ljust(40) + 'Date: May 16, 2012'
...     print 'User: LOD'.ljust(40) + 'Time: 10:15'
...
>>> printit()
Location: 10-10-10-10                   Revision: 1
District: Tower                         Date: May 16, 2012
User: LOD                               Time: 10:15

編集すると、この方法では文字列の長さを知る必要がありません。 .format()も可能性がありますが、私はそれを十分に理解していません。

>>> uname='LOD'
>>> 'User: {}'.format(uname).ljust(40) + 'Time: 10:15'
'User: LOD                               Time: 10:15'
>>> uname='Tiddlywinks'
>>> 'User: {}'.format(uname).ljust(40) + 'Time: 10:15'
'User: Tiddlywinks                       Time: 10:15'
10
JoeFish

別のトピックを復活させるが、これはいくつかのために便利になるかもしれません。

https://pyformat.info から少しインスピレーションを得て、目次[TOC]スタイルの印刷を取得するメソッドを構築できます。

# Define parameters
Location = '10-10-10-10'
Revision = 1
District = 'Tower'
MyDate = 'May 16, 2012'
MyUser = 'LOD'
MyTime = '10:15'

# This is just one way to arrange the data
data = [
    ['Location: '+Location, 'Revision:'+str(Revision)],
    ['District: '+District, 'Date: '+MyDate],
    ['User: '+MyUser,'Time: '+MyTime]
]

# The 'Table of Content' [TOC] style print function
def print_table_line(key,val,space_char,val_loc):
    # key:        This would be the TOC item equivalent
    # val:        This would be the TOC page number equivalent
    # space_char: This is the spacing character between key and val (often a dot for a TOC), must be >= 5
    # val_loc:    This is the location in the string where the first character of val would be located

    val_loc = max(5,val_loc)

    if (val_loc <= len(key)):
        # if val_loc is within the space of key, truncate key and
        cut_str =  '{:.'+str(val_loc-4)+'}'
        key = cut_str.format(key)+'...'+space_char

    space_str = '{:'+space_char+'>'+str(val_loc-len(key)+len(str(val)))+'}'
    print(key+space_str.format(str(val)))

# Examples
for d in data:
    print_table_line(d[0],d[1],' ',30)

print('\n')
for d in data:
    print_table_line(d[0],d[1],'_',25)

print('\n')
for d in data:
    print_table_line(d[0],d[1],' ',20)

結果の出力は次のとおりです。

Location: 10-10-10-10         Revision:1
District: Tower               Date: May 16, 2012
User: LOD                     Time: 10:15


Location: 10-10-10-10____Revision:1
District: Tower__________Date: May 16, 2012
User: LOD________________Time: 10:15


Location: 10-10-... Revision:1
District: Tower     Date: May 16, 2012
User: LOD           Time: 10:15
0
vshiro