Python字符串对齐的几种方法、Python填充与对齐、Python中英文对齐

文章目录

  • 一、简单字符串对齐
  • 1.1、使用 str.ljust()、str.rjust()、str.center() 方法进行对齐
  • 1.2、使用format() 方法
  • 1.2.1、python2与3对齐与填充的区别
  • 1.3、f-string
  • 二、高级字符串对齐(中英文对齐)
  • 2.1、wcwidth库
  • 在Python中,我们经常会遇到需要对字符串进行对齐的情况,比如左对齐、右对齐或者居中对齐。这在处理文本输出、日志格式化等场景中非常有用。

    以下整理python中字符串对齐的几种方法

    一、简单字符串对齐

    1.1、使用 str.ljust()、str.rjust()、str.center() 方法进行对齐

    三个方法用法类似,基本格式如下:

    string.ljust(width[, fillchar])
    
  • string:表示要进行填充的字符串;
  • width:表示包括 S 本身长度在内,字符串要占的总长度;注意:这里的长度是字符串个数,因为中英文字符所占宽度不一致,所以当字符串包含中文英文时会导致对不齐
  • fillchar:作为可选参数,用来指定填充字符串时所用的字符,默认情况使用空格。
  • 示例:

    # 左对齐
    str = 'python'
    print(str.ljust(10, '*'))  # 输出: 'python****'
    
    # 右对齐
    right_aligned = '全世界'.rjust(10,'*')
    print(right_aligned)  # 输出: '*******全世界'
    
    # 居中对齐
    center_aligned = str.center(10,'*')
    print(center_aligned)  # 输出: '**python**'
    

    执行结果如下:

    D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test.py 
    python****
    *******全世界
    **python**
    

    可以发现:
    以上三个方法只是会填充指定字符,然后返回指定width长度的字符串,并不会真的实现对齐。 因为中文与英文所占的宽度不一样,一个中文占两个英文字符的宽度。

    1.2、使用format() 方法

    format更多用法参考《Python中的format格式化、填充与对齐、数字格式化方式》

    基本格式如下:

    <      #左对齐
    >      #右对齐
    ^      #居中对齐
    
    *<10   #左对齐,返回10个字符长度,不足10位用*填充 
    

    注意: 此处也只是返回指定个数的字符串,并不是真正意义上的对齐。中英文所占宽度不一致,所以不会真的对齐。

    # 居中对齐
    str = 'python'
    print(format(str, '*^10')) # 输出 **python**
    # 相当于:
    print("{0:*^10}".format(str)) # 输出 **python**
    

    其中,* 代表填充内容,^ 代表居中对齐,10代表填充长度。

    str = 'python'
    print("{0:*^10}".format(str))
    print("{0:*^10}".format('全世界'))
    
    # 输出如下
    D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test.py 
    **python**
    ***全世界****
    

    可以发现同样都是返回10个字符,但是长度并不一致。

    num = 128
    print(format(num, '10'))
    print(format(num, '+10'))
    print(format(num, '=+10'))
    print(format(num, '0=+10'))
    
    # 输出如下:
    D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test.py 
           128
          +128
    +      128
    +000000128
    

    还可以填充数字,做格式化展示。其中,+ 代表输出符号,不论正负,= 代表符号居左,0代表填充0。这是数字对齐的操作办法。

    1.2.1、python2与3对齐与填充的区别

    开发的时候发现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     !
    全世界       !
    

    python2与python3中对于中文的字符填充是不一样的。

    在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()函数能够正确地返回字符数‌
  • 1.3、f-string

    f-string是Python 3.6版本以后新增的一种格式化输出方式。
    具体用法参考《f-string的基本用法》

    基本用法如下:

    name = 'ready'
    print(f'|{name:>20}|')  # 右对齐,填充字符串长度至20
    # |               ready|
    print(f'{name:<20}')  # 左对齐,填充字符串长度至20
    # |ready               |
    print(f'{name:^20}')  # 居中对齐,填充字符串长度至20
    # |        ready       |
    

    这个方式与上面一样,也是返回指定长度的字符串。因中英文字符宽度不一致,所以当包含中文时不能真正实现对齐。

    二、高级字符串对齐(中英文对齐)

    上面简单字符串对齐中的几种方法都不能满足中文与英文对齐,因为正常一个中文字符的宽度相当于两个英文字符的宽度,但是也并不是绝对的。

    2.1、wcwidth库

    wcwidth 是一个 Python 库,用于计算 Unicode 字符的显示宽度。在计算字符串的显示宽度时,需要考虑到不同字符的显示宽度可能不同。例如,中文字符通常占据两个字符位置,而英文字符通常只占据一个字符位置。

    wcwidth 库提供了一个名为 wcwidth() 的函数,用于计算单个 Unicode 字符的显示宽度。该函数的参数是一个 Unicode 字符,返回值是该字符的显示宽度。如果该字符无法显示(例如控制字符),则返回值为 -1。

    import wcwidth
    
    # 左对齐
    products = {'苹果': 7.2, '火龙果': 7.23, '香蕉': 4.99, 'apple': 10.2}
    max_width = max(map(wcwidth.wcswidth, products.keys()))  # 使用内置的 `max` 函数找出最大宽度
    print(max_width)
    for k, v in products.items():
        length = max_width - wcwidth.wcswidth(k) +len(k)  #计算出实际应该显示的宽度
        print("{0:<{2}}:{1}".format(k,v,length))
    
    #输出内容:
    D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test.py 
    
    6
    苹果  :7.2
    火龙果:7.23
    香蕉  :4.99
    apple :10.2
    


    如上图:正常来说一个中文字符的宽度相当于两个英文字符的宽度,但是实际运行后发现并没有对齐。我们采用简单粗暴的方法直接加入制表符\t再看下效果。

    修改后代码

    import wcwidth
    
    # 左对齐
    products = {'苹果': 7.2, '火龙果': 7.23, '香蕉': 4.99, 'apple': 10.2}
    max_width = max(map(wcwidth.wcswidth, products.keys()))  # 使用内置的 `max` 函数找出最大宽度
    print(max_width)
    for k, v in products.items():
        length = max_width - wcwidth.wcswidth(k) +len(k)  #计算出实际应该显示的宽度
        print("{0:<{2}}\t:{1}".format(k,v,length))
    


    可以发现修改后已经实现了中英文对齐功能。

    为什么制表符(\t)能实现对齐功能,请参考我的另一篇博文《Python制表符\t的原理、制表符的使用》

    作者:五月天的尾巴

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python字符串对齐的几种方法、Python填充与对齐、Python中英文对齐

    发表回复