web-dev-qa-db-fra.com

Comment utiliser Pretty Table en Python pour imprimer des données à partir de plusieurs listes?

Je suis relativement nouveau en programmation Python, avec Python 3.x, et je travaille sur un système Barbershop P.O.S où l’administrateur aura le privilège d’ajouter des services et les prix correspondants. J'utilise la bibliothèque Pretty Table pour imprimer une table avec serviceID, service et price.

Voici mon code:

from prettytable import PrettyTable
import random

serviceID = []
services = []
price = []
x = PrettyTable()

x.add_column("ServiceID",[serviceID])
x.add_column("Service", [services])
x.add_column("Price", [price])

while True:
try:

     ID = random.randint(1,90000) #range high to lower probability of non-uniqueness
     serviceID.append(ID) #Generates unique ID for each service
     Prompt1 = input("Please add a service name to the list\n")
     services.append(Prompt1)

     Prompt2 = input("Please enter a price for the service\n")
     Prompt2 == int(Prompt2)
     price.append(Prompt2)

     print(x)


except ValueError:
    print("Please enter valid type")
    continue

Lorsque j'entre le premier service et le prix, la sortie est:

+-----------+---------+--------+
| ServiceID | Service | Price  |
+-----------+---------+--------+
|   [9880]  | ['box'] | ['90'] |
+-----------+---------+--------+

Lorsque j'entre le 2e service et le prix, la sortie est la suivante:

+---------------+-----------------+--------------+
|   ServiceID   |     Service     |    Price     |
+---------------+-----------------+--------------+
| [9880, 47612] | ['box', 'trim'] | ['90', '80'] |
+---------------+-----------------+--------------+

J'aimerais que le résultat soit le suivant:

+---------------+-----------------+--------------+
|   ServiceID   |     Service     |    Price     |
+---------------+-----------------+--------------+
|  9880         |      box        |       90     |
|  47612        |     trim        |       80     |
+---------------+-----------------+--------------+

Est-ce que quelqu'un sait comment y parvenir? Toute aide serait appréciée.

5

Nous pouvons le faire en ajoutant une ligne dans l'objet PrettyTable avec la méthode add_row.

Démo :

>>> from prettytable import PrettyTable
>>> import random
>>> 
>>> x = PrettyTable(["ServiceID", "Service", "Price"])
>>> 
>>> while True:
...     #- Get value
...     ID = random.randint(1,90000) #range high to lower probability of non-uniqueness
...     Prompt1 = raw_input("Please add a service name to the list\n")
...     try:
...         #- Type Casting.
...         Prompt2 = int(raw_input("Please enter a price for the service\n"))
...     except ValueError:
...         print("Please enter valid type")
...         continue
...     #- Add row
...     x.add_row([ID, Prompt1, Prompt2])
...     #- Ask user to Continue or not.
...     choice = raw_input("Continue yes/ no:").lower()
...     if not(choice=="yes" or choice=="y"):
...         break
... 
Please add a service name to the list
2
Please enter a price for the service
3
Continue yes/ no:y
Please add a service name to the list
4
Please enter a price for the service
6
Continue yes/ no:y
Please add a service name to the list
5
Please enter a price for the service
7
Continue yes/ no:n
>>> print x
+-----------+---------+-------+
| ServiceID | Service | Price |
+-----------+---------+-------+
|   38515   |    2    |   3   |
|    8680   |    4    |   6   |
|   51188   |    5    |   7   |
+-----------+---------+-------+
>>> 

Supprimer la ligne

Utilisez la méthode del_row(). Nous devons transmettre l'index de la ligne que nous voulons supprimer.

>>> print x
+-----------+---------+-------+
| ServiceID | Service | Price |
+-----------+---------+-------+
|   38515   |    2    |   3   |
|    8680   |    4    |   6   |
|   51188   |    5    |   7   |
+-----------+---------+-------+
>>> x.del_row(1)
>>> print x
+-----------+---------+-------+
| ServiceID | Service | Price |
+-----------+---------+-------+
|   38515   |    2    |   3   |
|   51188   |    5    |   7   |
+-----------+---------+-------+

Nécessité de gérer une exception si nous fournissons une valeur d'index supérieure à celle que le nombre total de lignes générées par l'exception générera, qui doivent être traitées dans le code ur.

L'exception est:

>>> x.del_row(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/prettytable.py", line 832, in del_row
    raise Exception("Cant delete row at index %d, table only has %d rows!" % (row_index, len(self._rows)))
Exception: Cant delete row at index 10, table only has 2 rows!

Remarque :

  1. Utilisez raw_input() pour Python 2.x

  2. Utilisez input() pour Python 3.x

3
Vivek Sable

J'ai accompli cela en créant toujours une nouvelle instance de la classe prettytable.PrettyTable dans la boucle while. 

from prettytable import PrettyTable
import random

serviceID = []
services = []
price = []

while True:
    try:
        x = PrettyTable()

        ID = random.randint(1,90000) #range high to lower probability of non-uniqueness
        serviceID.append(ID) #Generates unique ID for each service

        Prompt1 = input("Please add a service name to the list\n")
        services.append(Prompt1)

        Prompt2 = input("Please enter a price for the service\n")
        Prompt2 == int(Prompt2)
        price.append(Prompt2)

        x.add_column("ServiceID", serviceID)
        x.add_column("Service", services)
        x.add_column("Price", price)

        print(x)


    except ValueError:
        print("Please enter valid type")
        continue

Voici ma version du code utilisant methonds field_names () et add_row (). 

from prettytable import PrettyTable
import random

serviceID = []
services = []
price = []

x = PrettyTable()

x.field_names = ["ServiceID", "Service", "Price"]

while True:
    try:
         ID = random.randint(1,90000) #range high to lower probability of non-uniqueness
         serviceID.append(ID) # in order to store new value if you will need it later

         Prompt1 = input("Please add a service name to the list\n")
         services.append(Prompt1) # in order to store new value if you will need it later

         Prompt2 = input("Please enter a price for the service\n")
         Prompt2 == int(Prompt2)
         services.append(Prompt2) # in order to store new value if you will need it later

         x.add_row([ID, Prompt1, Prompt2])
         print(x)

    except ValueError:
        print("Please enter valid type")
        continue
0
janus-py