ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-08-08 13:34:41  阅读:371  来源: 互联网

标签:rjust 20 center Python len text1 pad print ljust


日常工作中常常需要打印日志,进行查看、调试,有时打印日志很长而长度不一致的话,查阅起来难免没那么直观,遂诞生寻找控制打印长度的函数。例如: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中英文混合字符串对齐

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

标签:rjust,20,center,Python,len,text1,pad,print,ljust
来源: https://www.cnblogs.com/hider/p/16561467.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有