惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
博客园 - 【当耐特】
S
SegmentFault 最新的问题
阮一峰的网络日志
阮一峰的网络日志
大猫的无限游戏
大猫的无限游戏
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
F
Fortinet All Blogs
Y
Y Combinator Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
J
Java Code Geeks
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
B
Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理

Jiajun的技术笔记

你好,2026! TiDB 源码阅读(六):TiDB Coprocessor 源码解析 性能优化的核心思想 TiDB 源码阅读(五):索引 TiDB 源码阅读(四):AST、逻辑计划、物理计划 CockroachDB Serverless Architecture podman 无故退出 Cursor Control-L (CTRL-L) Keyboard Shortcuts in Terminal Replace docker with podman Using xmonad with xfce4 A RC script for freebsd frpc 自己动手写一个k8s controller AI 会取代你的(编程)岗位吗? 自建DERP服务器提升Tailscale连接速度(使用Nginx转发) 自动升级Docker容器 再读《程序员修炼之道-从小工到专家》 让浏览器下载文件 再读《软件随想录》/《黑客与画家》/《软技能》 HTTP 压力测试中的 Coordinated Omission 2的补码 编程语言中的 context 是什么? flutter macOS 构建出错 Flatpak 使用小记 Golang CAS 操作是怎么实现的 PostgreSQL 当MQ来使用 Clash 结合 工作VPN 的网络设计 使用 PostgreSQL 搭建 JuiceFS PostgreSQL 配置优化和日志分析 有GitHub Copilot?那就可以搭建你的ChatGPT4服务 窗口函数的使用(以PG为例)
Python字符串格式化
2017-04-16 · via Jiajun的技术笔记

说来惭愧,用Python这么久了,还没有系统的看过字符串格式化的文档,因为常用的也就 那么几个。这篇文章就总结一下Python的字符串格式化。

format() 方法

https://docs.python.org/3.4/library/string.html#format-string-syntax

先来看一下文档:

In [1]: format?
Docstring:
format(value[, format_spec]) -> string

Returns value.__format__(format_spec)
    format_spec defaults to ""
    Type:      builtin_function_or_method

format方法会替换value中 {} 包围的内容,其他字符直接拷贝过去不变。

具体允许的语法为:

"{" [field_name] ["!" conversion] [":" format_spec] "}"

其中 field_name 可以为空,为数字,为变量名,分别对应用法:

In [1]: "{}".format(1)
Out[1]: '1'

In [2]: "{0}{1}{2}".format(1, 2, 3)
Out[2]: '123'

In [3]: "{0}{1}{0}".format(1, 2)
Out[3]: '121'

In [4]: "{hello} world".format(hello="hello")
Out[4]: 'hello world'

并且 field_name 后可以接变量属性名,或者index,例如:

In [1]: class MyObject(object):
    ...:     val = 1
    ...:

In [2]: myobj = MyObject()

In [3]: "{.val}".format(myobj)
Out[3]: '1'

In [4]: "{0.val}".format(myobj)
Out[4]: '1'

In [5]: "{myobj.val}".format(myobj=myobj)
Out[5]: '1'
In [6]: atuple = (1, 2)

In [7]: "{0[1]}{0[0]}".format(atuple)
Out[7]: '21'

但是不可以使用字典里的值,因为引用字典中的值需要使用 adict["key"] 的形式, 会把当前字符格式打乱掉。其中上面所说的接点号进行属性引用调用 getattr,接 index引用调用 __getattr__

conversion有三个选项:

- `s` 将调用 `str()`
- `r` 将调用 `repr()`
- `a` 将调用 `ascii()` (Python 3才有)
In [1]: class MyObject(object):
   ...:     def __str__(self):
   ...:         return "__str__ been called"
   ...:     def __repr__(self):
   ...:         return "__repr__ been called"
   ...:

In [2]: myobj = MyObject()

In [3]: "{!r}".format(myobj)
Out[3]: '__repr__ been called'

In [4]: "{!s}".format(myobj)
Out[4]: '__str__ been called'

In [5]: "{!a}".format(myobj)
Out[5]: '__repr__ been called'

其中 {!a} 在调用完 repr() 之后把非ascii字符替换掉。

之后接 :,冒号之后是具体如何展现这个值,文档在:

https://docs.python.org/3.4/library/string.html#format-specification-mini-language

其格式为:[[fill]align][sign][#][0][width][,][.precision][type]

其中fill为填充空格的字符,默认不填则为空格,align可以是<>=^分别意味着向左靠齐, 向右靠齐,强制把正负号放在最左边,居中。

In [1]: "{:a>#30.4f}".format(3.1415926)
Out[1]: 'aaaaaaaaaaaaaaaaaaaaaaaa3.1416'

In [2]: "{:a<#30.4f}".format(3.1415926)
Out[2]: '3.1416aaaaaaaaaaaaaaaaaaaaaaaa'

In [3]: "{:a^#30.4f}".format(3.1415926)
Out[3]: 'aaaaaaaaaaaa3.1416aaaaaaaaaaaa'

In [4]: "{:a=#30.4f}".format(3.1415926)
Out[4]: 'aaaaaaaaaaaaaaaaaaaaaaaa3.1416'

In [5]: "{:a=#30.4f}".format(-3.1415926)
Out[5]: '-aaaaaaaaaaaaaaaaaaaaaaa3.1416'

逗号代表是否把整数每三位插一个逗号表示:

In [8]: "{:a=#30,.4f}".format(-300987.1415926)
Out[8]: '-aaaaaaaaaaaaaaaaa300,987.1416'

最后一位type可以是:

- `b` 二进制
- `c` 字符
- `d` 十进制
- `o` 八进制
- `x` 小写十六进制
- `X` 大写十六进制
- `n` 数字,和 `d` 一致不过会根据locale不同而改变

最后如果想在这里面表示双括号自己怎么办?

In [1]: "{{}}".format()
Out[1]: '{}'

In [2]: "{{".format()
Out[2]: '{'