1、python到底有那几种字符串格式化模块?

python有3种格式化字符串的方法:

  • 传统的%字符串格式符
  • str.format函数
  • 字符串模版template

新的python 3.6+还提供了新的f修饰符

2、传统的%字符串格式符

python采用了类似于在C语言中使用sprintf的字符串格式化输出。String对象有一个独特的内置操作:%操作符。 这也称为字符串格式化或插值运算符。 给定格式%值(其中format是字符串),转换规范将格式的%将替换为零个或多个元素值。

‘%[[(key)][flag][width][.precision]]type’%(key list)

如果format单个参数,则key可以是单个非元组对象: ‘%s’%key。否则,值必须是具有格式字符串指定的项目数的元组,或者是单个映射对象(例如,字典)。

flag可以是#, 0, -, 空格,或是+:

Flag    意义
# The value conversion will use the ``alternate form'' (where defined below).
The conversion will be zero padded for numeric values.
- The converted value is left adjusted (overrides the "" conversion if both are given).
(a space) A blank should be left before a positive number (or empty string) produced by a signed conversion.
+ A sign character ("+" or "-") will precede the conversion (overrides a "space" flag).

type可以是下面定义不同类型:

type 意义                    注释
d Signed integer            decimal.
i Signed integer            decimal.
o Unsigned octal.           ()
u Unsigned                decimal.
x Unsigned hexadecimal (lowercase). ()
X Unsigned hexadecimal (uppercase). ()
e Floating point exponential format (lowercase).
E Floating point exponential format (uppercase).
f Floating point             decimal format.
F Floating point             decimal format.
g Same as "e" if exponent is greater than - or less than precision, "f" otherwise.
G Same as "E" if exponent is greater than - or less than precision, "F" otherwise.
c Single character (accepts integer or single character string).
r String (converts any python object using repr()). ()
s String (converts any python object using str()). ()
% No argument is converted, results in a "%" character in the result.

比如:

  • >>> '%(name)s GPA is %(#)07.3f'%{'name':'Yue', '#':88.2}
    'Yue GPA is 088.200'

  • >>> '%(name)10s GPA is %(#) 7.2f'%{'name':'Jun', '#':89.1299}
    '          Jun GPA is 89.13'

3. str.format函数

PEP 3101 规定了使用str.format()函数格式化字符串的标准。str.format()的语法:

'...{replacement_field}...'.format(*arg, **kargs)

具体解释如下:

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

例子:

>>> 'Bring {0} a {1}'.format('me', 'apple')  # 和C#有点像,数字代表位置
'Bring me a apple'
>>> 'Bring {} a {}'.format('me', 'apple')
'Bring me a apple'
>>> 'Bring {name} a {fruit}'.format(fruit='me', name='apple')
'Bring apple a me'

下面是format_spec的定义:

