Python的print输出对齐


1、 在使用Python的内建函数print作英文输出时,应用格式化输出可以对齐得很好:

参考: https://docs.python.org/3/library/string.html#string-formatting

s1 = 'I am a long sentence.'
s2 = 'I\'m short.'
 
print '%-30s%-20s' %(s1,s2) #'%-30s' 含义是 左对齐,且占用30个字符位 
print '%-30s%-20s' %(s2,s1)

在这里插入图片描述

2、 但当字符串包含中文时,却发现它对齐得不是很好:

# -*- coding:utf-8 -*-
#author: Song Bo, Eagle, ZJU
#email: sbo@zju.edu.cn
s1 = '我是一个长句子,是的很长的句子。'
s2 ='我是短句子'
 
 
print '%-30s%-20s' %(s1,s2)
print '%-30s%-20s' %(s2,s1)

在这里插入图片描述
无法对齐。

原因是这样:在print中,函数为了实现字符串对齐,会在未达到指定长度的字符串末尾添上空格补齐。

但是,问题在这里,它会填入ASCII码为20的space,也就是半角空格。它的长度等于每个字母或数字的宽度,但远比汉字的宽度小,所以导致补足后的字符串长度仍然不同。

解决方案:
重写一个格式对齐函数,函数中判断字符串是否是中文字符串,有的话则添加全角空格补齐,否则添加半角空格补齐。

方法一:

# -*- coding:utf-8 -*-
#author: Song Bo, Eagle, ZJU
#email: sbo@zju.edu.cn
 
def myAlign(string, length=0):
	if length == 0:
		return string
	slen = len(string)
	re = string
	if isinstance(string, str):
		placeholder = ' '
	else:
		placeholder = u' '
	while slen < length:
		re += placeholder
		slen += 1
	return re
s1 = u'我是一个长句子,是的很长的句子。'
s2 =u'我是短句子'
 
 
print myAlign(s1, 20) + myAlign(s2, 10)
print myAlign(s2, 20) + myAlign(s1, 10)

在这里插入图片描述
在这里插入图片描述
引用: https://blog.csdn.net/sbdxxcjh/article/details/38051573

方法二、 宽度不够时采用中文空格填充

采用.format打印输出时,可以定义输出字符串的输出宽度,在 ‘:’ 后传入一个整数, 可以保证该域至少有这么多的宽度。 用于美化表格时很有用。。但是在打印多组中文的时候,不是每组中文的字符串宽度都一样,当中文字符宽度不够的时候,程序采用西文空格填充,中西文空格宽度不一样,就会导致输出文本不整齐
中文空格的编码为chr(12288)

tplt = "{0:{3}^10}\t{1:{3}^10}\t{2:^10}"
    print(tplt.format("学校名称", "位置", "分数", chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0], u[1], u[2], chr(12288)))
>>> List = [['A', 'B'], ['A134563421', 'B'], ['A', 'B']]
>>> for row in List:
   ... print '{0:30}{1}'.format(row[0], row[1])
   ... file.write('{0:30}{1}\n'.format(row[0], row[1]))

A                             B
A134563421                    B
A                             B

3、Python print 对齐打印,左对齐,右对齐

当需要打印如上左对齐的形式是,我们可以通过s.ljust() 之类的函数来处理。
(1)S.ljust(width,[fillchar])

其中,width 表示对齐的字符数,fillchar 表示空格部分可以用过给定的单个字符来填充,默认是空格。ljust中第一个字母‘l’代表左对齐,不足部分用fillchar填充,默认的为空格。类似地,S.rjust(width,[fillchar]) #右对齐,S.center(width, [fillchar]) # 中间对齐

在这里插入图片描述
在这里插入图片描述
右对齐
在这里插入图片描述

<think>好的,用户的问题是如何在Python中实现print函数的居中对齐,并且需要示例。首先,我需要回忆一下Pythonprint函数是否有内置的参数可以直接实现文本的居中对齐。比如,像其他语言或者库那样有特定的对齐选项。 不过,我记得Python的标准print函数本身并没有直接支持居中对齐的参数。通常,处理字符串的对齐可能需要使用字符串的格式化方法。比如,使用str.center()方法,或者使用格式化字符串(如f-strings或format()方法)来指定宽度和对齐方式。 例如,str.center(width)可以将字符串在给定宽度内居中。比如,s = "hello"; print(s.center(20)) 会在20个字符的宽度内居中显示"hello"。这可能是一个解决方案。 另外,用户可能希望输出的文本在终端中居中显示,这需要考虑终端的宽度。这时候可以使用os模块获取终端的列数,然后根据这个宽度来调整字符串的居中。比如,使用os.get_terminal_size().columns来获取终端的宽度,然后用这个数值作为center()的参数。 不过,需要注意的是,不同的终端可能会有不同的行为,尤其是在窗口大小改变时。此外,如果字符串的长度超过终端的宽度,center()方法会自动扩展字符串,可能会导致换行,但实际效果可能因环境而异。 用户可能还希望看到具体的例子,所以需要给出几个示例代码。比如,固定宽度的居中对齐,以及根据终端宽度动态调整的示例。同时,可能需要提醒用户在某些环境下(如IDE的内置终端)获取终端宽度可能不准确,这时候固定宽度可能更可靠。 此外,用户的问题中提到了参考引用,但提供的引用内容似乎与Excel、Qt和pptx/docx相关,可能这些引用是之前的问题中的,但当前问题不涉及这些库,因此可能不需要引用这些内容。不过需要检查是否有其他相关的引用需要提及。例如,如果用户希望使用第三方库实现更复杂的对齐,可能需要引用其他资源,但根据问题描述,用户可能只需要使用内置功能。 总结可能的步骤: 1. 使用str.center()方法实现固定宽度的居中对齐。 2. 结合os模块获取终端宽度,实现动态居中。 3. 提供示例代码,说明这两种方法。 4. 提醒用户环境差异可能导致的问题。</think>在Python中实现`print`函数的居中对齐,可以通过字符串的`.center()`方法或格式化字符串指定宽度和对齐方式。以下是具体实现方法及示例: --- ### 方法1:使用字符串的`.center()`方法 通过字符串的内置方法`.center(width)`,将文本在指定宽度范围内居中显示。 ```python text = "Hello, World!" width = 30 # 总宽度 centered_text = text.center(width) print(centered_text) ``` 输出结果(示例): ``` Hello, World! ``` --- ### 方法2:动态获取终端宽度实现居中 结合`os`模块获取终端的列数,动态调整文本居中: ```python import os text = "Hello, World!" terminal_width = os.get_terminal_size().columns centered_text = text.center(terminal_width) print(centered_text) ``` 输出结果会根据当前终端宽度自动居中。 --- ### 方法3:使用格式化字符串(f-strings或`format()`) 通过指定对齐符号`^`和宽度值: ```python # 使用f-string text = "Hello, World!" width = 30 print(f"{text:^{width}}") # 使用format() print("{:^30}".format(text)) ``` --- ### 注意事项 1. **终端兼容性**:动态获取终端宽度时,某些IDE(如PyCharm)可能无法正确返回数值,此时建议使用固定宽度。 2. **超长文本**:若文本长度超过指定宽度,`.center()`会直接输出原字符串,不会截断。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值