Je travaille avec une base de données et j'essaye de lister toutes les tables de cette base de données. Je peux les imprimer correctement, mais j'ai du mal à formater les tableaux correctement. J'ai utilisé des pandas pour le formater et cela fonctionne, mais j'essaie de créer cela sans pandas. Voici comment il s'imprime jusqu'à présent:

TerritoryID TerritoryDescription RegionID
1581 Westboro 1
1730 Bedford 1
1833 Georgetown 1
2116 Boston 1
2139 Cambridge 1

J'essaye de lui faire ressembler à quelque chose comme ceci:

   TerritoryID TerritoryDescription RegionID
1. 1581        Westboro             1
2. 1730        Bedford              1
3. 1833        Georgetown           1
4. 2116        Boston               1
5. 2139        Cambridge            1

Ce que j'ai essayé, c'est de trouver la longueur maximale des listes et de les formater de cette façon, car il existe d'autres tableaux que j'essaie de formater. C'est ce que j'ai essayé de faire, mais j'obtiens une erreur qui dit: object of type 'int' has no len()

def categories(menu, choice, cursor, connection):
    sql = "SELECT * FROM " + menu[choice - 1]
    cursor.execute(sql)
    rows = cursor.fetchall()
    lst = [list(elem) for elem in rows]
    connection.close()
    return lst


def columns(lst, cursor):
    header = []
    for field in cursor.description:
        header.append(field[0])
    print(' '.join(header))
    length_list = [len(element) for row in lst for element in row]
    column_width = max(length_list)
    for row in lst:
        row = "".join(element.ljust(column_width + 2) for element in row)
        print(row)

Comment corriger cette erreur? Ou est-ce qu'il y a un autre moyen de le faire?

1
Will91099 12 avril 2020 à 23:20

2 réponses

Meilleure réponse

Tous les éléments du row ne sont pas une chaîne. Vous ne pouvez pas prendre le len() d'un int. Par conséquent, assurez-vous que tout est une chaîne avant de prendre sa longueur.

Essayez de faire ce changement:

AVANT

length_list = [len(element) for row in lst for element in row]

APRÈS

length_list = [len(str(element)) for row in lst for element in row]

Et modifiez également cette ligne (enveloppez element dans str():

AVANT

row = "".join(element.ljust(column_width + 2) for element in row)

APRÈS

row = "".join(str(element).ljust(column_width + 2) for element in row)
1
Rusty Widebottom 12 avril 2020 à 23:14

Vous pouvez imprimer des listes de listes sous forme de tableaux à l'aide de chaînes au format python:

# Input is expected as a list of list
rows = [
    ["TerritoryID", "TerritoryDescription", "RegionID"],
    ["1581", "Westboro", "1"], 
    ["1730","Bedford","1"], 
    ["1833","Georgetown","1"], 
    ["2116","Boston","1"], 
    ["2139","Cambridge","1"],
]

# First we get the max width of each column, like so:
max_col = list(max(map(len, x)) + 2 for x in list(map(list, zip(*rows))))

# Set some padding for the index column:
idx_pad = len(str(len(rows))) + 2

# Create a format string that will accept both values, and paddings:
s = "{:<{}}" + "{:<{}}" * len(max_col)

# Iterate the list of lists, printing each row:
for i, row in enumerate(rows):
    if i == 0:
        i = ""
    c = row + max_col
    c[::2] = row
    c[1::2] = max_col
    print(s.format(i, idx_pad, *c))
    idx_pad = old_idx

Qui imprimera:

   TerritoryID  TerritoryDescription  RegionID  
1  1581         Westboro              1         
2  1730         Bedford               1         
3  1833         Georgetown            1         
4  2116         Boston                1         
5  2139         Cambridge             1         
1
Alex 12 avril 2020 à 20:57