日常工作中常常需要打印日志,进行查看、调试,有时打印日志很长而长度不一致的话,查阅起来难免没那么直观,遂诞生寻找控制打印长度的函数。例如:ljust
、rjust
、center
等。
一、ljust、rjust、center方法
这3个方法都可以设定对齐长度,填充特定字符。
- 语法
String.ljust(width[, fillchar])
String.rjust(width[, fillchar])
String.center(width[, fillchar])
- 参数
String: 待填充字符串
width: 总长度
fillchar: 可选参数 默认空格
- 实例
text1 = '我是最帅的!'
print(text1) # 我是最帅的!
print(text1.ljust(20)) # 我是最帅的! -- 靠左 填充空格
print(text1.rjust(20)) # 我是最帅的!-- 靠右 填充空格
print(text1.center(20)) # 我是最帅的! -- 居中 左右填充空格
print(text1.ljust(20, '*')) # 我是最帅的!**************
print(text1.rjust(20, '*')) # **************我是最帅的!
print(text1.center(20, '*')) # *******我是最帅的!*******
# 指定字符填充
二、使用format方法
text2 = '我是最帅的!'
print(text2)
print(format(text2, '<20')) # 我是最帅的! -- 靠左
print(format(text2, '>20')) # 我是最帅的!-- 靠右
print(format(text2, '^20')) # 我是最帅的! -- 居中
三、中英文混合字符串长度bug
text1 = '我是好人!'
text2 = 'Good!'
print(len(text1)) # 5
print(len(text2)) # 5
print(text1.ljust(20, '*'))
print(text2.ljust(20, '*'))
'''
我是好人!***************
Good!***************
'''
# 长度一致 但实际显示不一致
因为 ljust
将每一个中文字符看成一个字符,但实际一个中文字符输出所占的空间相当于2个英文字符,导致显示的长度不一致。
简单的解决办法,在输出的英文表达式将宽度增加 len(string)
即可。
print(text1.ljust(20, '*'))
print(text2.ljust(20+len(text1), '*'))
'''
我是好人!***************
Good!********************
'''
# 也是不太对,感叹号导致,待持续优化?
四、中英文混合字符串(持续优化)
计算待填充字符中,英文和中文的字符个数,分别进行填充。
英文字符可以使用英文空格,中文空格为 chr(12288)
。
# 是否为中文
def is_Chinese(string):
if '/u4e00' <= string <= '/u9fff':
return True
return False
# is_Chinese('我') # True
def print_align(string, max_len, _type='L', pad=' '):
'''
中英文混合字符串对齐函数
string: 需要对齐的字符串
max_len: 对齐长度
_type: 对齐方式 L左、R右、其他居中
pad: 填充字符
'''
str_len = len(string) # 原始长度
for i in str(string):
if is_Chinese(i): # 判断是否中文 中文长度 +1
str_len += 1 #
pad_len = max_len - str_len # 计算需要填充的长度
if _type == 'L':
_left = 0
_right = pad_len
elif _type == 'R':
_left = pad_len
_right = 0
else:
_left = pad_len // 2
_right = pad_len - _left
return pad * _left + string + pad * _right
print(print_align("a一二三",20, pad='*'))
print(print_align("aa一二三", 20, pad='*'))
print(print_align("aaaaaa一二三", 20, pad='*'))
print(print_align("a一二三aa", 20, pad='*'))
'''
a一二三*************
aa一二三************
aaaaaa一二三********
a一二三aa***********
'''
始终存在一个问题,虽然打印出来的长度一致,但显示上,总会存在一丢丢视觉误差!
弃之!
参考链接:Python字符串对齐方法(ljust()、rjust()和center())详解
参考链接:Python中的字符串中的ljust和rjust对于中文的bug
参考链接:python中英文混合字符串对齐
参考链接:中英文混合字符串的对齐
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/279553.html