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的原理、制表符的使用》