python中中英文打印对齐解决方案

news/2024/5/3 5:57:16

在python中,有时候会出现中英文混合输出的情形,但是由于中文默认是全角格式(一个中文字符占用两个字符宽度),这会对python原生的print函数带来一些障碍。尤其是用户用print对齐输出的时候,这种差异会导致文本无法准确对齐。为了解决这种问题,这里提出一种方法。

python的print函数,在进行对齐处理的时候,首先需要判断字符串的长度。这个就是通常的len()函数。python在计算字符串长度的时候,任何字符都只会被算作长度1,无论全角还是半角,所以会有下面的情况:

> len("一二三")    
3
> len("123")
3

但是对于对于全角字符,打印宽度是两个字节,半角字符是单个字节,譬如下例:

image-20240419164046759

这里很明显的看到,同样的长度为3的字符,全角字符是半角字符一倍的打印长度。

这种差距,会影响到print的对齐打印,譬如下例:

image-20240419164446463

这个是一个右对齐的示例,print函数首先计算了打印对象的长度len(),得到了这个打印对象的长度为3(此处忽略全角和半角),所以print会从右对齐的20节点开始排布,意即print把从第18 个字符的位置开始打印,这里用红线表示,所以无论全角还是半角对象,print都会从第18 个字符的位置打印。
按照正常字符(半角),文本会在第20个字符位置完成打印,如上图的蓝线位置,但是由于全角字符的占用了更多的字符,所以这里的全角字符会占用18~23 字符位置,这样会导致打印对齐出现问题:包含全角的字符串会超出限定的界定位置。譬如上述的蓝色位置。超出的数量也很好理解,就是全角字符的个数,意即上述绿线的位置,上述示例包含三个全角字符,就会产出三个字符位置。

以此类推,如果print在同行继续打印其他字符,字符串里边包含全角字符,那么后续的打印就会一直被前述全角字符的打印结果影响,
image-20240419165732123

这种方式也适用于全半角混合输出,示例如下:

image-20240419170059742

对应的,居中对齐模式也会有类似的影响

image-20240419172111688

了解了上述原理,用户可以根据这种特性,自动完成对于全角半角混合模式的打印对齐处理。思路是:在对齐宽度上对全角字符额外的宽度进行考虑,这样可以构建一个中英文混合模式的打印对齐。代码如下:

def get_number(char):count = 0for item in char:# chinese char and chinese punctuation markif 0x4E00 <= ord(item) <= 0x9FA5 or 0xFF00 <= ord(item) <=0xFFEF or 0x3000 <= ord(item) <= 0x303F:count += 1return countdef print_hybrid(char, align, length):if align=='l' or align=='left' :anchor = '<'elif align=='c' or align=='center':anchor = '^'elif align=='r' or align=='right':anchor = '>'else:ut.print_error('Not support align type. Current support is l(left), c(center), r(right)')return -1add_len = get_number(char)if add_len >= length:p_len = 0else:p_len = length - add_lenreturn f'{char:{anchor}{p_len}}'

各种混合模式打印示例:
image-20240419173656030

可见,此种方法建立在print原生的打印机制,辅助计算全角字符的数量的方法,实现的了全半角混合打印的对齐效果。


http://www.mrgr.cn/p/40416621

相关文章

Linux知识

基础 Linux系统的组成 Linux内核、Linux⽂件系统、Linux shell、Linux应⽤程序。 Linux的开机启动过程 u-boot是⼀款常⽤的开源Bootloader&#xff0c;它的启动顺序如下&#xff1a; CPU上电后&#xff0c;⾸先执⾏boot ROM&#xff08;引导ROM&#xff09;代码。boot ROM…

Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术

Java全套智慧校园系统源码springbootelmentui Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术 智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境&#xff0c;这个一体化环境以各种应用服务系统为载体&#xff0c;将教学、科研、管理和校园…

Nacos的一些高级功能

【BV1q3411Z79z】zhouyu:临时实例和持久实例,保护阈值,权重,NacosRule配置权重,Cluster就近访问高级功能 临时实例和持久实例 默认情况下,注册给Nacos的实例都是临时实例 临时实例:会通过客户端与服务器之间的心跳来保活,默认情况下客户端每隔5s发送一次心跳 public st…

【每日刷题】Day7

【每日刷题】Day7 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 2. 203. 移除链表元素 - 力扣&#xff08;…

Jmeter 测试Dubbo接口-实例

1、Dubbo插件准备 ①把jmeter-plugins-dubbo-2.7.4.1-jar-with-dependencies.jar包放在D:\apache-jmeter-5.5\lib\ext目录 ②重新打开Jmeter客户端 在线程组-添加-取样器-dubbo simple&#xff0c;添加dubbo接口请求 2、Jmeter测试lottery接口 ①配置zookeeper参数 由于dub…

重生之我在男航学Java-1

一、前言第一次题目集主要是让我们熟悉对类的使用和对单一职责的理解,由于给出了设计建议,并且内部给出了具体的设计分析,第一次PTA的题量大但是难度并不是很大,虽然老师说了可以使用正则表达式,但我由于自身的懒惰附加c语言面向过程的思想根深蒂固,我在第一次PTA中并未使…

PHP 安装开启redis扩展

