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: [email protected]
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: [email protected] 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)
輸出:
中英混排:
相關推薦
Python的print輸出中文對齊問題
問題描述: 在使用Python的內建函式print作英文輸出時,應用格式化輸出可以對齊得很好: s1 = 'I am a long sentence.' s2 = 'I\'m short.' print '%-30s%-20s' %(s1,s2) #'%-30s' 含義是
python格式化輸出format()方法中文對齊問題解決方法
關於format()方法的基本使用這裡就不介紹了。 問題: 當我們使用format()輸出一列中文的時候,明明設定了固定寬度和空格填充,輸出完成的時候還是會出現無法對齊的情況。 原因: 因為我們輸出的是中文字元,當我們輸出的中文寬度不夠約定的寬度時,系統會自動進行填充。 而問題恰
C語言 printf 格式化 輸出 右對齊補零
關於printf的一點總結,內容來自http://blog.sina.com.cn/s/blog_5ac88b350100auna.html 1.1 標準輸入輸出函式 1.1.1 格式化輸入輸出函式 Turbo C2.0 標準庫提供了兩個控制檯格式化輸入、 輸出函式printf( ) 和 s
03:對齊輸出
int urn tdi ret out name cst code style #include<iostream> #include<cstdio> #include<iomanip> using namespace std;
對齊輸出
分開 空格 輸入 return ont 輸出 描述 main 依次 總時間限制:1000ms內存限制:65536kB 描述 讀入三個整數,按每個整數占8個字符的寬度,右對齊輸出它們。 輸入只有一行,包含三個整數,整數之間以一個空格分開。輸出只有一行,按照格式要求依次輸出三個
textarea標簽輸出內容時不能頂格(左對齊)輸出
line ima getc pbo 不能 mono lac msu images 我用textarea輸出文本內容的時候出現下面的問題:文本內容在action裏測試沒有問題(文本內容前面沒有空格),但是在jsp頁面textare標簽中輸出文本內容時,文本內容前面卻出現一些多
有關輸出對齊
兩位小數 nbsp AR print [] strong ron turn GC 有關輸出對齊 int main(int argc, char* argv[]){ char insertTime[20] = {"1234567890"}; double insertTime
習題 13.2 從鍵盤輸入一批數值,要求保留3位小數,在輸出時上下行小數點對齊。
C++程式設計(第三版) 譚浩強 習題13.2 個人設計 習題 13.2 從鍵盤輸入一批數值,要求保留3位小數,在輸出時上下行小數點對齊。 程式碼塊: #include <iostream> #include <iomanip> using names
單行中文如何實現兩端對齊
text-align: justify可以實現英文的兩端對齊,但是它有兩個缺陷: 只對多行文字有效,並且多行文字的最後一行無效 IE瀏覽器下只對英文有效 對於問題1,可以用 text-align-last: justify 解決,我自己測試在I
Java輸出資料的對齊方法
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
記事本:如何將16進位制數賦給int型變數,再按16進位制輸出,以及電腦大小端對齊方式測試。
c和c++版本: int i=0x12345678; printf("%hx",i); java版本:
輸出九九乘法表,乘法的乘積佔兩位,並靠左對齊,每個乘法表達式之間有一個空格!
public class Main { public static void main(String[] args) { &n
C/C++整數除法以及保留小數位的問題 | 設定輸出寬度 | 設定左對齊
原文連結,非常感謝原作 #include <iostream> #include <iomanip> using namespace std; int main() { int a,b; cin>>a>>b; int C =
1003:對齊輸出
【題目描述】 讀入三個整數,按每個整數佔8個字元的寬度,右對齊輸出它們,按照格式要求依次輸出三個整數,之間以一個空格分開。 【輸入】 只有一行,包含三個整數,整數之間以一個空格分開。 【輸出】 只有一行,按照格式要求依次輸出三個整數,之間以一個空格分開。 【輸入
關於IE下英文字型跟中文字型不能對齊的根源以及解決辦法
問題描述: 在IE下當一行文字同時有英文跟中文的時候,連結下劃線就會發生折行,也就表示這個時候中英文是沒有對齊的!(FIREFOX不受此問題影響) 但是經過測試,預設的直接在頁面裡設定連結的時候是不會出現這個情況的! <!DOCTYPE html PUBLIC
用pandas展示資料輸出時列名不能對齊
用pandas展示資料輸出時列名不能對齊 列名用了中文的緣故,設定pandas的引數即可,程式碼如下: import pandas as pd #這兩個引數的預設設定都是False pd.set_option('display.unicode.ambiguous_a
C++ 格式化地輸出乘法口訣表,要求每列左對齊
原始碼如下:#include <iostream> using namespace std; int main() { int i = 0, j = 0; for (i = 1; i < 10; i++) { for (j = 1; j &l
關於printf輸出之左對齊與右對齊
1.左對齊 printf(“%d\n”,101010); 預設為左對齊。 printf(“%-10d\n”,101010); “-”表示左對齊,在數字寬度前面加上“-”號即可。 說明:數字寬度為10,如果要列印的位數小於10,則在後面補足空格;如果要
【C語言 & C++】對齊輸出九九乘法口訣
//對齊輸出九九乘法口訣 #include <iostream> #include <iomanip.h> //using namespace std; int main()
字串輸出對齊問題
問題描述: 線上的筆試題,記得不是很清楚了,大概的如下: 1、第一行輸入一個整數,代表字串對齊輸出的每行的大小(假設字型等大小),第二行輸入一個行字串,每個單詞之間用一個空格分割。 2、分行輸出後每行的末尾不能是空格,除了最後一行外必須