Python的print中國輸出對齊問題


問題敘述性說明:

在使用Python內置函數print當輸出英語,應用格輸出類型可以對齊很好:

s1 = 'I am a long sentence.'
s2 = 'I\'m short.'

print '%-30s%-20s' %(s1,s2) #'%-30s' 含義是 左對齊,且占用30個字符位 
print '%-30s%-20s' %(s2,s1)

輸出:


注:

這里應用了最原始的cmd控制台,一些IDE自帶的控制台(如Sublime text)可能會有不同的輸出效果。


但當字符串包括中文時。卻發現它對齊得不是非常好:

# -*- 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)


首先是出現亂碼:



cmd控制台並未正確解碼utf-8編碼。把s1和s2解碼成unicode就可以:

s1 = u'我是一個長句子,是的非常長的句子。

' s2 =u'我是短句子' 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)

輸出:



中英混排:





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM