字符串格式化(formatting)即把若干个变量填入一个事先设置的符合特定格式的“字符串模板”中。一般把该字符串模板叫做格式串(formatter,往往简记为“fmt”),待填入的变量构成的列表叫做变量列表。python中的字符串格式化有非常多的方式。常见的就有f-字符串、format方法、类C/C++ printf格式的格式化表达式(下简称“C格式表达式”)、格式化替代模板以及textwrap这些。这些方法简要梳理如下图。

一般而言,“官档”推荐使用Python 3.6之后使用f-字符串处理简单的字符串格式化,使用format方法处理较为复杂的字符串格式化。Python 3.6之前则首推使用format方法处理字符串格式化。
f-字符串
f-字符串通过在字符串前面加上字母f并将待格式化变量写在可嵌套的花括号中从而实现大部分的字符串格式化操作,它是python 3.6引入的一大新特性。
f-string最直观的用法即按照特定格式处理已赋值的变量。使用时,在单行或多行的字符串前添加字母‘f’(或'F')表示这是个F字符串,并将变量置于花括号(“{}”)中。
# 本例来自Python官档
who = 'nobody'
nationality = 'Spanish'
info = f'{who.title()} expects the {nationality} Inquisition!'
print(info)
![]()
注意,如果要表示花括号本身,则需要同时使用花括号两次。
# who和nationality变量同上述赋值
info = f'{who.title()} expects the {{{nationality} Inquisition}}!'
print(info)
![]()
可在变量后加上冒号,并声明变量的输出格式。
width = 6
precision = 4
value = 12.34567
# 变量右对齐,共占width格,保留精度数为precision
print(F"result:{value:{width}.{precision}}")
![]()
与其他形式的字符串格式化一样,除了变量输出的宽度外,f-字符串中也能声明变量输出时的对其形式以及是否带符号等。这方面可详见:string — Common string operations — Python 3.13.5 documentation
f-字符串还可以从数据结构(如字典取值或列表取下标等)、Unicode字符(可用\N{特殊符号名})以及简单表达式中取变量。这一特性使得它能处理多样化的字符串格式化需求。如下例根据数据字典person的键得到相应的值,然后填入模板串中
person = {"who":"nobody", "nationality":"Spanish"}
info = f'{person["who"].title()} expects the {person["nationality"]} Inquisition!'
print(info)
![]()
下例根据表达式的运行结果输出对应的内容
x = int(input("Please input number of egg/eggs in your basket: "))
print(f'''There {'are' if x > 1 else 'is'}{' an' if x == 1 else ''}{' ' + str(x) if x > 1 else ''}
egg{'s' if x > 1 else ''}.''')


下例是f-字符串中输出特定名称的Unicode符号
import math
print(f'√2 \N{ALMOST EQUAL TO} {math.sqrt(2):.5f}')
print(f'7 \N{CROSS MARK} 6 \N{double hyphen} 42')

