如何在 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异常输出以使其清晰易读
如何在终端中制作 Python 脚本“tab-complete”目录?