2014-04-12 6 views
7
from prettytable import PrettyTable 

header="乘客姓名,性别,出生日期".split(",") 
x = PrettyTable(header) 
x.align["乘客姓名"]="l" 
table='''HuangTianhui,男,1948/05/28 
姜翠云,女,1952/03/27 
李红晶,女,1994/12/09 
LuiChing,女,1969/08/02 
宋飞飞,男,1982/03/01 
唐旭东,男,1983/08/03 
YangJiabao,女,1988/08/25 
买买提江·阿布拉,男,1979/07/10 
安文兰,女,1949/10/20 
胡偲婠(婴儿),女,2011/02/25 
(有待确定姓名),男,1985/07/20 
''' 
data=[row for row in table.split("\n") if row] 
for row in data: 
    x.add_row(row.strip().split(",")) 

print(x) 

enter image description hereWie Pretty beheben

Was richtig chinesischen Zeichen angezeigt werden soll ich das Ausgabeformat als die folgende ist.

enter image description here

In diesem Beispiel prettytable.py nicht richtig chinesen mehrdeutige Breite von Zeichen · in 买买提江·阿布拉 angezeigt werden kann, hat der Charakter mehrdeutige Breite. Wie behebe ich den Fehler in prettytable.py?

Ich habe zwei Zeilen in def _char_block_width (char) von prettytable.py hinzufügen, aber das Problem bleibt immer noch.

if char == 0xb7: 
    return 2 

ich es gelöst haben, sollte die Datei prettytable.py in meinem Computer d installiert werden: \ python33 \ Lib \ site-packages directly not in as the form of d:\python33\Lib\site-packages\prettytable\prettytable.py

Es gibt viele chinesische Zeichen mit mehrdeutigen Breite, es ist dumm für uns, zwei Zeilen wie die folgenden hinzuzufügen, um den Fehler zu beheben, wenn es 50 mehrdeutige Zeichen gibt, werden 100 Zeilen in der prettytable.py hinzugefügt, gibt es eine einfache Möglichkeit, das zu tun? Einfach ein paar Zeilen korrigieren, um alle zweideutigen Zeichen zu behandeln?

+1

kann dies helfen http://stackoverflow.com/questions/4622357/how-to-control-padding-of-unicode-string-containing-east-asia-characters – icedtrees

+0

Ich habe den Beitrag gelesen, eine Reihe von voll Breite Versionen der druckbaren ASCII-Zeichen, die verwendet werden, ist keine gute Idee, ich fand, dass es kein solches Problem in R gibt, um alle Arten von Zeichen anzuzeigen, muss Python von R erlernen, um feine Anzeige zu schaffen. Jetzt will ich wissen, wie R tun? –

Antwort

4

Das Problem, mit dem Sie es zu tun haben, hat mit dem Punktzeichen in der falsch gefüllten Zeile Ihrer Python-Ausgabe zu tun. Der Punkt ist der Unicode-Codepunkt U+00B7 · middle dot. Es wird davon ausgegangen, dass dieses Zeichen eine "mehrdeutige" Breite hat, da es in den meisten nicht-ostasiatischen Schriftarten ein schmales Zeichen ist, in den meisten asiatischen jedoch eine volle Breite hat. Ohne Kontext kann ein Programm nicht sagen, wie breit es auf dem Bildschirm erscheint. Unglücklicherweise scheint Pythons Unicode-System keine Möglichkeit zu bieten, diesen Kontext bereitzustellen.

Eine Lösung könnte darin bestehen, den fehlerhaften Punkt durch einen Punkt zu ersetzen, der eine eindeutige Breite hat, z. B. U+30FB katakana middle dot (immer volle Breite). Auf diese Weise kann die Fülllogik erkennen, dass zusätzlicher Platz für diese Zeile benötigt wird. Eine andere Lösung könnte sein, Ihre Konsole so einzustellen, dass sie eine Schriftart mit mehr westlicher Behandlung des mittleren Punktzeichens verwendet als die aktuelle, die dem ostasiatischen Renderstil als volle Breite folgt. Dies bedeutet, dass das vorhandene Padding korrekt ist. Ihre Ausgabe von R verwendet eindeutig eine andere Schriftart, die die Python-Ausgabe verwendet, und ihre Schriftart rendert den Punkt als halbe Breite.

+0

Wer kann mir helfen, den Fehler im Quellcode zu korrigieren? Ich habe versucht, den Quellcode zu verstehen, es ist schwierig für mich zu meistern. –

+0

Der relevante Teil des Codes ist [hier] (https://code.google.com/p/prettytable/source/browse/trunk/prettytable.py#1473). Die Frage ist, wie mit der Mehrdeutigkeit umzugehen ist. Wenn Sie nur einen groben Fix für Ihren eigenen Gebrauch benötigen, können Sie einfach "0xB7" als zusätzlichen Fall hinzufügen, der als Breite 2 behandelt wird, aber das wird wahrscheinlich nicht etwas sein, das die Upstream-Leute kümmern werden. Eine bessere Lösung wäre, einen zusätzlichen Parameter an die Funktion "width" zu übergeben, um zu erfahren, ob Sie sich in einem ostasiatischen Kontext befinden oder nicht, aber das würde etwas mehr Arbeit erfordern, um eingerichtet zu werden. – Blckknght

+0

Ich habe zwei Zeilen in def_char_block_width (char) hinzufügen: aber das Problem bleibt immer noch.Wenn char == 0xb7: return 2 –