在前面的代码中我们已经实现了对result结果的解析,并且能把车票信息打印出来了。可是输出的格式很不好控制,这时我们需要使用prettytable来实现将车票信息放在表格中,更加的规整,美观。
环境安装:
pip install prettytable
实现打印车票函数:
from prettytable import PrettyTable
#显示查询结果
def display(tickets):
ptable = PrettyTable('车次 出发/到达站 出发/到达时间 历时 商务座 一等座 二等座 高级软卧 软卧 动卧 硬卧 软座 硬座 无座 其他 备注'.split(' '))
for ticket in tickets:
ptable.add_row(ticket)
print(ptable)
if __name__ == "__main__":#main方法
tickets = resolveData()
display(tickets)
input('按任意键退出...')
与第二阶段代码结合后测试:
使用了prettytable后使输出十分规整,现在我想为这一表格中的字体加上颜色,我们需要使用colorama。
环境安装:
pip install colorama
创建一个专门用于更改颜色的类Colored并且添加相应方法:
from colorama import init, Fore, Back, Style
init(autoreset=False)
class Colored(object):
# 前景色:红色 背景色:默认
def red(self, s):
return Fore.LIGHTRED_EX + s + Fore.RESET
# 前景色:绿色 背景色:默认
def green(self, s):
return Fore.LIGHTGREEN_EX + s + Fore.RESET
def yellow(self, s):
return Fore.LIGHTYELLOW_EX + s + Fore.RESET
def white(self,s):
return Fore.LIGHTWHITE_EX + s + Fore.RESET
def blue(self,s):
return Fore.LIGHTBLUE_EX + s + Fore.RESET
现在我们使用这个类:
修改resolveData()函数的部分代码:
def resolveData():
#查询链接
url = 'https://kyfw.12306.cn/otn/leftTicket/queryO?leftTicketDTO.train_date=2018-01-31&leftTicketDTO.from_station=XAY&leftTicketDTO.to_station=GZG&purpose_codes=ADULT' #获取数据
while 1:
try:
data = getData(url)
lists = json.loads(data)["data"]["result"]
break
except:
continue
cont = []
name = [
"station_train_code",
"from_station_name",
'start_time',
"lishi",
"swz_num",
"zy_num",
"ze_num",
"gr_num",
"rw_num",
"dw_num",
"yw_num",
"rz_num",
"yz_num",
"wz_num",
"qt_num",
"note_num"
]
color = Colored()#创建Colored对象
for items in lists:#遍历result的每一项
#data字典用于存放每一车次的余票信息
data = {
"station_train_code": '',
"from_station_name": '',
"to_station_name": '',
'start_time': '',
'end': '',
"lishi": '',
"swz_num": '',
"zy_num": '',
"ze_num": '',
"dw_num": '',
"gr_num": '',
"rw_num": '',
"yw_num": '',
"rz_num": '',
"yz_num": '',
"wz_num": '',
"qt_num": '',
"note_num": ''
}
item = items.split('|')#用"|"进行分割
data['station_train_code'] = item[3]#车次在3号位置
data['from_station_name'] = item[6]#始发站信息在6号位置
data['to_station_name'] = item[7]#终点站信息在7号位置
data['start_time'] = item[8]#出发时间信息在8号位置
data['arrive_time'] = item[9]#抵达时间在9号位置
data['lishi'] = item[10]#经历时间在10号位置
data['swz_num'] = item[32] or item[25]# 特别注意:商务座在32或25位置
data['zy_num'] = item[31]#一等座信息在31号位置
data['ze_num'] = item[30]#二等座信息在30号位置
data['gr_num'] = item[21]#高级软卧信息在31号位置
data['rw_num'] = item[23]#软卧信息在23号位置
data['dw_num'] = item[27]#动卧信息在27号位置
data['yw_num'] = item[28]#硬卧信息在28号位置
data['rz_num'] = item[24]#软座信息在24号位置
data['yz_num'] = item[29]#硬座信息在29号位置
data['wz_num'] = item[26]#无座信息在26号位置
data['qt_num'] = item[22]#其他信息在22号位置
if item[0] == 'null':
data['note_num'] = item[1]
else:
data['note_num'] = color.white(item[1])#加高亮白色
#如果没有信息则用“-”代替
for pos in name:
if data[pos] == '':
data[pos] = '-'
cont.append(data)
tickets = []#存放所有车次的余票信息
#格式化添加进tickets中
for x in cont:
tmp = []
for y in name:
if y == "from_station_name":
s = color.green(stations2CN[x[y]]) + '\n' + color.red(stations2CN[x["to_station_name"]])#始发站绿色,终点站红色
tmp.append(s)
elif y == "start_time":
s = color.green(x[y]) + '\n' + color.red(x["arrive_time"])
tmp.append(s)
elif y == "station_train_code":
s = color.yellow(x[y])
tmp.append(s)
else:
tmp.append(x[y])
tickets.append(tmp)
return tickets#返回所有车次余票信息
测试结果: