Python字符串格式化:str.format详解与标准说明符指南

何川
何川
发布时间:2026-10-13| 3人浏览过
原创

本文深入解析Python中str.format函数的使用方法,对比传统%操作符的优势。详细讲解标准说明符的语法结构,包括填充、对齐、符号、精度及类型转换等参数,并介绍预转换标识与__format__方法的自定义实现,帮助开发者掌握高效、灵活的字符串格式化技巧。

自Python 2.6版本起,引入了str.format函数以替代原有的%操作符。该方法在直观性和灵活性上均优于旧式写法,下文将详细阐述其具体应用方式。

以下展示使用%操作符的示例代码:

""
"PI is %f..." % 3.14159 # => 'PI is 3.141590...'
"%d + %d = %d" % (5, 6, 5+6) # => '5 + 6 = 11'
"The usage of %(language)s" % {"language": "python"} # => 'The usage of python'

这种格式与C语言中的printf类似。由于%是操作符,其左右两侧各只能放置一个参数,因此当右侧包含多个值时,必须使用元组或字典进行包裹,且不能混合使用,这限制了其灵活性。

使用format方法改写上述示例如下:

"PI is {0}...".format(3.14159) # => 'PI is 3.14159...'
"{0} + {1} = {2}".format(5, 6, 5+6) # => '5 + 6 = 11'
"The usage of {language}".format(language = "Python") # => 'The usage of Python'

这种写法是否更加直观?(当然,习惯C语言printf格式的开发者可能仍偏爱前一种方式 :-) )

格式化字符串

"{named} consist of intermingled character {0} and {1}".format("data", "markup", \
  named = "Formats trings")
format(10.0, "7.3g") # => '   10'
"My name is {0} :-{{}}".format('Fred') # => 'My name is Fred :-{}'

请注意第一行中的'\'符号。若需将单个语句换行书写,必须在行尾添加反斜杠进行转义。

使用%操作符无法实现元组与字典的混用。此处涉及命名参数,这是Python的一项特性。在定义数组时,可使用*args和**kwargs语法展开集合与字典。需注意,命名参数应置于位置参数之后。

第二条语句展示了format内置函数用于格式化单个值的情况。

第三条语句演示了{}的转义方法。由于{}在格式化字符串中属于特殊字符,无法直接显示,因此需通过多嵌套一层大括号来实现转义。

使用属性和索引

"My name is {0.name}".format(open('out.txt', 'w')) # => 'My name is out.txt'

'{0.name}' 的用法等同于调用对象的属性,例如 open('out.txt', 'w').name

"My name is {0[name]}".format(dict(name='Fred')) # => 'My name is Fred'

使用索引同样可行。

obj[key] 的机制等同于调用 obj.__getitem__('key')

标准说明符(Specifiers)

熟悉C语言的程序员应了解printf的复杂性。format函数也定义了一系列标准说明符,用于解释值的格式并将其插入字符串中。例如:

"My name is {0:8}".format('Fred') # => 'My name is Fred  '

':'之后的部分即为说明符。在上述示例中,说明符仅包含'8'(即minimumwidth),表示插入值的宽度至少为8。由于'Fred'仅占4个字符,因此额外补充了4个空格。

说明符的详细格式结构如下:

[[fill]align][sign][#][0][minimumwidth][.precision][type](这并不比C语言的printf更简洁!)

注意:'[]'表示该元素为可选。因此,所有格式说明符均为可选参数!如前例所示,大部分示例并未使用完整格式(仅为清晰起见)。实际上,这些参数非常实用。

我们逐一解析: 1、[fill]align 表示排列方式。当设置的minimumwidth大于插入值的长度时,会产生留白,如前例中的'My name is Fred '。默认情况下,留白位于右侧,即插入值默认左对齐。若尝试使用{0:>8},结果将变为右对齐的'My name is Fred'。 fill 表示用于填充留白的字符。仅在指定align时,fill才生效!align可以是以下标识之一:

  • < 左对齐,此为默认设置
  • > 右对齐
  • = 将留白放置在align标识之后,此选项仅对数字有效。具体含义如下:align涉及数字正负号的显示,同样仅适用于数字。若指定'=',则数字的正负号将显示在留白之前。例如:format(-12, "0=8") # => '-0000012'。此处使用的是格式化单个值的内置函数format。'0'为fill元素,用于填充留白;'='为标识符;'8'指定最小宽度为8,从而产生5个留白。至于align,此处使用默认的'-',后续将详细讲解。
  • ^ 居中对齐

2、sign 数字符号,此选项仅对数字有效。

  • + 显示加号和减号
  • - 不显示加号,仅显示减号。在未指定最小宽度的情况下,负数总是比正数多占用一个符号位置。此为默认设置。
  • ' ' (一个空格) 使用留白代替加号

3、# 显示数字的前缀以表示进制(如0b、0o、0x)

4、0 使用'0'填充留白。

5、minimumwidth 指定最小宽度,前文已多次使用。

6、.precision 'precision'为十进制数字,表示显示小数点后的位数。

7、type 值的类型:

①整型:

  • b 二进制
  • c 字符型,将数字转换为表示Unicode的字符
  • d 十进制
  • o 八进制
  • x 十六进制,显示小写字母
  • X 十六进制,显示大写字母
  • n 行为与d相同,采用本地化的数字表示方式
  • ''(空,无空格) 行为与d相同

②浮点数

  • e 科学计数法表示,使用小写e
  • E 科学计数法表示,使用大写E
  • f 显示为定点数,默认保留小数点后六位
  • F 与f相同
  • g 自动选择是否使用科学计数法表示
  • G 与g相同
  • n 与g相同,采用本地化表示方式
  • % 使用百分比表示
  • ''(空) 与g相同

每个对象均可重写自身的格式化说明符,例如datetime类重写后可按以下方式表示:

"Today is: {0:%a %b %d %H:%M:%S %Y}".format(datetime.now())

预先转换

:之后为格式说明符,在此之前还可以添加预转换标识

  • !r 调用对象的__repr__方法转换为标准字符串
  • !s 调用对象的__str__方法转换为字符串

重写__format__方法

在格式化字符串时,首先对每个值进行格式化,然后将其插入字符串内。格式化值调用的是format内置方法,而format则简单地调用该值的__format__方法。

def format(value, format_spec):
  return value.__format__(format_spec)

在object类中实现了__format__方法,其功能是将对象本身通过str()转换为字符串,然后将该字符串传入内置的format方法,实际上即调用转换后的__format__方法。

class object:
  def __format__(self, format_spec):
    return format(str(self), format_spec)

int/float/str自身实现了__format__方法,前文已介绍它们各自的说明符。

结束语

还有一点涉及自定义Formatter,不过日常使用中较少遇到。这留作下篇关于string模块源码解读的内容。建议有兴趣的开发者多阅读Python标准库的源码,这极具学习价值。

以上就是本文的全部内容,希望对大家的学习有所帮助,也欢迎大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。