(三)Python查詢12306餘票:漂亮的輸出-----prettytable和colorama的使用
阿新 • • 發佈:2019-02-13
在前面的程式碼中我們已經實現了對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#返回所有車次餘票資訊
測試結果: