日常工作中常常需要打印日志,进行查看、调试,有时打印日志很长而长度不一致的话,查阅起来难免没那么直观,遂诞生寻找控制打印长度的函数。例如: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, '*')) # *******我是最帅的!******* # 指定字符填充
text2 = '我是最帅的!' print(text2) print(format(text2, '<20')) # 我是最帅的! -- 靠左 print(format(text2, '>20')) # 我是最帅的!-- 靠右 print(format(text2, '^20')) # 我是最帅的! -- 居中
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*********** '''
始终存在一个问题,虽然打印出来的长度一致,但显示上,总会存在一丢丢视觉误差!
弃之!
参考链接:使用python3输出print对齐的方法
参考链接:Python字符串对齐方法(ljust()、rjust()和center())详解
参考链接:Python中的字符串中的ljust和rjust对于中文的bug
参考链接:python中英文混合字符串对齐
参考链接:中英文混合字符串的对齐