当前位置: 首页 > article >正文

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


http://www.kler.cn/a/420563.html

相关文章:

  • L1-049 天梯赛座位分配
  • 机器学习概述,特征工程简述2.1——2.3
  • 洛谷二刷P4715 【深基16.例1】淘汰赛(c嘎嘎)
  • yarn install遇到问题处理
  • 洛谷P2084
  • nfs服务器搭建
  • 软件测试常问面试问题及项目流程相关概念
  • 深入实践:从零开始掌握GPT的应用开发
  • 错误信息 Uncaught (in promise) TypeError: extender is not a function
  • spark中将json数据转成dataset
  • Ubuntu 20.04 程序运行导致“段错误 (核心已转储)”的原因分析及解决方案 ubuntu
  • droppath
  • Qt的定时器应用案例 || Qt的图片添加显示
  • 2017 NHOI小学(C++)
  • MySQL 单表练习
  • C#中的集合初始化器
  • TongRDS分布式内存数据缓存中间件
  • 《数据结构》学习系列——图(下)
  • flink学习(14)—— 双流join
  • Redis开发05:使用stackexchange.redis库对redis进行增删改查
  • 前端【9种前端常见的设计模式】
  • 详解Qt Pdf之QPdfBookmarkModel 读取pdf标签页并显示
  • 创建 EC2块存储磁盘并将其连接到 Linux 实例
  • Vue3.5新版本特性一览-数组操作10倍性能提升+响应式属性解构+自定义组件优化+ssr水合改善+teleport支持defer!
  • Maven、JAVAWeb、Servlet
  • CS144 (二)