Python中关于format输出中文字符不对齐问题
alist = [[1, '清华大学', '北京市'], [7, '中国科学科技大学', '安徽省']]
templet = '{0:<10}\t{1:<10}\t{2:<10}'
ults = alist
print(templet.format('排名', '学校名称', '省市'))
for ult in ults:
print(templet.format(ult[0], ult[1], ult[2], chr(12288)))
代码如上,这是我目前找到的最简便的输出中文的代码,但我发现一个神奇的现象:一旦中文的字数超过七个,就会出现无论你规定的长度是多少,输出的格式总是不会对齐。 希望能得到大佬的解答。 还有 Python 的版本是 3.5 的,还用 anoconda 里的 Python3.6 试了下,结果不变。 附上输出结果:
排名 学校名称 省市
1 清华大学 北京市
7 中国科学科技大学 安徽省
Python中关于format输出中文字符不对齐问题
\t 是这样的。。。。
一定要对齐,我能想到的方法是自己补空格。。。
这个问题我遇到过,中文对齐确实挺烦人的。format对齐是基于字符数,但中文字符宽度是英文字符的两倍,在等宽字体下显示就会错位。
最简单的解决方案是用全角空格\u3000替代普通空格,或者用str.ljust()/str.rjust()时指定全角空格作为填充字符:
# 普通对齐 - 会错位
data = [("张三", 25), ("李四四", 30), ("王五", 28)]
for name, age in data:
print(f"{name:10} {age:3}岁")
# 使用全角空格对齐
for name, age in data:
# 计算需要填充的全角空格数
width = 10 - len(name.encode('gbk')) + len(name)
print(f"{name}{'\u3000' * width} {age:3}岁")
更专业的做法是用wcwidth库,它能准确计算字符的显示宽度:
from wcwidth import wcswidth
def pad_cjk(text, width, fillchar=' '):
"""支持CJK字符的对齐函数"""
current_width = wcswidth(text)
if current_width >= width:
return text
return text + fillchar * (width - current_width)
data = [("张三", 25), ("李四四", 30), ("王五", 28)]
for name, age in data:
print(f"{pad_cjk(name, 10)} {age:3}岁")
如果不想装第三方库,可以用这个简单函数:
def cjk_len(text):
"""粗略计算CJK文本显示长度"""
length = 0
for char in text:
# 基本CJK字符范围
if 0x4E00 <= ord(char) <= 0x9FFF or \
0x3400 <= ord(char) <= 0x4DBF or \
0x20000 <= ord(char) <= 0x2A6DF:
length += 2
else:
length += 1
return length
def cjk_ljust(text, width, fillchar=' '):
return text + fillchar * (width - cjk_len(text))
用wcwidth最准,自己写函数简单但可能有边缘情况。
额,明明 template 你设定了 3 个元素,为什么要 format4 个呢?
采用中文字符的空格代替英文空格填充 ,chr ( 12288 )表示中文空格
有个 Unicode 字符对齐的库,忘了叫啥了,挺好用的
那你也应该用 4 个,还有要把 templete 中间的\t 的数值设置的大一些,至少 12
#2 定个宽度,比如 16,输出字串后,算字串长度,再补上 16 减去后的空格
py<br>alist = [[1, '清华大学', '北京市'], [222, '中国科学', '安徽省'], [11, '中国科技大学', '安徽省'], [<br> 33, '科学科技大学', '安徽'], [7, '中国科学科技', '安省'], [1234, '大学', 'xx']]<br><br>templet = '{0:<5}\t{1:<10}\t{2:<10}'<br>ults = sorted(alist, key=lambda a: a[0])<br><br>print(templet.format('排名', '学校名称'.ljust(10, ' '), '省市'.ljust(10, ' ')))<br>for ult in ults:<br> print(templet.format(ult[0], ult[1].ljust(<br> 10, ' '), ult[2].ljust(10, ' ')))<br>
python<br>alist = [[1, '清华大学', '北京市'], [222, '中国科学', '安徽省'], [11, '中国科技大学', '安徽省'], [<br> 33, '科学科技大学', '安徽'], [7, '中国科学科技', '安省'], [1234, '大学', 'xx']]<br>templet = '{0:<5}\t{1:<10}\t{2:<10}'<br>ults = sorted(alist, key=lambda a: a[0])<br>print(templet.format('排名', '学校名称'.ljust(10, ' '), '省市'.ljust(10, ' ')))<br>for ult in ults:<br> print(templet.format(ult[0], ult[1].ljust(<br> 10, ' '), ult[2].ljust(10, ' ')))<br>

