2011-12-02 19 views
24

पायथन 2.7 का उपयोग करके, मैं टैब्यूलर डेटा स्क्रीन पर प्रिंट करने की कोशिश कर रहा हूं।पायथन प्रारूप टैब्यूलर आउटपुट

यह मोटे तौर पर क्या मेरी कोड लग रहा है की तरह है:

for i in mylist: 
    print "{}\t|{}\t|".format (i, f(i)) 

समस्या यह है कि, i या f(i) डेटा की लंबाई के आधार गठबंधन नहीं किया जाएगा।

यह है कि मैं क्या हो रही है है:

|foo |bar | 
|foobo |foobar | 

क्या मैं प्राप्त करना चाहते हैं:

|foo  |bar  | 
|foobo |foobar | 

कोई मॉड्यूल है कि यह कर परमिट हैं?

उत्तर

24

यह वास्तव में कठिन अपने स्वयं के स्वरूपण समारोह रोल करने के लिए नहीं है:

def print_table(table): 
    col_width = [max(len(x) for x in col) for col in zip(*table)] 
    for line in table: 
     print "| " + " | ".join("{:{}}".format(x, col_width[i]) 
           for i, x in enumerate(line)) + " |" 

table = [(str(x), str(f(x))) for x in mylist] 
print_table(table) 
+3

दूसरों के संदर्भ के लिए, मैं प्रारूप स्ट्रिंग को बदलना पड़ा "{0: {1}}" यह ठीक से काम करने के लिए मिलता है। – Darkhydro

+0

Pylint के बारे में * :(। इसमें कहा गया है "प्रयुक्त * या ** जादू",। –

+5

ध्यान दें कि यह कोड सही ढंग से प्रदर्शन नहीं कर सकते हैं यदि तालिका में iterables किसी भी गैर-स्ट्रिंग वस्तुओं होते हैं, के बाद से लेन या तो परिभाषित नहीं किया जाएगा शिकायत या गलत हो सकता है। कि ठीक करने के लिए, परिवर्तन 'अधिकतम (लेन (एक्स)' 'अधिकतम करने के लिए (लेन (एसटीआर (x))'। –

7
mylist = {"foo":"bar", "foobo":"foobar"} 

width_col1 = max([len(x) for x in mylist.keys()]) 
width_col2 = max([len(x) for x in mylist.values()]) 

def f(ind): 
    return mylist[ind] 

for i in mylist: 
    print "|{0:<{col1}}|{1:<{col2}}|".format(i,f(i),col1=width_col1, 
              col2=width_col2) 
+2

यह काम करता है। लेकिन मुझे आश्चर्य है कि यह मूल रूप से करने के लिए कोई मॉड्यूल नहीं है! – rahmu

16

अधिक सुंदर तालिका के लिए सारणीबद्ध मॉड्यूल का उपयोग:

>>> from tabulate import tabulate 

>>> table = [["Sun",696000,1989100000],["Earth",6371,5973.6], 
...   ["Moon",1737,73.5],["Mars",3390,641.85]] 
>>> print tabulate(table) 
----- ------ ------------- 
Sun 696000  1.9891e+09 
Earth 6371 5973.6 
Moon  1737 73.5 
Mars  3390 641.85 
----- ------ ------------- 
:

Tabulate link

यहाँ एक उदाहरण सूचना दी

+0

हाँ, मैंने इसका इस्तेमाल किया, और कोड की कुछ ही पंक्तियों में संरचना जैसी सारणी रखने के लिए बहुत आसान! –

4

ऐसा लगता है जैसे आप अपने कॉलम बाएं से उचित है, लेकिन मैं नहीं देखा है कोई जवाब उल्लेख ljust स्ट्रिंग विधि चाहते हैं, तो मैं अजगर 2.7 में प्रदर्शित होगा कि:

def bar(item): 
    return item.replace('foo','bar') 

width = 20 
mylist = ['foo1','foo200000','foo33','foo444'] 

for item in mylist: 
    print "{}| {}".format(item.ljust(width),bar(item).ljust(width)) 

foo1    | bar1 
foo200000   | bar200000 
foo33    | bar33 
foo444    | bar444 

आपके संदर्भ के लिए चल रहा है, help('abc'.ljust) आप इस देता है:

S.ljust (चौड़ाई [, fillchar]) -> स्ट्रिंग

ऐसा लगता है कि ljust विधि लेता है की तरह अपने निर्दिष्ट चौड़ाई और उस से स्ट्रिंग की लंबाई घटाती है, और कई स्ट्रिंग के साथ आपकी स्ट्रिंग के दाईं ओर पैड करती है।

3

आप BeautifulTable आज़मा सकते हैं। यहाँ एक उदाहरण है:

>>> from beautifultable import BeautifulTable 
>>> table = BeautifulTable() 
>>> table.column_headers = ["name", "rank", "gender"] 
>>> table.append_row(["Jacob", 1, "boy"]) 
>>> table.append_row(["Isabella", 1, "girl"]) 
>>> table.append_row(["Ethan", 2, "boy"]) 
>>> table.append_row(["Sophia", 2, "girl"]) 
>>> table.append_row(["Michael", 3, "boy"]) 
>>> print(table) 
+----------+------+--------+ 
| name | rank | gender | 
+----------+------+--------+ 
| Jacob | 1 | boy | 
+----------+------+--------+ 
| Isabella | 1 | girl | 
+----------+------+--------+ 
| Ethan | 2 | boy | 
+----------+------+--------+ 
| Sophia | 2 | girl | 
+----------+------+--------+ 
| Michael | 3 | boy | 
+----------+------+--------+ 
संबंधित मुद्दे