这些可输出的符号具体可参考:https://en.wikipedia.org/wiki/List_of_Unicode_characters
f-字符串还可支持输出变量的ascii形式、repr形式以及str形式,此处不作展开,可详见:Built-in Types — Python 3.13.5 documentation
format方法
使用字符串对象的format方法是Python 3.6之前最常用,并且至今仍较为常用的字符串格式化方法。该方法书写和理解方面较为简便。使用该方法的基本格式为:
fmt.format(args)
fmt和args的格式
fmt为模式串,args为对应的变量列表。模式串中,待定参数(即格式化完成后需要用变量“填入”的参数)的书写格式为:
{fieldname[component] !conversionflag : format_specific}
四个均是可选变量。
fieldname为参数列表中对应的变量名,这个变量可以是个内置一般单变量(如数字、字符串),也可以是列表或数据字典这样的可取下标的数据结构。
print("Today is {weather}.".format(weather="rainy"))
![]()
component即fieldname是个可取下标的数据结构时,对应应当声明的下标。
forcast = {"today":"windy", "tomorrow":"sunny"}
print('''Today is {weather[today]},
and tomorrow will be {weather[tomorrow]}.'''.format(weather=forcast))
![]()
print("The medicine has {0}, {1} and {2}".format("Ca", "P", "K"))
# 也作
print("The medicine has {}, {} and {}".format("Ca", "P", "K"))
# 或可写作
components = ["Ca", "P", "K"]
print("The medicine has {lst[0]}, {lst[1]} and {lst[2]}".format(lst=components))
![]()
这其中第二条写法是因为参数列表中的三个参数与花括号(“{}”)出现位置严格一一对应,故此处可省略下标。
conversionflag为“字符串属性转换符”,是一个感叹号加上字母r, s或a,表示将变量列表中的对应变量相应转化为epr字符串、字符串或者ascii码。
format_specific 为格式化表达式,它也遵循特定形式。
格式化表达式
格式化表达式的形式为[[fill]align][sign][width][,][.precision][typecode]。这其中
- fill表示占位符,可以是除了“{"和”}”这两个花括号之外的任意符号,用来在变量的位数不足时“填充”字符串。
- align是对其符,有”<“、”>”、“=”和“^”,分别表示左对齐、右对齐、在符号后空格以及居中对齐,默认的情况是右对齐。
- 如果选了占位符,那么一定要选对齐符。
- sign表示数字变量的符号,可选值为“+”或“-”。
- 逗号为千位分隔符,选用时,数值变量每3位之间会用逗号隔开。
- precision为表示变量精确度的整数。
- typecode表示输出变量的类型,这个在python“官档”中处于一个比较难找的位置,给大家贴图总结如下(注:以下图片均来自“官档”:string --- 常见的字符串操作 — Python 3.13.5 文档)。




以下是一些举例
'''
'#'为填充符fill
'^'为居中对其
'{length}s'部分表示这个字符串(算上占位符)长度为30
'''
print("{:#^{length}s}".format("大型恐怖片:开学", length=30))
![]()
'''
,为千位声明符
.2f表示精确到小数点后2位
'''
str1 = "{:,.2f}, eggs, and {}".format(3333.1415926, "SPA!")
print(str1)
![]()
'''
两个待输出的东西填充符分别为'*'和'%'
'''
print('{foo[bar]:*<10s}{foo[1]:%>10d}'.format(foo={'bar':'test', 1:888}))
![]()
'''输出的内容类型是个百分数,精确到小数点后2位。'''
print("One quater is {:.2%}".format(0.25))
![]()
'''格式化特殊的内容如时间日期(官档示例)'''
import datetime
d = datetime.datetime(2010, 7, 4, 12, 15, 58)
'{:%Y-%m-%d %H:%M:%S}'.format(d)
C格式表达式
这类格式化表达式因形如C/C++中printf函数所用的格式化表达式,故得名。这部分Python官档写得比较清楚,且学过计算机编程的同学也都基本知道,故不作详细表述。可参考:
格式化替代模板
格式化替代模板是先用string模块下的Template类生成一个字符串模板,再调用substitute方法向模板中填入参数。该字符串格式化方式往往用于长文本的字符串格式化,比如向HTML页面代码中填入相应变量值。使用时,模板中待填入的变量前面应加上“$”符号,这点与php的变量格式比较类似。
import string
t = string.Template("""
<HTML>
<TITLE>$title</TITLE>
<BODY>
<p>$msg</p>
</BODY>
</HTML>
""")
def getMsg(power, torque):
template = """此新车有{0}马力, {扭矩:^{tor}d}牛米。"""
msg = template.format(power, tor=7, 扭矩=torque)
return msg
print(t.substitute({'title':'My first web',
"msg" : getMsg(1200, 1500)}))

textwrap
textwrap模块提供对长文本的整理功能,可使得输出的文本更加美观。如该模块的fill方法即按特定“长度”润色文本。
virus_text = """ 2019新型冠状病毒(2019-nCoV),因2019年病毒性肺炎病例而被发现,
2020年1月12日被世界卫生组织命名。
冠状病毒是一个大型病毒家族,已知可引起感冒以及中东呼吸综合征(MERS)和严重急性呼
吸综合征(SARS)等较严重疾病。
新型冠状病毒是以前从未在人体中发现的冠状病毒新毒株。 """
# 移除缩进
print(textwrap.fill(virus_text, width=70))

该模块下还有
- dedent - 移除文本每一行开头的空格;
- wrap - 将文本中的“每句”以列表形式返回;
- shorten - 缩短文本;
总结
Python字符串格式化的方式多样,但学习和使用也较为复杂。建议读者根据自己的格式化需要选择相应合适的格式化办法。学习和使用Python格式化的重点是要了解每种格式化办法的基本格式,在此基础上结合官档,编制合适的Python格式化代码。
2451

被折叠的 条评论
为什么被折叠?



