簡體   English   中英

python中的多行字符串格式

[英]multi line string formatting in python

首先,我正在努力獲得如下所需的輸出:

*********************************************************************
                                 hello
********************************************************************* 

為實現這一點,我已將所需的輸出分配給具有多行字符串的變量,並使用格式打印相同的變量

$ cat varibale.py 
decorator = """ **********************************************************************
                               {}
            ********************************************************************** """
print(decorator.format("hello"))

輸出:

**********************************************************************
                               hello
            **********************************************************************

上述方法的問題是第三行輸出中額外空格看起來很奇怪。

我能夠通過以下方式實現這一目標

$ cat varibale.py 
decorator = """ **********************************************************************
                             {}
********************************************************************* 
"""
print(decorator.format("hello"))

輸出:

 **********************************************************************
                             hello
********************************************************************* 

但是這樣我的代碼看起來不太好,因為它沒有跟隨縮進。

請建議正確的方法來實現所需的輸出。

你可以舉例如下:

print('*'*80)
print('{msg:^80s}'.format(msg = 'HELLO')) #^ centers the message
print('*'*80)

或者如果你想要文本寬度動態:

def fn(msg, w = 80):
    delim = '*'*w
    fmt = '{msg:^%ds}'%w

    print(delim)
    print(fmt.format(msg=msg))
    print(delim)

fn('hello')

或者稍微通用的版本,如果您需要寫入文件:

import sys

def fn(msg, w = 80, F = sys.stdout):
    delim = '*'*w
    fmt = '{delim:s}\n{msg:^%ds}\n{delim:s}\n'%w
    F.write(fmt.format(delim = delim, msg = msg))

fn('hello')

使多行文字字符串看起來很好的一種方法是使用反斜杠來轉義換行符,如下所示:

s = '''\
*********************************************************************
                                 hello
*********************************************************************
'''
print(s)

產量

*********************************************************************
                                 hello
*********************************************************************

但是,PEP-008不鼓勵這樣的反斜杠使用。 它太脆弱了:如果反斜杠和換行符之間有空格,那么換行符就不會被轉義,反斜杠也會打印出來。

更通用的方法是使用一個函數來計算文本居中所需的填充量,並通過嵌套格式說明符應用它。 例如:

def banner(s, width=69):
    stars = '*' * width
    pad = (width + len(s)) // 2
    return '{0}\n{1:>{2}}\n{0}'.format(stars, s, pad)

print(banner('hello'))
print(banner('Hello, world', width=16))

產量

*********************************************************************
                                hello
*********************************************************************
****************
  Hello, world
****************

這個怎么運作

那格式字符串有點密集,所以我想我應該嘗試解釋它。 ;)有關此主題的完整信息,請參閱文檔中的格式字符串語法 下面的解釋借鑒了這些文檔並解釋了這些文檔。

'{0}\n{1:>{2}}\n{0}'.format(stars, s, pad)

格式字符串中包含在{}中的內容稱為“替換字段”。 替換字段中的第一項是可選字段名稱。 這使我們可以識別.format哪個arg與此替換字段一起使用。 字段名稱有幾種可能的變體,這種格式字符串使用數字名稱,因此它按位置標識.format args。 也就是說,0對應於stars ,1對應於s ,2對應於pad

如果沒有給出字段名稱,它們將自動填入數字0,1,2,...等等(除非您使用的是Python 2.6,其中字段名稱是必需的)。 這在大多數情況下非常有用,因此大多數格式字符串都不會使用字段名稱。

在字段名稱之后,我們可以給出“格式說明符”或“格式規范”,其描述了如何呈現該值。 冒號:將字段名稱與格式規范分開。 如果您沒有提供格式規范,那么您將獲得一個默認格式,並且大部分時間都是足夠的。 但在這里我們確實需要更多控制,因此我們需要提供格式規范。

在表單規范中, >符號強制字段在可用空間內右對齊。 在對齊符號之后,我們可以提供一個數字來指定最小字段寬度; 如有必要,該字段將自動變大。

例如, '{0:>6}'.format('test')表示將參數0('test')放在一個至少6個字符寬的空間中,與右邊對齊。 這導致字符串' test'

但格式規范實際上可以包含一個全新的替換字段! 這允許我們提供變量來控制字段寬度。 所以在我的格式字符串{1:>{2}}說把ARG 1此處( s ),右對齊在現場與ARG 2(給定寬度pad )。 只允許一個級別的替換字段嵌套,但很難想象您實際上需要更深層次嵌套的情況。

所以把它們放在一起: '{0}\\n{1:>{2}}\\n{0}'告訴.format使用默認格式規范構建一個以arg 0( stars )開頭的字符串,然后是換行符,然后是arg 1( s )在寬度pad的字段中右對齊,接着是另一個換行符,最后再次跟隨arg 0( stars )。

我希望這足夠了。 :)


在Python 3.6+中,我們可以使用f-string:

def banner(s, width=69):
    stars = '*' * width
    pad = (width + len(s)) // 2
    return f'{stars}\n{s:>{pad}}\n{stars}'

也許 :

print '*' * 80 + '\n' + ' ' * 38 + 'hello' + '\n' + '*' *80

或者如果是python3

a = lambda x,c,mess: print(c*x + ('\n' if not mess else mess))
a(80, '*', None)
a(38, ' ', 'Hello')
a(80, '*', None)

另一種方法是使用textwrap模塊

import textwrap

decorator = """\
            ****
            {0}
            ****"""

print(textwrap.dedent(decorator.format("hello")))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM