Python学习笔记:print对齐之ljust、rjust、center


日常工作中常常需要打印日志,进行查看、调试,有时打印日志很长而长度不一致的话,查阅起来难免没那么直观,遂诞生寻找控制打印长度的函数。例如:ljustrjustcenter等。

一、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***********
'''

始终存在一个问题,虽然打印出来的长度一致,但显示上,总会存在一丢丢视觉误差!

弃之!

参考链接:使用python3输出print对齐的方法

参考链接:Python字符串对齐方法(ljust()、rjust()和center())详解

参考链接:Python中的字符串中的ljust和rjust对于中文的bug

参考链接:python中英文混合字符串对齐

参考链接:中英文混合字符串的对齐

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/279553.html

(0)
上一篇 2022年8月8日
下一篇 2022年8月8日

相关推荐

发表回复

登录后才能评论