python3中如何中文對齊輸出?
大家好,我是一個自學python的小白,在學習的時候遇到了一個問題,想請教一下大神們。
環境:python 3.6.3編輯器:pycharm,idle在進行print列印輸出時,遇到 無法對齊輸出的問題。
上圖是 根據老師講解視頻 寫的一個爬蟲 的提取部分,想要公司名左對齊輸出,編號又對齊輸出,像在表格中那樣,百度了很多方法,像說的用%格式化輸出,用尖括弧&< ∧ &>,都無法實現。現在,請教一下各位大神,這應該怎麼辦?非常感謝。
print("{:u3000&<20} {:&>12}".format(a[i], b[i]))
默認是半形的空格,換成全形的空格u3000
就對其了.
英文和數字通常是半形字元在輸出和顯示時只佔用1個字元位置,而中文是全形字元,一個字元佔用2個字元位。
你可以列印12345和一二三四五,會發現在屏幕上後者佔用更多像素,或者說這兩個長度為5的字元串在屏幕上顯示時不是一個寬度。
格式化輸出原理是在字元串長度小於限定長度時,在末尾添加空格,但這個空格卻只佔用一個字元位置,所以在遇到字元串內有中文時,並不能對齊。
有兩種方式對齊:
第一種是把所有半形字元轉為全形字元輸出:
string1 = 廣州一二三有限公司1
string2 = **一二三四五六七
string3 = 香港三四有限公司22
string4 = **六七八九十十一
string5 = 12312daasdasa
string6 = *123123
string7 = 312312dasdasda
string8 = 1231231dadas
def aligns(string,length=20):
difference = length - len(string) # 計算限定長度為20時需要補齊多少個空格
if difference == 0: # 若差值為0則不需要補
return string
elif difference &< 0:
print(錯誤:限定的對齊長度小於字元串長度!)
return None
new_string =
space =
for i in string:
codes = ord(i) # 將字元轉為ASCII或UNICODE編碼
if codes &<= 126: # 若是半形字元
new_string = new_string + chr(codes+65248) # 則轉為全形
else:
new_string = new_string + i # 若是全形,則不轉換
return new_string + space*(difference) # 返回補齊空格後的字元串
print(aligns(string1)+aligns(string2))
print(aligns(string3)+aligns(string4))
print(aligns(string5)+aligns(string6))
print(aligns(string7)+aligns(string8))
結果:
廣州一二三有限公司1 **一二三四五六七
香港三四有限公司22 **六七八九十十一
12312daasdasa *123123
312312dasdasda 1231231dadas
還有一種方式是寫一個函數來處理含有中文的數據對齊:
import re
string1 = 廣州一二三有限公司1
string2 = **一二三四五六七
string3 = 香港三四有限公司2
string4 = **六七八九十十一
string5 = 12312daasdasa
string6 = *123123
string7 = 312312dasdasda
string8 = 1231231dadas
def align(string,length=20):
difference = length - len(string) # 計算限定長度為20時需要補齊多少個空格
if difference == 0: # 若差值為0則不需要補
return string
elif difference &< 0:
print(錯誤:限定的對齊長度小於字元串長度!)
return None
chinese_pattern = u[?([u4E00-u9FA5]
if re.search(chinese_pattern,string) != None: # 如果字元串中含有中文
space = # 則對齊空格使用佔用2個字元位的全形空格
else:
space = # 否則使用佔用1個字元位的半形空格
return string + space*(difference) # 返回補齊空格後的字元串
print(align(string1)+align(string2))
print(align(string3)+align(string4))
print(align(string5)+align(string6))
print(align(string7)+align(string8))
結果:
廣州一二三有限公司1 **一二三四五六七
香港三四有限公司2 **六七八九十十一
12312daasdasa *123123
312312dasdasda 1231231dadas
不過第二種方法只適用於組成格式類似的字元串。
我有一個很呆的辦法:
max = 150
s1 = Univ Malaga, Dept Comp Languages Comp Sci, E-29071 Malaga, Spain.
d1 = 12356
s2 = Univ York, Dept Comp Sci, York YO1 5DD, N Yorkshire, England.
d2 = 25
s3 = Univ Cordoba, Cordoba, Spain.
d3 = 254
l1 = [s1,s2,s3]
l2 = [d1,d2,d3]
for i in range(len(l1)):
len1 = len(l1[i])
len2 = len(l2[i])
len_mid = max-len1-len2
print(l1[i]+ *len_mid+l2[i])
思路:確定一個長度,然後獲得一個中間長度,用任意符號連接來填充那段空白(也可以直接是空白),把名字和空格填充之後,剩下的自然是右對齊了。
輸出效果:
空格可以換成你想要的任意字元。
我覺得你這個想法比我的解法更呆,哈哈哈哈tx
沒有人 會嗎
推薦閱讀:
※Python:圖片轉字元畫
※Python3 pandas庫(15) 分列 (上)str.split()
※內置模塊與第三方庫的使用
※國慶回家避免不了相親,使用python抓取婚戀網妹子決策點快速脫單
※用例4: CVE-2014-3704