方法1,通过pecl 安装 pecl install redis 方法2, 源码编译安装 github地址 https://github.com/phpredis/phpredis/blob/develop/INSTALL.md 也可以参考菜鸟教程 https://www.runoob.com/redis/redis-php.html 安装完成后重启php-fpm 或 apache。查看phpinfo信息,就能看到redi…

datawhale-动手学图深度学习task03

动手学图深度学习 声明:本文是在笔者的Pytorch tutorial及深度学习入门(鱼书)笔记的基础上继续学习记录,故有些内容略过。 第三章:深度学习基础 神经网络及其基本组成的补充欠拟合: 训练误差和验证误差都很严重,而且他们间仅有一点差距,如果模型不能降低训练误差,这可能…

23201115-邓俊豪的第一次blog

目录PTA三次大作业前言关于难度和题目量关于知识点设计与分析第一次大作业题目我的代码分析报告第二次大作业题目我的代码分析报告第三次大作业题目N:1 #Q:1+1= #A:2N:2 #Q:2+2= #A:4T:1 1-5 2-8X:20201103 Tom-20201104 JackS:1 20201103 #A:1-5 #A:2-4D:N-2N:1 #Q:1+1= #A:2T…

bilibili PC客户端架构设计——基于Electron

众所周知&#xff0c;bilibili是个学习的网站&#xff0c;网页端和粉版移动端都非常的好用&#xff0c;不过&#xff0c;相对其它平台来说bilibili的PC客户端也算是大器晚成了。在有些场景PC客户端的优势也是显而易见的&#xff0c;比如&#xff0c;跓留电脑桌面的快捷、独立的…

如何将 ASP.NET Core MVC 项目的视图分离到另一个项目

如何将 ASP.NET Core MVC 项目的视图分离到另一个项目 在当下这个年代 SPA 已是主流,人们早已忘记了 MVC 以及 Razor 的故事。但是在某些场景下 SSR 还是有意想不到效果。比如某些静态页面,比如追求首屏加载速度的时候。最近在项目中回归传统效果还是不错。 有的时候我们希望…

Scala 03 —— Scala Puzzle 拓展

Scala 03 —— Scala Puzzle 拓展 文章目录 Scala 03 —— Scala Puzzle 拓展一、占位符二、模式匹配的变量和常量模式三、继承 成员声明的位置结果初始化顺序分析BMember 类BConstructor 类 四、缺省初始值与重载五、Scala的集合操作和集合类型保持一致性第一部分代码解释第二…

2001-2022上市公司数字化转型数据(含原始数据+计算代码+计算结果)

2001-2022上市公司数字化转型数据&#xff08;含原始数据计算代码计算结果&#xff09; 1、时间&#xff1a;2001-2022年 2、来源&#xff1a;原始数据整理自wind 3、指标&#xff1a;证券代码、证券简称、统计截止日期、是否发生ST或*ST或PT、是否发生暂停上市、行业代码、…

aardio 两行代码 调用 libxl 读写 excel

废话不多说, 直接给连接 https://files.cnblogs.com/files/blogs/762462/libxl.7z?t=1713539927&download=true 运行效果:文件存放路径:再上代码 import dotNet import consolexl = dotNet.load("libxl.net", "libxl.net.dll"); xl.import("libx…

【进阶六】Python实现SDVRPTW常见求解算法——离散粒子群算法(DPSO)

基于python语言&#xff0c;采用经典离散粒子群算法&#xff08;DPSO&#xff09;对 带硬时间窗的需求拆分车辆路径规划问题&#xff08;SDVRPTW&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4. …

python 爬虫

python 爬虫 1.开发工具 pycharm: https://pan.baidu.com/s/1s_bkgDT0QxNTQY07LnQRWQ?pwd=2dlb提取码:2dlb python3 VSCode 2.第一个爬虫的开发from urllib.request import urlopenurl = "http://www.baidu.com"resp = urlopen(url) #print(resp.read().decode(&q…

aardio 两行代码 优雅调用 libxl

废话不多说, 先给资源 https://files.cnblogs.com/files/blogs/762462/libxl.7z?t=1713539927&download=true 运行效果:文件存放路径:再上代码 import dotNet import consolexl = dotNet.load("libxl.net", "libxl.net.dll"); xl.import("libxl&…

c语言题目之求最大公约数

题目内容&#xff1a;求最大公约数 给定两个数&#xff0c;求这两个数的最大公约数 例如&#xff1a; 输入&#xff1a;20 40 输出&#xff1a;20 什么叫最大公约数&#xff1f; 方法分析&#xff1a; 提示&#xff1a;这里我们用辗转相除法&#xff1a; 例如&#xff1a;输…

信号处理相关知识

一&#xff1a; 1.序列——三种典型序列通过matlab绘图即可 2.数字信号的自变量一定是整数&#xff0c;幅度上取值是有限的状态&#xff08;不一定是整数&#xff09;。 3.抽取和插值 4.模拟正弦信号sin(wt):w是角频率&#xff0c;单位rad/s,f是频率w/2Π。 5.假设用采样周…

如何在Windows 10中启用和使用上帝模式,这里有详细步骤

序言 上帝模式&#xff08;God Mode&#xff09;是一个特殊的文件夹&#xff0c;只在一个窗口中显示所有可用的操作设置。它可以节省搜索命令的时间&#xff0c;而无需知道通过“开始”菜单或“控制面板”查找命令的步骤。上帝模式默认情况下是隐藏的&#xff0c;所以我们需要…