Python格式化字符串format

文章作者:Tyan
博客:noahsnail.com  |  CSDN  |  简书

0. 测试环境

Python 3.6.9

1. 引言

Python中格式化字符串的方式有,一种是用%操作符来进行字符串格式化,一种是使用str.format()来进行字符串格式化,本文主要介绍str.format()方式,这种方式更主流,也是官方推荐的方式,%的方式后面会逐渐淘汰。

2. 格式化字符串

2.1 基本语法

格式化字符串包含用大括号{}括起来的“替换字段”,。大括号中不包含的内容被视为正常文本,会原样输出。注意:如果要在文本中输出大括号,需要使用{{}}来转义,不是使用场景的转义字符\。示例如下:

>>> 'This is a format {}.'.format('test')
'This is a format test.'
>>> 'This is {{}} test.'.format()
'This is {} test.'

下面是“替换字段”的语法,后面的示例中会具体讲到:

replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
arg_name          ::=  [identifier | digit+]
attribute_name    ::=  identifier
element_index     ::=  digit+ | index_string
index_string      ::=  <any source character except "]"> +
conversion        ::=  "r" | "s" | "a"
format_spec       ::=  <described in the next section>

2.2 位置参数标识符

格式化字符串中,默认情况下{}中可以不加位置标识符,即'{} {}'.format(a, b)'{0} {1}'.format(a, b)是等价的,但如果位置标识符在字符串中不是按参数顺序出现的,则需要显示的指明位置标识符。示例代码如下:

>>> '{0} {1}'.format('one', 'two')
'one two'
>>> '{} {}'.format('one', 'two')
'one two'
>>> '{1} {0}'.format('one', 'two')
'two one'
>>> '{0} {1} {0}'.format('one', 'two')
'one two one'

2.3 设置参数

格式化字符串中可以使用变量、字典、列表索引、类的属性等来设置参数。示例代码如下:

print('Name: {name}, URL: {url}'.format(name='Tyan', url='http://noahsnail.com'))

name = 'Tyan'
url = 'http://noahsnail.com'
print('Name: {}, URL: {}'.format(name, url))

site = {'name' : 'Tyan', 'url' : 'http://noahsnail.com'}
print('Name: {site[name]}, URL: {site[url]}'.format(site=site))
print('Name: {name}, URL: {url}'.format(**site))

site = ['Tyan', 'http://noahsnail.com']
print('Name: {0[0]}, URL: {0[1]}'.format(site))

class Test(object):
    def __init__(self):
        self.name = 'Tyan'
        self.url = 'http://noahsnail.com'

print('Name: {0.name}, URL: {0.url}'.format(Test()))

site = {'name' : 'Tyan', 'url' : 'http://noahsnail.com'}
print('Name: {name}, URL: {url}'.format(**site))

# Output
Name: Tyan, URL: http://noahsnail.com
Name: Tyan, URL: http://noahsnail.com
Name: Tyan, URL: http://noahsnail.com
Name: Tyan, URL: http://noahsnail.com
Name: Tyan, URL: http://noahsnail.com
Name: Tyan, URL: http://noahsnail.com
Name: Tyan, URL: http://noahsnail.com

2.3 转换标志(conversion)

转换标志以!开始,主要有三种!s!r!a,分别会调用参数对象的__str____repr____ascii__方法。

class Test(object):

    def __str__(self):
        return 'Test str function.'


    def __repr__(self):
        return 'Test repr function.'


    def __ascii__(self):
        return 'Test ascii function.'


print('str: {t!s}, repr: {t!r}, ascii: {t!a}'.format(t=Test()))

# Ouput
str: Test str function., repr: Test repr function., ascii: Test repr function.

2.4 格式化说明(format_spec)

格式化说明包含了值表示的说明,包括字段宽度、对其方式、填充、小数准确率等,其以:开头。标准格式化说明符的一般形式为:

format_spec     ::=  [[fill]align][sign][#][0][width][grouping_option][.precision][type]
fill            ::=  <any character>
align           ::=  "<" | ">" | "=" | "^"
sign            ::=  "+" | "-" | " "
width           ::=  digit+
grouping_option ::=  "_" | ","
precision       ::=  digit+
type            ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
  • <表示输出结果左对齐,>是右对齐,^是居中对其,=表示填充值在符号之后数字之前,例如+00001234
  • +表示正负数字都要带符号,-表示只有负数需要带负号,表示正数前面带空格,负数前面带负号。
  • 数字表示。b表示二进制格式,c表示将整数转换为字符,d表示十进制整数,o表示八进制格式,x,X表示十六进制格式,x大于9的字母为小写,X大于9的字母为大写。默认为d
  • 其它说明符的具体解释可参考文档[1]。

示例及结果如下:

print('{:<8}'.format('1234'))
print('{:>8}'.format('1234'))
print('{:^8}'.format('1234'))

print('{:*>8}'.format('1234'))
print('{:*<8}'.format('1234'))
print('{:*^8}'.format('1234'))

print('{:+f}; {:+f}'.format(3.14, -3.14))
print('{: f}; {: f}'.format(3.14, -3.14))
print('{:-f}; {:-f}'.format(3.14, -3.14))

print('int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}'.format(100))
print('int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}'.format(100))

print('{:,}'.format(100000000))

print('{:.2e}'.format(100000000))

print('percentage: {:.2%}'.format(1 / 3))


import datetime
print('{:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now()))


# Output
1234    
    1234
  1234  
****1234
1234****
**1234**
+3.140000; -3.140000
 3.140000; -3.140000
3.140000; -3.140000
int: 100;  hex: 64;  oct: 144;  bin: 1100100
int: 100;  hex: 0x64;  oct: 0o144;  bin: 0b1100100
100,000,000
1.00e+08
percentage: 33.33%
2020-06-18 19:36:38

References

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

  2. https://www.runoob.com/python/att-string-format.html

  3. https://stackoverflow.com/questions/1436703/difference-between-str-and-repr/1436756

  4. https://stackoverflow.com/questions/9196066/what-does-a-double-colon-followed-by-an-equals-sign-mean-in-programming-do

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343