問題敘述性說明:
在使用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)
輸出:

中英混排:

