1. 程式人生 > >(三)Python查詢12306餘票:漂亮的輸出-----prettytable和colorama的使用

(三)Python查詢12306餘票:漂亮的輸出-----prettytable和colorama的使用

      在前面的程式碼中我們已經實現了對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#返回所有車次餘票資訊

測試結果:
這裡寫圖片描述