2011-12-02 22 views
24

Al usar python2.7, estoy tratando de imprimir en datos tabulares de la pantalla.Resultado tabular del formato Python

Esto es más o menos lo que se ve mi código como:

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

El problema es que, dependiendo de la longitud de if(i) o los datos no se alineará.

Esto es lo que estoy haciendo:

|foo |bar | 
|foobo |foobar | 

Lo que yo quiero llegar:

|foo  |bar  | 
|foobo |foobar | 

¿Hay módulos que permiten hacer esto?

Respuesta

24

No es muy difícil de rodar su propia función de formateo:

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

Como referencia de los demás, que tenía que cambiar la cadena de formato a '{0: {1}}' para conseguir que funcione correctamente. – Darkhydro

+0

Pylint se queja del * :(. Dice "Usado * o ** magia". –

+5

Tenga en cuenta que este código puede no funcionar correctamente si los elementos en la tabla contienen objetos que no sean de cadena, ya que el len no se definirá, o puede ser incorrecto. Para arreglar eso, cambie 'max (len (x)' a 'max (len (str (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

Funciona Gracias. ¡Pero estoy sorprendido de que no haya un módulo para hacerlo de forma nativa! – rahmu

16

Para más hermosa mesa de utilizar el módulo tabular:

Tabulate link

Aquí reportaron un ejemplo:

>>> 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 
----- ------ ------------- 
+0

Sí, utilicé este, ¡y muy simple tener una estructura tipo tabla en pocas líneas de código! –

4

Parece que usted quiere que sus columnas justificados a la izquierda, pero no he visto ninguna respuesta mencionan el método ljust cadena, así que voy a demostrar que en Python 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 

Para su referencia, corriendo help('abc'.ljust) le da esto:

S.ljust (ancho [, FILLCHAR]) -> string

parece que el método lleva su ljust anchura especificada y resta la longitud de la cadena de esa, y rellena el lado derecho de la cadena con tantos caracteres.

3

Puede intentar BeautifulTable. He aquí un ejemplo:

>>> 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 | 
+----------+------+--------+ 
Cuestiones relacionadas