Python中的format格式化、填充与对齐、数字格式化方式

文章目录

  • 一、format语法
  • 二、format格式化的用法
  • 2.1、按照先后顺序替换{}
  • 2.2、按照索引进行匹配替换{0}
  • 2.3、按关键字索引进行匹配替换
  • 2.4、通过列表索引格式化字符串
  • 2.5、使用元组
  • 2.6、通过字典设置格式化字符串
  • 2.7、混合使用
  • 三、字符串填充与对齐
  • 3.1、左对齐及填充
  • 3.2、右对齐及填充
  • 3.3、居中对齐及填充
  • 四、格式化
  • 4.1、格式化数字
  • 4.2、格式化日期和时间
  • 五、format() 方法综合应用
  • format函数是Python中强大的字符串格式化方法,它允许程序员通过大括号{}来为字符串中的插入点占位,并通过传入参数进行替换,{0}、{1}分别代表不同的参数

    以下内容基于Python3.13进行讲解。

    一、format语法

    官网地址:https://docs.python.org/zh-cn/3/library/functions.html#format

    语法一:format()函数

    format(value, format_spec='')
    

    将 value 转换为“格式化后”的形式,格式由 format_spec 进行控制。format_spec 的解释方式取决于 value 参数的类型;

    语法二:str.format()

    str.format(*args, **kwargs) 常见形式为:  ''.format()
    
    如:print('我是{}'.format('小明'))
    

    {}一般被称为

    format_spec常用格式:

    '{[index][:[fill]align][sign][#][width][grouping_option][.precision][type]}{......}{......}'.format(),格式中[]内的参数都是可选参数,每个{}都表示是一个待替换的字符串。
    
    format_spec     ::=  [[fill]align][sign]["z"]["#"]["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" | "%"
    

    index:指定冒号后面出现的参数在format()中的索引值,如果没有,则以format()中的默认顺序自动分配。

    fill:指定空白处的填充符,默认是空格,可以是任意单个字符

    align:指定数字的对齐方式。

    align 含义
    < 左对齐,对于大部分对象时为默认
    > 右对齐,对于数字时为默认
    = 数据右对齐,同时将符号放置在填充内容的最左侧,该选项只对数字类型有效
    ^ 数据居中,此选项需和 width 参数一起使用

    请注意,除非定义了最小字段宽度,否则字段宽度将始终与填充它的数据大小相同,因此在这种情况下,对齐选项没有意义。

    sign:指定有无符号数 。

    sign 含义
    + 正数前面添加 ‘ + ’ ,负数前面加 ‘ – ’ 例如 +3 , -1 。
    表示正负号仅用于负数(这是默认行为)。正数前面不添加 ‘ + ’ ,负数前面加 ‘ – ’。例如 3 , -1。
    space 正数前面添加 ‘ 空格 ’ ,负数前面加 ‘ – ’
    # 对于二进制数、八进制数和十六进制数,使用此参数,各进制数前会分别显示 0b、0o、0x前缀;反之则不显示前缀

    width:指定输出数据时所占的宽度。

    grouping_option :千分位分隔符,一般为"_" 或 “,” 。

    .precision:如果后面存在type参数,则指的是保留小数的位数,如果type参数不存在,则是指有效数字的位数。

    type:指定输出数据的具体类型。

    type 含义
    s 对字符串类型格式化,这是字符串的默认类型,可以省略。
    % 显示百分比,默认显示小数点后六位,将数字乘以 100 后面带一个百分号。
    d 十进制整数
    c 将十进制整数自动转化成对应的Unicode字符
    b 将十进制数自动转化成二进制数,并格式化输出
    o 将十进制数自动转化成八进制数,并格式化输出
    x 十六进制数,a 到 f 小写
    X 十六进制数,A 到 F 大写。 在指定 ‘#’ 的情况下,前缀 ‘0x’ 也将被转为大写形式 ‘0X’。
    e 转化成科学计数法,并格式化输出
    E 科学计数法。 与 ‘e’ 相似,不同之处在于它使用大写字母 ‘E’ 作为分隔字符。
    f 转化为浮点数,对 float 采用小数点之后 6 位精度,而对 Decimal 则使用大到足够显示所有系数位的精度。
    F 定点表示。 与 ‘f’ 相似,但会将 nan 转为 NAN 并将 inf 转为 INF。
    g、G 自适应转化为e或f(E或F),并格式化输出

    简单示例:

    print("{0}{1}".format("Hello"," World!")) #输出:Hello World!
    print("{0:+<20}".format("Python"))#输出:Python++++++++++++++
    print("{0:+>20}".format("Python"))#输出:++++++++++++++Python
    print("{0:+^20}".format("Python"))#输出:+++++++Python+++++++
    #还可以不需要槽样式,直接将槽样式写在format函数的参数里
    print(format("Hello"),format("World")) #输出:Hello World!
    print(format("Python",'+<20'))#输出:Python++++++++++++++
    print(format("Python",'+>20'))#输出:++++++++++++++Python
    print(format("Python",'+^20'))#输出:+++++++Python+++++++
    

    二、format格式化的用法

    2.1、按照先后顺序替换{}

    格式如下:

    "{} {}".format(values1, values2)
    

    说明:format 会把参数按位置顺序来填充到字符串中,按照顺序自动分配,而且一个参数可以多次插入。{{}} 仅代表{},不占用字符串格式化位置顺序。

    示例:

    #  {} 和参数的个数必须匹配,否则会报错。
    name='张三'
    age=19
    s="我的名字是:{},年龄是:{}"
    print(s.format(name,age) )
    

    输出为:

    我的名字是:张三,年龄是:19
    

    2.2、按照索引进行匹配替换{0}

    格式如下:

    "{0} {1}".format(value1, value2)
    

    说明:按索引编号来匹配替换 {索引} 的值。

    {0},{1}代表的占位符,数字占位符要注意顺序。下标从0开始

    name='张三'
    age=19
    s="我的名字是:{0},年龄是:{1}"
    print(s.format(name,age) )
    

    输出为:

    我的名字是:张三,年龄是:19
    

    索引下标可多次使用

    print('我是{0},我喜欢{1},你喜欢{1}吗?'.format('小明','打羽毛球'))
    
    输出:我是小明,我喜欢打羽毛球,你喜欢打羽毛球吗?
    

    先后顺序与索引下标不能混合一起使用,下面的用法将报错:

    print('我是{0},我喜欢{1},你喜欢{}吗?'.format('小明','打羽毛球','乒乓球'))
    
    输出:
    ValueError: cannot switch from manual field specification to automatic field numbering
    

    索引下标不能越界,即不能超过format给出的值数量,注意下标是0开始,下面用法将报错:

    print('我是{2}'.format('小明','打羽毛球'))
    
    输出:IndexError: tuple index out of range
    

    2.3、按关键字索引进行匹配替换

    格式如下:

    "{关键字索引1} {关键字索引2}".format(关键字索引1 = value1, 关键字索引2 = value2)
    
    s="我的名字是:{name},年龄是:{age}"
    print(s.format(age=19,name='张三') )
    
    year = 2024
    month = 11
    s = "现在是{year1}年{month1}月"
    print(s.format(year1=year,month1=month) )
    

    输出为:

    我的名字是:张三,年龄是:19
    现在是2024年11月
    

    2.4、通过列表索引格式化字符串

    格式如下:

    列表名=['列表值1','列表值2','列表值3'...]
    "{List[列表索引1]},{List[列表索引2]}".format(List = 列表名)
    
    说明:在format格式化时,可使用 * 对list拆分
    

    示例:

    list1 = ["张三",22]
    list2 = [2002,10,22]
    list3 = ["Tom","Jerry","Rose","Black"]
    list4 = [25,22,20,24]
    print("我叫{list[0]},今年{list[1]}岁了。".format(list=list1))
    print("我叫{0[0]},今年{0[1]}岁了。".format(list1))
    print("李明的生日:{list[0]}-{list[1]}-{list[2]}".format(list=list2))
    print("{0[0]}的年龄为{1[1]};{0[1]}的年龄为{1[2]};{0[2]}的年龄为{1[0]};{0[3]}的年龄为{1[3]}。".format(list3,list4))
    
    # 使用 *与** 对list进行拆分
    print("李明的生日:{1}-{2}-{0}".format(*list2))
    
    运行结果为:
    ======================================================================
    我叫张三,今年22岁了。
    我叫张三,今年22岁了。
    李明的生日:2002-10-22
    Tom的年龄为22;Jerry的年龄为20;Rose的年龄为25;Black的年龄为24。
    李明的生日:10-22-2002
    

    关于*list拆分列表的用法参考python中的*与**用法详解

    2.5、使用元组

    元组与list用法一致,参考上面写法。

    test = ('小明','珠海市','天蝎座','小哥哥')
    print('我是{0[0]},来自{0[1]}的{0[2]}一枚{0[3]}'.format(test))
    print('我是{0},来自{1}的{2}一枚{3}'.format(*test))
    print('我是{},来自{}的{}一枚{}'.format(*test))
    
    #输出
    D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test3.py 
    我是小明,来自珠海市的天蝎座一枚小哥哥
    我是小明,来自珠海市的天蝎座一枚小哥哥
    我是小明,来自珠海市的天蝎座一枚小哥哥
    

    2.6、通过字典设置格式化字符串

    格式如下:

    字典名1={'字典索引1':'字典索引1的值', '字典索引2':'字典索引2的值', ...}
    "{字典索引},{字典索引值}".format(字典名1) 
    
    说明:在format格式化时,可使用 ** 对字典拆分
    
    dict1 = {"name":"张三","age":21}
    dict2 = {"year":2002,"month":10,"day":22}
    print("我叫{0[name]},今年{0[age]}岁了。".format(dict1))
    print("我叫{0},今年{1}岁了。".format(*dict1))
    print("李明的生日:{0[year]}-{0[month]}-{0[day]}".format(dict2))
    print("李明的生日:{0[month]}-{0[day]}-{0[year]}".format(dict2))
    print("我叫{name},今年{age}岁了".format(**dict1))
    # python2.7中不支持多个**入参,python3支持
    print("我叫{name},今年{age}岁了。生日:{year}-{month}-{day}".format(**dict1,**dict2))
    
    运行结果为:
    ==========================================
    我叫张三,今年21岁了。
    我叫age,今年name岁了。
    李明的生日:2002-10-22
    李明的生日:10-22-2002
    我叫张三,今年21岁了
    我叫张三,今年21岁了。生日:2002-10-22
    

    关于**dict的用法参考python中的*与**用法详解

    2.7、混合使用

    (1)可以通过索引,参数名来混合匹配。
    (2)注意:命名参数必须放在最后。否则编译时出现报错!
    (3)索引和默认格式化不可以混合使用。
    (4)支持对参数部分引用,可以通过索引对参数的部分进行取值。

    示例:

    list1 = ["张三",21]
    dict1 = {"year":2002,"month":10,"day":22}
    print("我叫{},生日为:{year}-{month}-{day},今年{}岁了。".format(*list1,**dict1))
    print("我叫{},今年{age}岁了。".format("李四",age=25))
    # print("我叫{},今年{age}岁了。".format(age=25,"李四")) #此代码错误,命名参数必须放在最后
    print("我叫{},今年{1}岁了。".format("李四",25))  #此代码错误,索引和默认格式化不可以混合使用
    
    程序运行结果为:
    =====================D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test.py =====================
    我叫张三,生日为:2002-10-22,今年21岁了。
    我叫李四,今年25岁了。
    Traceback (most recent call last):
      File "D:\WorkSpace-Python\Test\test.py", line 6, in <module>
        print("我叫{},今年{1}岁了。".format("李四",25))
    ValueError: cannot switch from automatic field numbering to manual field specification
    

    三、字符串填充与对齐

    format支持左对齐右对齐居中对齐

    如果你希望将变量打印在特定位置,可以使用对齐方式

    更多对齐与填充的方法参考《Python字符串对齐的几种方法、Python填充与对齐、Python中英文对齐》

    3.1、左对齐及填充

    格式如下:

    :<      # 左对齐填充
    <       # 左对齐,后面带宽度
    :       # 后面带填充的字符,只能是一个字符,不指定则默认是用空格填充
    

    示例:

    print('{:<10}!'.format('Python'))   # 默认填充空格
    print('{:0<10}!'.format('Python'))  # 用0填充
    print('{:<10}!'.format('中华人民万岁'))  # 默认填充空格
    
    运行结果:
    ======================================
    D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test.py 
    Python    !
    Python0000!
    中华人民万岁    !
    

    注意:python2与python3中对于中文字符串的填充是不一致的。

    #python2
    print('{:<10}!'.format('hello')) # 右边补充5个空格,使长度为10
    print('{:<10}!'.format('全世界')) # 右边补充一个空格,因为len('全世界')发现长度为9
    hello     !
    全世界 !
    
    # python3
    print('{:<10}!'.format('hello')) # 右边补充5个空格,使长度为10
    print('{:<10}!'.format('全世界')) # 右边补充7个空格,使长度为10
    hello     !
    全世界       !
    

    在Python 2和Python 3中,len()函数的主要区别在于它们对字符串的处理方式不同。‌

  • 在‌Python 2‌中,len()函数返回的是字节长度。这意味着如果字符串中包含非ASCII字符(如中文、日文等),len()返回的将是字节数而不是字符数。例如,对于包含中文的字符串,len()返回的将是字节长度,而不是字符数‌。
  • 而在‌Python 3‌中,len()函数直接返回字符数量。这是因为Python 3默认使用UTF-8编码,而UTF-8编码支持多字节字符,因此len()函数返回的是字符数而不是字节数。这意味着在处理包含非ASCII字符的字符串时,Python 3的len()函数能够正确地返回字符数‌
  • 3.2、右对齐及填充

    格式如下:

    :>  # 右对齐
    >   # 右对齐,后面带宽度,
    :   # 后面带填充的字符,只能是一个字符,不指定则默认是用空格填充
    

    示例如下:

    print('{:>10}!'.format('Python'))   # 默认填充空格
    print('{:0>10}!'.format('Python'))  # 用0填充
    print('{:>10}!'.format('中华人民万岁'))  # 默认填充空格
    
    运行结果:
    ======================================
    D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test.py 
        Python!
    0000Python!
        中华人民万岁!
    

    3.3、居中对齐及填充

    格式如下:

    :^   # 居中对齐
    ^    # 居中对齐,后面带宽度
    :    # 后面带填充的字符,只能是一个字符,不指定则默认是用空格填充
    

    示例如下:

    print('{:^10}!'.format('Python'))   # 默认填充空格
    print('{:0^10}!'.format('Python'))  # 用0填充
    print('{:^10}!'.format('中华人民万岁'))  # 默认填充空格
    
    运行结果:
    ======================================
    D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test.py 
      Python  !
    00Python00!
      中华人民万岁  !
    

    四、格式化

    4.1、格式化数字

    更多详细内容参考另一篇文章:python format格式化数字
    可以实现百分比、千分位、进制转换、字符填充与对齐等等。

    4.2、格式化日期和时间

    format() 函数在处理日期和时间时也非常有用,可以将日期和时间对象格式化为特定的字符串表示。

    from datetime import datetime
     
    # 格式化当前日期和时间
    now = datetime.now()
    formatted_datetime = "{:%Y-%m-%d %H:%M:%S}".format(now)
    print("Formatted datetime:", formatted_datetime)
    

    日期和时间符号参考:python中时间日期格式化符号

    五、format() 方法综合应用

    (1)打印左对齐图案

    代码如下:

    for i in range(1, 11):
        print("{:<{}}".format("*" * i, 10))
                    
    程序运行结果为:
    D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test3.py 
    *         
    **        
    ***       
    ****      
    *****     
    ******    
    *******   
    ********  
    ********* 
    **********
    

    (2)打印右对齐图案

    代码如下:

    for i in range(1, 11):
        print("{:>{}}".format("*" * i, 10))
                    
    程序运行结果为:
    D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test3.py
             *
            **
           ***
          ****
         *****
        ******
       *******
      ********
     *********
    **********
    

    (3)打印居中对齐图案

    代码如下:

    for i in range(1, 21, 2):
        print("{:^{}}".format("*" * i, 20))
                        
    程序运行结果为:
    D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test3.py
             *          
            ***         
           *****        
          *******       
         *********      
        ***********     
       *************    
      ***************   
     *****************  
    ******************* 
    

    参考或推荐文章:
    https://blog.csdn.net/weixin_44377973/article/details/132300478
    数字格式化:python format格式化数字
    https://zhuanlan.zhihu.com/p/632687543

    作者:五月天的尾巴

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python中的format格式化、填充与对齐、数字格式化方式

    发表回复