如何在 Python 中使用 Pretty Table 打印多个列表中的数据?

Posted

技术标签:

【中文标题】如何在 Python 中使用 Pretty Table 打印多个列表中的数据?【英文标题】:How to use Pretty Table in Python to print out data from multiple lists? 【发布时间】:2016-07-25 05:03:49 【问题描述】:

我对 Python 编程比较陌生,使用的是 Python 3.x,并且正在开发一个理发店 P.O.S 系统,管理员将有权添加服务及其相应的价格。 我正在使用 Pretty Table 库来实现打印出带有 serviceID、service 和 price 的表格。

这是我的代码:

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

当我输入第一个服务和价格时,输出是:

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

当我输入第二个服务和价格时,输出是这样的:

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

我希望输出是这样的:

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

有谁知道如何做到这一点? 任何帮助将不胜感激。

【问题讨论】:

你必须用"\n".join(your_sublist)加入列表中的字符串 【参考方案1】:

我通过始终在while 循环内创建类prettytable.PrettyTable 的新实例来实现这一点。

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

这是我使用方法field_names()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

【讨论】:

谢谢!让我测试一下。 有没有办法访问一行中的单个元素,以获得与使用列表相同的结果?例如,在这种情况下,普通用户可以输入 ServiceID,程序将打印该行的服务和价格数据并要求确认输入。如果得到确认,该程序随后会将条目记录到(ServiceID、Service 和 Price)管理员可以查看的报告中。非常感谢你们的帮助!【参考方案2】:

我们可以通过add_row方法将行添加到PrettyTable对象中。

演示

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

删除行

使用del_row() 方法。我们需要传递要删除的行的索引。

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

如果我们提供的索引值大于异常中的总行数,则需要处理异常,这需要在您的代码中处理。

例外是:

>>> 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!

注意

    在 Python 2.x 中使用 raw_input()

    在 Python 3.x 中使用 input()

【讨论】:

感谢 Vivek 和 Padraic。如何从表中删除一行?我试过像这样 del[2] 索引表,但它不起作用。 @ElizabethMabishi:使用del_row 方法。传递我们要删除的行的索引。我正在添加答案。 @janus-py, Vivek 对于我之前的问题,我找到了一种访问单个元素的方法。这就是我所做的: def log_service(): while True: try: response3 = input("请使用 ServiceID 从列表中选择服务。\n") response3 = int(response3) y = (x[response3:(response3 + 1)]) #写入报表表。有效,但不存储以前记录的值。 IE。每次都重新开始有没有像追加列表这样的方法,或者每次调用 fx 时我可以使用另一种方法将行添加到新表中?抱歉,这不是创建代码块

以上是关于如何在 Python 中使用 Pretty Table 打印多个列表中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

pretty-errors:美化python异常输出以使其清晰易读

如何让 Emacs Python 模式为缩进生成 TAB?

如何在终端中制作 Python 脚本“tab-complete”目录?

使用 shell 或批处理命令行将 Python Pretty 表转换为 CSV

python PRETTY PRINTING

postgrepsql 查看单表大小