1. 程式人生 > >Python的print輸出中文對齊問題

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、分行輸出後每行的末尾不能是空格,除了最後一行外必須