format_spec ::=  [[fill]align][sign][#][][width][,][.precision][type]
fill ::= <any character>
align ::= "<" | ">" | "=" | "^"
sign ::= "+" | "-" | " "
width ::= integer
precision ::= integer
type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

有时候,还需要更进一步定制,这时需要使用string模块里的formatter类来定制格式, Formatter类有以下公共函数:

  • format(format_string*args**kwargs):它调用下面vformat函数。
  • vformat(format_stringargskwargs):根据参数和格式化串产生相应的字符串。它调用下面可以重载的函数。

此外,Formatter类还定义了其他一些可以重载的函数:

  • parse(format_string):分解格式化定义format_string;
  • get_field(field_nameargskwargs):根据parse()的输出,为某一field产生格式化对象;
  • get_value(keyargskwargs):获取某一field的值;
  • check_unused_args(used_argsargskwargs)
  • format_field(valueformat_spec)
  • convert_field(valueconversion)

4. 字符串模版template

模板支持基于$的替换,而不是正常的基于%的替换:

  • $$用于替换$。
  • $ identifier命名匹配映射关键字“identifier”的替换占位符。 默认情况下,“identifier”必须拼写Python标识符。 $字符后面的第一个非标识符字符终止此占位符规范。
  • $ {identifier}相当于$ identifier。 当有效标识符字符跟随占位符但不是占位符的一部分时,例如“$ {noun} ification”,则需要它。
  • 字符串中$在其他任何地方出现,都将导致ValueError异常。

例子:

>>> from string import Template
>>> s1 = Template('Today is $weekday, it is $weather')
>>> s1.substitute(weekday = 'Tuesday', weather = 'sunny')
'Today is Tuesday, it is sunny'
>>> s1.substitute(weekday = 'Tuesday')
...
KeyError: 'weather'
>>> s1.safe_substitute(weekday = 'Tuesday')
'Today is Tuesday, it is $weather'
>>> s2 = Template('$fruit is $2.99 per pound')
>>> s2.substitute(fruit = 'apple')
...
ValueError: Invalid placeholder in string: line , col
>>> s2 = Template('$fruit is $$2.99 per pound')
>>> s2.substitute(fruit = 'apple')
'apple is $2.99 per pound'

References:

[1] https://docs.python.org/2/library/stdtypes.html#string-formatting

[2] https://docs.python.org/2/library/string.html

python的字符串格式化的更多相关文章

  1. Python基础-字符串格式化_百分号方式_format方式

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  2. python(七)字符串格式化、生成器与迭代器

    字符串格式化 Python的字符串格式化有两种方式:百分号方式.format方式 1.百分号的方式 %[(name)][flags][width].[precision]typecode (name) ...

  3. Python 的字符串格式化和颜色控制

    (部分内容源自武神博客和网络收集.) Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两 ...

  4. Python:字符串格式化

    Python中提供了多种格式化字符串的方式,遇到一个项目,在一个文件中,就用了至少两种方式.特别是在使用Log时,更让人迷惑. 因此特地花时间来了解一下Python中字符串格式化的几种方式: # -* ...

  5. python中字符串格式化%与.format

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  6. Python进阶-字符串格式化

    目录 前言 %格式化 str.format() f-Strings 特殊符号处理 前言 在 Python 3.6 之前,字符串格式化方法主要有两种: %格式化 str.format() 在Python ...

  7. Python: 字符串格式化format()函数的使用

    python从2.6开始支持format,新的更加容易读懂的字符串格式化方法,从原来的% 模式变成新的可读性更强的 花括号声明{}.用于渲染前的参数引用声明, 花括号里可以用数字代表引用参数的序号, ...

  8. 第十篇 Python的字符串格式化

    字符串格式化:就是按照你的意愿做一个拼接的过程. 1. 字符串格式化的第一种方式:百分号方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存. %[ ...

  9. python中字符串格式化的意义(化妆)

    格式 描述%% 百分号标记 #就是输出一个%%c 字符及其ASCII码%s 字符串%d 有符号整数(十进制)%u 无符号整数(十进制)%o 无符号整数(八进制)%x 无符号整数(十六进制)%X 无符号 ...

随机推荐

  1. 静默安装oracle后,启动oem报错,解决方法!

    一.手工重建EM Oracle 的gridcontrol 由两部分组成:dbcontrol 和repository. 我们可以对某一部分进行操作,也可以同时进行操作. 这里先看一个因为修改hostna ...

  2. ubuntu修改用户环境变量解决音乐播放器Rhythmbox乱码问题

    先打开主文件夹 cd /home/user #user是你的用户名 然后编辑用户环境 sudo gedit .profile在打开的文件中添加: export GST_ID3_TAG_ENCODING ...

  3. 使用 libffi 实现 AOP

    核心还是利用oc消息的查找派发机制,进行类结构的动态修改,用新函数替换老函数,然后再调用老函数. 前言     众所周知,使用runtime的提供的接口,我们可以设定原方法的IMP,或交换原方法和目标 ...

  4. virtualbox+vagrant学习-2(command cli)-23-vagrant version命令

    Version 格式: vagrant version options只有 -h, --help 该命令将告诉你已安装的vagrant版本以及当前可用的vagrant最新版本. userdeMacBo ...

  5. CentOS7.2安装mysql

    1. 下载Mysql yum包 http://dev.mysql.com/downloads/repo/yum/ 复制链接使用wget下载 wget http://repo.mysql.com/mys ...

  6. PAT乙级1005

    1005 继续(3n+1)猜想 (25 分) 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程 ...

  7. Linux内存调试工具初探-MEMWATCH(转)

    C 语言作为 Linux 系统上标准的编程语言给予了我们对动态内存分配很大的控制权.这种自由可能会导致严重的内存管理问题,可能导致程序崩溃或随时间的推移导致性能降级. 内存泄漏(即 malloc()  ...

  8. 倒计数锁存器(CountDown Latch)和 CyclicBarrier(同步屏障)

    倒计数锁存器(CountDown Latch)是异常性障碍,允许一个或多个线程等待一个或者多个其他线程来做某些事情. public static long time(Executor executor ...

  9. iOS 多线程:『RunLoop』详尽总结

    1. RunLoop 简介 1.1 什么是 RunLoop? 可以理解为字面意思:Run 表示运行,Loop 表示循环.结合在一起就是运行的循环的意思.哈哈,我更愿意翻译为『跑圈』.直观理解就像是不停 ...

  10. OO第一次总结作业

    第一次OO博客作业 前言 面向对象课程已经经过了4周的时间.前三次作业全部是关于多项式求导的相关内容,内容由易到难,同时我也开始逐渐深入感受学习面向对象的各项特征,逐渐将自己的编程风格从C向真正的面向 ...