好久没有登录实验楼了, 发现实验楼开了一些很有意思的实验课。 就比如这个用 python 实现火车票查询的工具。
相应课程文档: https://www.shiyanlou.com/courses/623/labs/2072/document
课程地址: https://www.shiyanlou.com/courses/623
之前也从来没有想过这个怎么去实现, 预习了一下之后, 发现这个和我们的爬虫非常相像, 本质上就是爬虫的一个应用。
用来解析命令行参数 https://github.com/docopt/docopt
我们研究了下 这个项目的 python 相关的源码, 发现 核心是通过创建对象, 利用 正则表达式提取相应的 【usage:】 关键字 和 【-x】参数指令从而实现的。
具体细节可以参考 他的源码
相关的正则表达式的文章: http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
这个之前用过, 封装了底层的urllib操作, 使得访问web 操作更加便捷
类似 mysql 一样的输出格式
遇到一个之前也一直遇到的字符集问题:
通过修改cmd 控制台的 字符集得到正确输出
chcp 65001 (utf8)
chcp 936 (gbk)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: anchen
# @Date: 2016-10-05 15:48:08
# @Last Modified by: anchen
# @Last Modified time: 2016-10-05 17:26:30
"""Train tickets query via command-line.
Usage:
tickets [-gdtkz]
Options:
-h,--help 显示帮助菜单
-g 高铁
-d 动车
-t 特快
-k 快速
-z 直达
Example:
tickets beijing shanghai 2016-08-25
"""
from docopt import docopt
from stations import stations
import requests
from TrainCollection import TrainCollection
def cli():
"""command-line interface"""
arguments = docopt(__doc__)
#print(arguments)
from_station = stations.get(arguments['' ])
to_station = stations.get(arguments['' ])
date = arguments['' ]
# build url
url = 'https://kyfw.12306.cn/otn/leftTicket/queryT?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(
date, from_station, to_station)
#print(url)
r = requests.get(url, verify=False)
#print(r.json())
#print(r.json()[u'messages'][0].encode('gbk'))
#print(r.json()['data'])
rows = r.json()['data']
trains = TrainCollection(rows)
trains.pretty_print()
if __name__ == '__main__':
cli()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: anchen
# @Date: 2016-10-05 16:24:27
# @Last Modified by: anchen
# @Last Modified time: 2016-10-05 17:09:12
import re
import requests
from pprint import pprint
url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8955'
r = requests.get(url, verify=False)
stations = re.findall(r'([A-Z]+)\|([a-z]+)', r.text)
stations = dict(stations)
stations = dict(zip(stations.values(), stations.keys()))
pprint(stations, indent=4)
stations = { u'acheng': u'ACB',
u'aershan': u'ART',
u'aershanbei': u'ARX',
u'aihe': u'AHP',
u'aijiacun': u'AJJ',
u'ajin': u'AJD',
u'akesu': u'ASR',
u'aketao': u'AER',
u'alashankou': u'AKR',
u'alihe': u'AHX',
u'alongshan': u'ASX',
u'amuer': u'JTX',
u'ananzhuang': u'AZM',
u'anda': u'ADX',
u'ande': u'ARW',
u'anding': u'ADP',
u'angangxi': u'AAX',
u'anguang': u'AGT',
u'anhua': u'PKQ',
u'anjia': u'AJB',
u'ankang': u'AKY',
u'ankouyao': u'AYY',
u'anlong': u'AUZ',
u'anlu': u'ALN',
u'anping': u'APT',
u'anqing': u'AQH',
u'anqingxi': u'APH',
u'anren': u'ARG',
u'anshan': u'AST',
u'anshanxi': u'AXT',
u'anshun': u'ASW',
u'anshunxi': u'ASE',
u'antang': u'ATV',
u'antingbei': u'ASH',
u'antu': u'ATL',
u'antuxi': u'AXL',
u'anxi': u'AXS',
u'anyang': u'AYF',
u'anyangdong': u'ADF',
u'aojiang': u'ARH',
u'aolibugao': u'ALD',
u'atushi': u'ATR',
u'babu': u'BBE',
u'bachu': u'BCR',
u'badaling': u'ILP',
u'badong': u'BNN',
u'baibiguan': u'BGV',
u'baicheng': u'BCT',
u'baigou': u'FEP',
u'baiguo': u'BGM',
u'baihe': u'BEL',
u'baihedong': u'BIY',
u'baihexian': u'BEY',
u'baijian': u'BAP',
u'baijigou': u'BJJ',
u'baijipo': u'BBM',
u'baikuipu': u'BKB',
u'bailang': u'BAT',
u'bailixia': u'AAP',
u'baimajing': u'BFQ',
u'baiqi': u'BQP',
u'baiquan': u'BQL',
u'baise': u'BIZ',
u'baisha': u'BSW',
u'baishanshi': u'HJL',
u'baishapo': u'BPM',
u'baishishan': u'BAL',
u'baishuijiang': u'BSY',
u'baishuixian': u'BGY',
u'baishuizhen': u'BUM',
u'baiyangdian': u'FWP',
u'baiyi': u'FHW',
u'baiyinchagan': u'BYC',
u'baiyinhuanan': u'FNC',
u'baiyinhushuo': u'BCD',
u'baiyinshi': u'BNJ',
u'baiyintala': u'BID',
u'baiyinxi': u'BXJ',
u'baiyunebo': u'BEC',
u'bajiaotai': u'BTD',
u'balin': u'BLX',
u'bamiancheng': u'BMD',
u'bamiantong': u'BMB',
u'bancheng': u'BUP',
u'banmaoqing': u'BNM',
u'bantian': u'BTQ',
u'baodi': u'BPP',
u'baoding': u'BDP',
u'baodingdong': u'BMP',
u'baohuashan': u'BWH',
u'baoji': u'BJY',
u'baojinan': u'BBY',
u'baokang': u'BKD',
u'baolage': u'BQC',
u'baolin': u'BNB',
u'baolongshan': u'BND',
u'baoqing': u'BUB',
u'baoquanling': u'BQB',
u'baotou': u'BTC',
u'baotoudong': u'BDC',
u'bashan': u'BAY',
u'baxiantong': u'VXD',
u'bayangaole': u'BAC',
u'bayuquan': u'BYT',
u'bazhong': u'IEW',
u'bazhongdong': u'BDE',
u'bazhou': u'RMP',
u'bazhouxi': u'FOP',
u'beian': u'BAB',
u'beibei': u'BPW',
u'beidaihe': u'BEP',
u'beihai': u'BHZ',
u'beijiao': u'IBQ',
u'beijing': u'BJP',
u'beijingbei': u'VAP',
u'beijingdong': u'BOP',
u'beijingnan': u'VNP',
u'beijingxi': u'BXP',
u'beijingzi': u'BRT',
u'beiliu': u'BOZ',
u'beimaquanzi': u'BRP',
u'beipiaonan': u'RPD',
u'beitai': u'BTT',
u'beitun': u'BYP',
u'beitunshi': u'BXR',
u'beiying': u'BIV',
u'beiyinhe': u'BYB',
u'beizhai': u'BVP',
u'bencha': u'FWH',
u'bengbu': u'BBH',
u'bengbunan': u'BMH',
u'benhong': u'BVC',
u'benxi': u'BXT',
u'benxihu': u'BHT',
u'benxixincheng': u'BVT',
u'bijiang': u'BLQ',
u'bijiashan': u'BSB',
u'bijiguan': u'BJM',
u'binhai': u'FHP',
u'binhaibei': u'FCP',
u'binjiang': u'BJB',
u'binxian': u'BXY',
u'binyang': u'UKZ',
u'binzhou': u'BIK',
u'bishan': u'FZW',
u'boao': u'BWQ',
u'bobai': u'BBZ',
u'boketu': u'BKX',
u'bole': u'BOR',
u'boli': u'BLB',
u'botou': u'BZP',
u'boxing': u'BXK',
u'bozhou': u'BZH',
u'buhai': u'BUT',
u'buliekai': u'BLR',
u'caijiagou': u'CJT',
u'caijiapo': u'CJY',
u'caishan': u'CON',
u'cangnan': u'CEH',
u'cangshi': u'CST',
u'cangxi': u'CXE',
u'cangzhou': u'COP',
u'cangzhouxi': u'CBP',
u'caohai': u'WBW',
u'caohekou': u'CKT',
u'caoshi': u'CSL',
u'caoxian': u'CXK',
u'caozili': u'CFP',
u'ceheng': u'CHZ',
u'cenxi': u'CNZ',
u'chabuga': u'CBC',
u'chaigang': u'CGT',
u'chaigoupu': u'CGV',
u'chaihe': u'CHB',
u'chajiang': u'CAM',
u'chaka': u'CVO',
u'chaling': u'CDG',
u'chalingnan': u'CNG',
u'changcheng': u'CEJ',
u'changchong': u'CCM',
u'changchun': u'CCT',
u'changchunnan': u'CET',
u'changchunxi': u'CRT',
u'changde': u'VGQ',
u'changdian': u'CDT',
u'changge': u'CEF',
u'changle': u'CLK',
u'changli': u'CLP',
u'changlingzi': u'CLT',
u'changlinhe': u'FVH',
u'changnong': u'CNJ',
u'changping': u'DAQ',
u'changpingbei': u'VBP',
u'changpingdong': u'FQQ',
u'changpoling': u'CPM',
u'changqingqiao': u'CQJ',
u'changsha': u'CSQ',
u'changshanan': u'CWQ',
u'changshantun': u'CVT',
u'changshou': u'EFW',
u'changshoubei': u'COW',
u'changshouhu': u'CSE',
u'changting': u'CES',
u'changtingnan': u'CNS',
u'changtingzhen': u'CDB',
u'changtu': u'CTT',
u'changtuxi': u'CPT',
u'changwu': u'CWY',
u'changxing': u'CBH',
u'changxingnan': u'CFH',
u'changyang': u'CYN',
u'changyuan': u'CYF',
u'changzheng': u'CZJ',
u'changzhi': u'CZF',
u'changzhibei': u'CBF',
u'changzhou': u'CZH',
u'changzhoubei': u'ESH',
u'changzhuang': u'CVK',
u'chaohu': u'CIH',
u'chaohudong': u'GUH',
u'chaolianggou': u'CYP',
u'chaoshan': u'CBQ',
u'chaoyang': u'CNQ',
u'chaoyangchuan': u'CYL',
u'chaoyangdi': u'CDD',
u'chaoyangzhen': u'CZL',
u'chaozhou': u'CKQ',
u'chasuqi': u'CSC',
u'chengcheng': u'CUY',
u'chengde': u'CDP',
u'chengdedong': u'CCP',
u'chengdu': u'CDW',
u'chengdudong': u'ICW',
u'chengdunan': u'CNW',
u'chenggaozi': u'CZB',
u'chenggu': u'CGY',
u'chengjisihan': u'CJX',
u'chenguanying': u'CAJ',
u'chengyang': u'CEK',
u'chengzitan': u'CWT',
u'chenming': u'CMB',
u'chenqing': u'CQB',
u'chenxi': u'CXQ',
u'chenxiangtun': u'CXT',
u'chenzhou': u'CZQ',
u'chenzhouxi': u'ICQ',
u'chezhuanwan': u'CWM',
u'chibi': u'CBN',
u'chibibei': u'CIN',
u'chifeng': u'CFD',
u'chifengxi': u'CID',
u'chizhou': u'IYH',
u'chongqing': u'CQW',
u'chongqingbei': u'CUW',
u'chongqingnan': u'CRW',
u'chongren': u'CRG',
u'chongzuo': u'CZZ',
u'chuangyecun': u'CEX',
u'chunwan': u'CQQ',
u'chunyang': u'CAL',
u'chushan': u'CSB',
u'chuxiong': u'COM',
u'chuzhou': u'CXH',
u'chuzhoubei': u'CUH',
u'cili': u'CUQ',
u'cishan': u'CSP',
u'cixi': u'CRP',
u'cixian': u'CIP',
u'ciyao': u'CYK',
u'congjiang': u'KNW',
u'cuihuangkou': u'CHP',
u'cuogang': u'CAX',
u'daan': u'RAT',
u'daanbei': u'RNT',
u'daba': u'DBD',
u'daban': u'DBC',
u'dachaigou': u'DGJ',
u'dacheng': u'DCT',
u'dadenggou': u'DKJ',
u'dafangnan': u'DNE',
u'daguan': u'RGW',
u'daguantun': u'DTT',
u'dagushan': u'RMT',
u'dahongqi': u'DQD',
u'dahuichang': u'DHP',
u'dahushan': u'DHD',
u'dailing': u'DLB',
u'daixian': u'DKV',
u'daiyue': u'RYV',
u'dajiagou': u'DJT',
u'dajian': u'DFP',
u'daju': u'DIM',
u'dakoutun': u'DKP',
u'dalateqi': u'DIC',
u'dalatexi': u'DNC',
u'dali': u'DKM',
u'dalian': u'DLT',
u'dalianbei': u'DFT',
u'dalin': u'DLD',
u'daluhao': u'DLC',
u'dandong': u'DUT',
u'dandongxi': u'RWT',
u'danfeng': u'DGY',
u'dangshan': u'DKH',
u'dangshannan': u'PRH',
u'dangtudong': u'OWH',
u'dangyang': u'DYN',
u'dani': u'DNZ',
u'dantu': u'RUH',
u'danxiashan': u'IRQ',
u'danyang': u'DYH',
u'danyangbei': u'EXH',
u'daobao': u'RBT',
u'daoerdeng': u'DRD',
u'daoqing': u'DML',
u'daozhou': u'DFZ',
u'dapanshi': u'RPP',
u'dapingfang': u'DPD',
u'dapu': u'DVT',
u'daqilaha': u'DQX',
u'daqing': u'DZX',
u'daqingdong': u'LFX',
u'daqinggou': u'DSD',
u'daqingxi': u'RHX',
u'dashiqiao': u'DQT',
u'dashitou': u'DSL',
u'dashitounan': u'DAL',
u'dashizhai': u'RZT',
u'datianbian': u'DBM',
u'datong': u'DTV',
u'datongxi': u'DTO',
u'datun': u'DNT',
u'dawang': u'WWQ',
u'dawangtan': u'DZZ',
u'dawanzi': u'DFM',
u'dawukou': u'DFJ',
u'daxing': u'DXX',
u'daxinggou': u'DXL',
u'dayan': u'DYX',
u'dayangshu': u'DUX',
u'dayebei': u'DBN',
u'daying': u'DYV',
u'dayingdong': u'IAW',
u'dayingzhen': u'DJP',
u'dayingzi': u'DZD',
u'dayu': u'DYG',
u'dayuan': u'DYZ',
u'dazhanchang': u'DTJ',
u'dazhangzi': u'DAP',
u'dazhou': u'RXW',
u'dazhuyuan': u'DZY',
u'dazunan': u'FQW',
u'dean': u'DAG',
u'debao': u'RBZ',
u'debosi': u'RDT',
u'dechang': u'DVW',
u'deerbuer': u'DRX',
u'dehui': u'DHT',
u'dehuixi': u'DXT',
u'delingha': u'DHO',
u'dengshahe': u'DWT',
u'dengta': u'DGT',
u'dengzhou': u'DOF',
u'deqing': u'DRH',
u'deqingxi': u'MOH',
u'dexing': u'DWG',
u'deyang': u'DYW',
u'dezhou': u'DZP',
u'dezhoudong': u'DIP',
u'dianjiang': u'DJE',
u'dianxin': u'DXM',
u'didao': u'DDB',
u'dingbian': u'DYJ',
u'dinghudong': u'UWQ',
u'dinghushan': u'NVQ',
u'dingnan': u'DNG',
u'dingtao': u'DQK',
u'dingxi': u'DSJ',
u'dingxiang': u'DXV',
u'dingyuan': u'EWH',
u'dingzhou': u'DXP',
u'dingzhoudong': u'DOP',
u'diwopu': u'DWJ',
u'dizhuang': u'DVQ',
u'dongandong': u'DCZ',
u'dongbianjing': u'DBB',
u'dongdaihe': u'RDD',
u'dongerdaohe': u'DRB',
u'dongfang': u'UFQ',
u'dongfanghong': u'DFB',
u'dongfeng': u'DIL',
u'donggangbei': u'RGT',
u'dongguan': u'RTQ',
u'dongguandong': u'DMQ',
u'dongguang': u'DGP',
u'donghai': u'DHB',
u'donghaixian': u'DQH',
u'dongjin': u'DKB',
u'dongjingcheng': u'DJB',
u'donglai': u'RVD',
u'dongmiaohe': u'DEP',
u'dongmingcun': u'DMD',
u'dongmingxian': u'DNF',
u'dongsheng': u'DOC',
u'dongshengxi': u'DYC',
u'dongtai': u'DBH',
u'dongtonghua': u'DTL',
u'dongwan': u'DRJ',
u'dongxiang': u'DXG',
u'dongxinzhuang': u'DXD',
u'dongxu': u'RXP',
u'dongying': u'DPK',
u'dongyingnan': u'DOK',
u'dongyudi': u'DBV',
u'dongzhen': u'DNV',
u'dongzhi': u'DCH',
u'dongzhuang': u'DZV',
u'douluo': u'DLV',
u'douzhangzhuang': u'RZP',
u'douzhuang': u'ROP',
u'duanzhou': u'WZQ',
u'duge': u'DMM',
u'duiqingshan': u'DQB',
u'duizhen': u'DWV',
u'dujia': u'DJL',
u'dujiangyan': u'DDW',
u'dulitun': u'DTX',
u'dunhua': u'DHL',
u'dunhuang': u'DHJ',
u'dushan': u'RWW',
u'dushupu': u'DPM',
u'duyun': u'RYW',
u'duyundong': u'KJW',
u'ebian': u'EBW',
u'eerduosi': u'EEC',
u'ejina': u'EJC',
u'emei': u'EMW',
u'emeishan': u'IXW',
u'enshi': u'ESN',
u'erdaogoumen': u'RDP',
u'erdaowan': u'RDX',
u'erlian': u'RLC',
u'erlong': u'RLD',
u'erlongshantun': u'ELA',
u'ermihe': u'RML',
u'erying': u'RYJ',
u'ezhou': u'ECN',
u'ezhoudong': u'EFN',
u'faer': u'FEM',
u'fanchangxi': u'PUH',
u'fangchenggangbei': u'FBZ',
u'fanjiatun': u'FTT',
u'fanshi': u'FSV',
u'fanzhen': u'VZK',
u'faqi': u'FQE',
u'feidong': u'FIH',
u'feixian': u'FXK',
u'fengcheng': u'FCG',
u'fengchengdong': u'FDT',
u'fengchengnan': u'FNG',
u'fengdu': u'FUW',
u'fenghua': u'FHH',
u'fenghuangcheng': u'FHT',
u'fenghuangjichang': u'FJQ',
u'fenglezhen': u'FZB',
u'fenglingdu': u'FLV',
u'fengshuicun': u'FSJ',
u'fengshun': u'FUQ',
u'fengtun': u'FTX',
u'fengxian': u'FXY',
u'fengyang': u'FUH',
u'fengzhen': u'FZC',
u'fengzhou': u'FZY',
u'fenhe': u'FEV',
u'fenyang': u'FAV',
u'fenyi': u'FYG',
u'foshan': u'FSQ',
u'fuan': u'FAS',
u'fuchuan': u'FDZ',
u'fuding': u'FES',
u'fuhai': u'FHR',
u'fujin': u'FIB',
u'fulaerji': u'FRX',
u'fuling': u'FLW',
u'fulingbei': u'FEW',
u'fuliqu': u'FLJ',
u'fulitun': u'FTB',
u'funan': u'FNH',
u'funing': u'FNP',
u'fuqing': u'FQS',
u'fuquan': u'VMW',
u'fushankou': u'FKP',
u'fushanzhen': u'FZQ',
u'fushun': u'FST',
u'fushunbei': u'FET',
u'fusong': u'FSL',
u'fusui': u'FSZ',
u'futian': u'NZQ',
u'futuyu': u'FYP',
u'fuxian': u'FEY',
u'fuxiandong': u'FDY',
u'fuxin': u'FXD',
u'fuyang': u'FYH',
u'fuyu': u'FYX',
u'fuyuan': u'FYM',
u'fuyubei': u'FBT',
u'fuzhou': u'FZG',
u'fuzhoubei': u'FBG',
u'fuzhoudong': u'FDG',
u'fuzhounan': u'FYS',
u'gaizhou': u'GXT',
u'gaizhouxi': u'GAT',
u'gancaodian': u'GDJ',
u'gangou': u'GGL',
u'gangu': u'GGJ',
u'ganhe': u'GAX',
u'ganluo': u'VOW',
u'ganqika': u'GQD',
u'ganquan': u'GQY',
u'ganquanbei': u'GEY',
u'ganshui': u'GSW',
u'gantang': u'GNJ',
u'ganzhou': u'GZG',
u'gaoan': u'GCG',
u'gaobeidian': u'GBP',
u'gaobeidiandong': u'GMP',
u'gaocheng': u'GEP',
u'gaocun': u'GCV',
u'gaogezhuang': u'GGP',
u'gaolan': u'GEJ',
u'gaoloufang': u'GFM',
u'gaomi': u'GMK',
u'gaoping': u'GPF',
u'gaoqiaozhen': u'GZD',
u'gaoshanzi': u'GSD',
u'gaotai': u'GTJ',
u'gaotainan': u'GAJ',
u'gaotan': u'GAY',
u'gaoyi': u'GIP',
u'gaoyixi': u'GNP',
u'gaozhou': u'GSQ',
u'gashidianzi': u'GXD',
u'gediannan': u'GNN',
u'geermu': u'GRO',
u'gegenmiao': u'GGT',
u'geju': u'GEM',
u'genhe': u'GEX',
u'gezhenpu': u'GZT',
u'gongcheng': u'GCZ',
u'gongmiaozi': u'GMC',
u'gongnonghu': u'GRT',
u'gongpengzi': u'GPT',
u'gongqingcheng': u'GAG',
u'gongyi': u'GXF',
u'gongyinan': u'GYF',
u'gongyingzi': u'GYD',
u'gongzhuling': u'GLT',
u'gongzhulingnan': u'GBT',
u'goubangzi': u'GBD',
u'guan': u'GFP',
u'guangan': u'VJW',
u'guangannan': u'VUW',
u'guangao': u'GVP',
u'guangde': u'GRH',
u'guanghan': u'GHW',
u'guanghanbei': u'GVW',
u'guangmingcheng': u'IMQ',
u'guangnanwei': u'GNM',
u'guangning': u'FBQ',
u'guangningsi': u'GQT',
u'guangningsinan': u'GNT',
u'guangshan': u'GUN',
u'guangshui': u'GSN',
u'guangtongbei': u'GPM',
u'guangyuan': u'GYW',
u'guangyuannan': u'GAW',
u'guangze': u'GZS',
u'guangzhou': u'GZQ',
u'guangzhoubei': u'GBQ',
u'guangzhoudong': u'GGQ',
u'guangzhounan': u'IZQ',
u'guangzhouxi': u'GXQ',
u'guanlin': u'GLF',
u'guanling': u'GLE',
u'guanshui': u'GST',
u'guanting': u'GTP',
u'guantingxi': u'KEP',
u'guanzhaishan': u'GSS',
u'guanzijing': u'GOT',
u'guazhou': u'GZJ',
u'gucheng': u'GCN',
u'guchengzhen': u'GZB',
u'gudong': u'GDV',
u'guian': u'GAE',
u'guiding': u'GTW',
u'guidingbei': u'FMW',
u'guidingnan': u'IDW',
u'guidingxian': u'KIW',
u'guigang': u'GGZ',
u'guilin': u'GLZ',
u'guilinbei': u'GBZ',
u'guilinxi': u'GEZ',
u'guiliuhe': u'GHT',
u'guiping': u'GAZ',
u'guixi': u'GXG',
u'guiyang': u'GIW',
u'guiyangbei': u'KQW',
u'gujiao': u'GJV',
u'gujiazi': u'GKT',
u'gulang': u'GLJ',
u'gulian': u'GRX',
u'guojiadian': u'GDT',
u'guoleizhuang': u'GLP',
u'guosong': u'GSL',
u'guoyang': u'GYH',
u'guozhen': u'GZY',
u'gushankou': u'GSP',
u'gushi': u'GXN',
u'gutian': u'GTS',
u'gutianbei': u'GBS',
u'gutianhuizhi': u'STS',
u'guyuan': u'GUJ',
u'guzhen': u'GEH',
u'haerbin': u'HBB',
u'haerbinbei': u'HTB',
u'haerbindong': u'VBB',
u'haerbinxi': u'VAB',
u'haianxian': u'HIH',
u'haibei': u'HEB',
u'haicheng': u'HCT',
u'haichengxi': u'HXT',
u'haidongxi': u'HDO',
u'haikou': u'VUQ',
u'haikoudong': u'KEQ',
u'hailaer': u'HRX',
u'hailin': u'HRB',
u'hailong': u'HIL',
u'hailun': u'HLB',
u'haining': u'HNH',
u'hainingxi': u'EUH',
u'haishiwan': u'HSO',
u'haituozi': u'HZT',
u'haiwan': u'RWH',
u'haiyang': u'HYK',
u'haiyangbei': u'HEK',
u'halahai': u'HIT',
u'halasu': u'HAX',
u'hami': u'HMR',
u'hancheng': u'HCY',
u'hanchuan': u'HCN',
u'hanconggou': u'HKB',
u'handan': u'HDP',
u'handandong': u'HPP',
u'hanfuwan': u'HXJ',
u'hangjinhouqi': u'HDC',
u'hangu': u'HGP',
u'hangzhou': u'HZH',
u'hangzhoudong': u'HGH',
u'hangzhounan': u'XHH',
u'hanjiang': u'HJS',
u'hankou': u'HKN',
u'hanling': u'HAT',
u'hanmaying': u'HYP',
u'hanshou': u'VSQ',
u'hanyin': u'HQY',
u'hanyuan': u'WHW',
u'hanzhong': u'HOY',
u'haolianghe': u'HHB',
u'hebei': u'HMB',
u'hebi': u'HAF',
u'hebian': u'HBV',
u'hebidong': u'HFF',
u'hechuan': u'WKW',
u'hechun': u'HCZ',
u'hefei': u'HFH',
u'hefeibeicheng': u'COH',
u'hefeinan': u'ENH',
u'hefeixi': u'HTH',
u'hegang': u'HGB',
u'heichongtan': u'HCJ',
u'heihe': u'HJB',
u'heijing': u'HIM',
u'heishui': u'HOT',
u'heitai': u'HQB',
u'heiwang': u'HWK',
u'hejiadian': u'HJJ',
u'hejianxi': u'HXP',
u'hejin': u'HJV',
u'hejing': u'HJR',
u'hekoubei': u'HBM',
u'hekounan': u'HKJ',
u'heli': u'HOB',
u'helong': u'HLL',
u'hengdaohezi': u'HDB',
u'hengfeng': u'HFG',
u'henggouqiaodong': u'HNN',
u'hengnan': u'HNG',
u'hengshan': u'HSQ',
u'hengshanxi': u'HEQ',
u'hengshui': u'HSP',
u'hengyang': u'HYQ',
u'hengyangdong': u'HVQ',
u'heping': u'VAQ',
u'hepu': u'HVZ',
u'heqing': u'HQM',
u'heshengqiaodong': u'HLN',
u'heshituoluogai': u'VSR',
u'heshuo': u'VUR',
u'hetian': u'VTR',
u'heyang': u'HAY',
u'heyangbei': u'HTY',
u'heyuan': u'VIQ',
u'heze': u'HIK',
u'hezhou': u'HXZ',
u'hongan': u'HWN',
u'honganxi': u'VXN',
u'hongguangzhen': u'IGW',
u'hongguo': u'HEM',
u'honghe': u'HPB',
u'honghuagou': u'VHD',
u'hongjiang': u'HFM',
u'hongqing': u'HEY',
u'hongshan': u'VSB',
u'hongshaxian': u'VSJ',
u'hongsipu': u'HSJ',
u'hongtong': u'HDV',
u'hongtongxi': u'HTV',
u'hongxiantai': u'HTJ',
u'hongxing': u'VXB',
u'hongxinglong': u'VHB',
u'hongyan': u'VIX',
u'houma': u'HMV',
u'houmaxi': u'HPV',
u'houmen': u'KMQ',
u'huacheng': u'VCQ',
u'huade': u'HGC',
u'huahu': u'KHN',
u'huaian': u'AUH',
u'huaiannan': u'AMH',
u'huaibei': u'HRH',
u'huaibin': u'HVN',
u'huaihua': u'HHQ',
u'huaihuanan': u'KAQ',
u'huaiji': u'FAQ',
u'huainan': u'HAH',
u'huainandong': u'HOH',
u'huairen': u'HRV',
u'huairendong': u'HFV',
u'huairou': u'HRP',
u'huairoubei': u'HBP',
u'huajia': u'HJT',
u'huajiazhuang': u'HJM',
u'hualin': u'HIB',
u'huanan': u'HNB',
u'huangbai': u'HBL',
u'huangchuan': u'KCN',
u'huangcun': u'HCP',
u'huanggang': u'KGN',
u'huanggangdong': u'KAN',
u'huanggangxi': u'KXN',
u'huangguayuan': u'HYM',
u'huanggutun': u'HTT',
u'huanghejingqu': u'HCF',
u'huanghuatong': u'HUD',
u'huangkou': u'KOH',
u'huangling': u'ULY',
u'huanglingnan': u'VLY',
u'huangliu': u'KLQ',
u'huangmei': u'VEH',
u'huangnihe': u'HHL',
u'huangshan': u'HKH',
u'huangshanbei': u'NYH',
u'huangshi': u'HSN',
u'huangshibei': u'KSN',
u'huangshidong': u'OSN',
u'huangsongdian': u'HDL',
u'huangyangtan': u'HGJ',
u'huangyangzhen': u'HYJ',
u'huangyuan': u'HNO',
u'huangzhou': u'VON',
u'huantai': u'VTK',
u'huanxintian': u'VTB',
u'huapengzi': u'HZM',
u'huaqiao': u'VQH',
u'huarong': u'HRN',
u'huarongdong': u'HPN',
u'huarongnan': u'KRN',
u'huashan': u'HSY',
u'huashanbei': u'HDY',
u'huashannan': u'KNN',
u'huaying': u'HUW',
u'huayuan': u'HUN',
u'huayuankou': u'HYT',
u'huazhou': u'HZZ',
u'huhehaote': u'HHC',
u'huhehaotedong': u'NDC',
u'huian': u'HNS',
u'huichangbei': u'XEG',
u'huidong': u'KDQ',
u'huihuan': u'KHQ',
u'huinong': u'HMJ',
u'huishan': u'VCH',
u'huitong': u'VTQ',
u'huixian': u'HYY',
u'huizhou': u'HCQ',
u'huizhounan': u'KNQ',
u'huizhouxi': u'VXQ',
u'hukou': u'HKG',
u'hulan': u'HUB',
u'hulin': u'VLB',
u'huludao': u'HLD',
u'huludaobei': u'HPD',
u'hulusitai': u'VTJ',
u'humen': u'IUQ',
u'hunchun': u'HUL',
u'hunhe': u'HHT',
u'huoerguosi': u'HFR',
u'huojia': u'HJF',
u'huolianzhai': u'HLT',
u'huolinguole': u'HWD',
u'huoqiu': u'FBH',
u'huozhou': u'HZV',
u'huozhoudong': u'HWV',
u'hushiha': u'HHP',
u'hushitai': u'HUT',
u'huzhou': u'VZH',
u'jiafeng': u'JFF',
u'jiagedaqi': u'JGX',
u'jialuhe': u'JLF',
u'jiamusi': u'JMB',
u'jian': u'VAG',
u'jianchang': u'JFD',
u'jianfeng': u'PFQ',
u'jiangbiancun': u'JBG',
u'jiangdu': u'UDH',
u'jianghua': u'JHZ',
u'jiangjia': u'JJB',
u'jiangjin': u'JJW',
u'jiangle': u'JLS',
u'jiangmen': u'JWQ',
u'jiangning': u'JJH',
u'jiangningxi': u'OKH',
u'jiangqiao': u'JQX',
u'jiangshan': u'JUH',
u'jiangsuotian': u'JOM',
u'jiangyan': u'UEH',
u'jiangyong': u'JYZ',
u'jiangyou': u'JFW',
u'jiangyuan': u'SZL',
u'jianhu': u'AJH',
u'jianningxianbei': u'JCS',
u'jianou': u'JVS',
u'jianouxi': u'JUS',
u'jiansanjiang': u'JIB',
u'jianshe': u'JET',
u'jianshi': u'JRN',
u'jianshui': u'JSM',
u'jianyang': u'JYS',
u'jianyangnan': u'JOW',
u'jiaocheng': u'JNV',
u'jiaohe': u'JHL',
u'jiaohexi': u'JOL',
u'jiaomei': u'JES',
u'jiaozhou': u'JXK',
u'jiaozhoubei': u'JZK',
u'jiaozuo': u'JOF',
u'jiaozuodong': u'WEF',
u'jiashan': u'JSH',
u'jiashannan': u'EAH',
u'jiaxiang': u'JUK',
u'jiaxing': u'JXH',
u'jiaxingnan': u'EPH',
u'jiaxinzi': u'JXT',
u'jiayuguan': u'JGJ',
u'jiayuguannan': u'JBJ',
u'jidong': u'JOB',
u'jieshoushi': u'JUN',
u'jiexiu': u'JXV',
u'jiexiudong': u'JDV',
u'jieyang': u'JRQ',
u'jiguanshan': u'JST',
u'jijiagou': u'VJD',
u'jilin': u'JLL',
u'jiling': u'JLJ',
u'jimobei': u'JVK',
u'jinan': u'JNK',
u'jinandong': u'JAK',
u'jinanxi': u'JGK',
u'jinbaotun': u'JBD',
u'jinchang': u'JCJ',
u'jincheng': u'JCF',
u'jinchengbei': u'JEF',
u'jinchengjiang': u'JJZ',
u'jingbian': u'JIY',
u'jingchuan': u'JAJ',
u'jingde': u'NSH',
u'jingdezhen': u'JCG',
u'jingdian': u'JFP',
u'jinggangshan': u'JGG',
u'jinghai': u'JHP',
u'jinghe': u'JHR',
u'jinghenan': u'JIR',
u'jingmen': u'JMN',
u'jingnan': u'JNP',
u'jingoutun': u'VGP',
u'jingpeng': u'JPC',
u'jingshan': u'JCN',
u'jingtai': u'JTJ',
u'jingtieshan': u'JVJ',
u'jingxi': u'JMZ',
u'jingxian': u'LOH',
u'jingxing': u'JJP',
u'jingyu': u'JYL',
u'jingyuan': u'JYJ',
u'jingyuanxi': u'JXJ',
u'jingzhou': u'JBN',
u'jinhe': u'JHX',
u'jinhua': u'JBH',
u'jinhuanan': u'RNH',
u'jining': u'JIK',
u'jiningnan': u'JAC',
u'jinjiang': u'JJS',
u'jinkeng': u'JKT',
u'jinmacun': u'JMM',
u'jinshanbei': u'EGH',
u'jinshantun': u'JTB',
u'jinxian': u'JUG',
u'jinxiannan': u'JXG',
u'jinyuewan': u'PYQ',
u'jinyun': u'JYH',
u'jinyunxi': u'PYH',
u'jinzhai': u'JZH',
u'jinzhangzi': u'JYD',
u'jinzhong': u'JZV',
u'jinzhou': u'JXP',
u'jinzhounan': u'JOD',
u'jishan': u'JVV',
u'jishou': u'JIQ',
u'jishu': u'JSL',
u'jiujiang': u'JJG',
u'jiuquan': u'JQJ',
u'jiuquannan': u'JNJ',
u'jiusan': u'SSX',
u'jiutai': u'JTL',
u'jiutainan': u'JNL',
u'jiuzhuangwo': u'JVP',
u'jiwen': u'JWX',
u'jixi': u'JXB',
u'jixian': u'JKP',
u'jixibei': u'NRH',
u'jixixian': u'JRH',
u'jiyuan': u'JYF',
u'juancheng': u'JCK',
u'jubao': u'JRT',
u'junan': u'JOK',
u'junde': u'JDB',
u'junliangchengbei': u'JMP',
u'jurongxi': u'JWH',
u'juxian': u'JKK',
u'juye': u'JYK',
u'kaian': u'KAT',
u'kaifeng': u'KFF',
u'kaifengbei': u'KBF',
u'kaijiang': u'KAW',
u'kaili': u'KLW',
u'kailinan': u'QKW',
u'kailu': u'KLC',
u'kaitong': u'KTT',
u'kaiyang': u'KVW',
u'kaiyuan': u'KYT',
u'kaiyuanxi': u'KXT',
u'kalaqi': u'KQX',
u'kangcheng': u'KCP',
u'kangjinjing': u'KJB',
u'kangxiling': u'KXZ',
u'kangzhuang': u'KZP',
u'kashi': u'KSR',
u'kedong': u'KOB',
u'kelamayi': u'KHR',
u'kelan': u'KLV',
u'keshan': u'KSB',
u'keyihe': u'KHX',
u'kouqian': u'KQL',
u'kuandian': u'KDT',
u'kuche': u'KCR',
u'kuduer': u'KDX',
u'kuerle': u'KLR',
u'kuishan': u'KAB',
u'kuitan': u'KTQ',
u'kuitun': u'KTR',
u'kulun': u'KLD',
u'kunming': u'KMM',
u'kunmingxi': u'KXM',
u'kunshan': u'KSH',
u'kunshannan': u'KNH',
u'kunyang': u'KAM',
u'lagu': u'LGB',
u'laha': u'LHX',
u'laibin': u'UBZ',
u'laibinbei': u'UCZ',
u'laituan': u'LVZ',
u'laiwudong': u'LWK',
u'laiwuxi': u'UXK',
u'laixi': u'LXK',
u'laixibei': u'LBK',
u'laiyang': u'LYK',
u'laiyuan': u'LYP',
u'laizhou': u'LZS',
u'lalin': u'LAB',
u'lamadian': u'LMX',
u'lancun': u'LCK',
u'langang': u'LNB',
u'langfang': u'LJP',
u'langfangbei': u'LFP',
u'langweishan': u'LRJ',
u'langxiang': u'LXB',
u'langzhong': u'LZE',
u'lankao': u'LKF',
u'lankaonan': u'LUF',
u'lanling': u'LLB',
u'lanlingbei': u'COK',
u'lanxi': u'LWH',
u'lanzhou': u'LZJ',
u'lanzhoudong': u'LVJ',
u'lanzhouxi': u'LAJ',
u'lanzhouxinqu': u'LQJ',
u'laobian': u'LLT',
u'laochengzhen': u'ACQ',
u'laofu': u'UFD',
u'laolai': u'LAX',
u'laoying': u'LXL',
u'lasa': u'LSO',
u'lazha': u'LEM',
u'lechang': u'LCQ',
u'ledong': u'UQQ',
u'ledu': u'LDO',
u'ledunan': u'LVO',
u'leiyang': u'LYQ',
u'leiyangxi': u'LPQ',
u'leizhou': u'UAQ',
u'lengshuijiangdong': u'UDQ',
u'lepingshi': u'LPG',
u'leshan': u'IVW',
u'leshanbei': u'UTW',
u'leshancun': u'LUM',
u'liangdang': u'LDY',
u'liangdixia': u'LDP',
u'lianggezhuang': u'LGP',
u'liangjia': u'UJT',
u'liangjiadian': u'LRT',
u'liangping': u'UQW',
u'liangpingnan': u'LPE',
u'liangshan': u'LMK',
u'lianjiang': u'LKS',
u'lianjiangkou': u'LHB',
u'lianshanguan': u'LGT',
u'lianyuan': u'LAQ',
u'lianyungang': u'UIH',
u'lianyungangdong': u'UKH',
u'liaocheng': u'UCK',
u'liaoyang': u'LYT',
u'liaoyuan': u'LYL',
u'liaozhong': u'LZD',
u'licheng': u'UCP',
u'lichuan': u'LCN',
u'liduigongyuan': u'INW',
u'lijia': u'LJB',
u'lijiang': u'LHM',
u'lijiaping': u'LIJ',
u'lijinnan': u'LNK',
u'lilinbei': u'KBQ',
u'liling': u'LLG',
u'lilingdong': u'UKQ',
u'limudian': u'LMB',
u'lincheng': u'UUP',
u'linchuan': u'LCG',
u'lindong': u'LRC',
u'linfen': u'LFV',
u'linfenxi': u'LXV',
u'lingaonan': u'KGQ',
u'lingbao': u'LBF',
u'lingbaoxi': u'LPF',
u'lingbi': u'GMH',
u'lingcheng': u'LGK',
u'linghai': u'JID',
u'lingling': u'UWZ',
u'lingqiu': u'LVV',
u'lingshi': u'LSV',
u'lingshidong': u'UDV',
u'lingshui': u'LIQ',
u'lingwu': u'LNJ',
u'lingyuan': u'LYD',
u'lingyuandong': u'LDD',
u'linhai': u'UFH',
u'linhe': u'LHC',
u'linjialou': u'ULK',
u'linjiang': u'LQL',
u'linkou': u'LKB',
u'linli': u'LWQ',
u'linqing': u'UQK',
u'linshengpu': u'LBT',
u'linxi': u'UEP',
u'linxiang': u'LXQ',
u'linyi': u'LVK',
u'linyibei': u'UYK',
u'linying': u'LNF',
u'linyuan': u'LYX',
u'linze': u'LEJ',
u'linzenan': u'LDJ',
u'liquan': u'LGY',
u'lishizhai': u'LET',
u'lishui': u'USH',
u'lishuzhen': u'LSB',
u'litang': u'LTZ',
u'liudaohezi': u'LVP',
u'liuhe': u'KLH',
u'liuhezhen': u'LEX',
u'liujiadian': u'UDT',
u'liujiahe': u'LVT',
u'liulinnan': u'LKV',
u'liupanshan': u'UPJ',
u'liupanshui': u'UMW',
u'liushuigou': u'USP',
u'liushutun': u'LSD',
u'liuyuan': u'DHR',
u'liuyuannan': u'LNR',
u'liuzhi': u'LIW',
u'liuzhou': u'LZZ',
u'liwang': u'VLJ',
u'lixian': u'LEQ',
u'liyang': u'LEH',
u'lizhi': u'LZX',
u'longandong': u'IDZ',
u'longchang': u'LCW',
u'longchangbei': u'NWW',
u'longchuan': u'LUQ',
u'longdongbao': u'FVW',
u'longfeng': u'KFQ',
u'longgou': u'LGJ',
u'longgudian': u'LGM',
u'longhua': u'UHP',
u'longjia': u'UJL',
u'longjiang': u'LJX',
u'longjing': u'LJL',
u'longli': u'LLW',
u'longlibei': u'KFW',
u'longnan': u'UNG',
u'longquansi': u'UQJ',
u'longshanzhen': u'LAS',
u'longshi': u'LAG',
u'longtangba': u'LBM',
u'longxi': u'LXJ',
u'longxian': u'LXY',
u'longyan': u'LYS',
u'longyou': u'LMH',
u'longzhen': u'LZA',
u'longzhuagou': u'LZT',
u'loudi': u'LDQ',
u'loudinan': u'UOQ',
u'luan': u'UAH',
u'luanhe': u'UDP',
u'luanheyan': u'UNP',
u'luanping': u'UPP',
u'luanxian': u'UXP',
u'luchaogang': u'UCH',
u'lucheng': u'UTP',
u'luchuan': u'LKZ',
u'ludao': u'LDL',
u'lueyang': u'LYY',
u'lufan': u'LVM',
u'lufeng': u'LLQ',
u'lufengnan': u'LQM',
u'lugou': u'LOM',
u'lujiang': u'UJH',
u'lukoupu': u'LKQ',
u'luliang': u'LRM',
u'lulong': u'UAP',
u'luntai': u'LAR',
u'luocheng': u'VCZ',
u'luofa': u'LOP',
u'luohe': u'LON',
u'luohexi': u'LBN',
u'luojiang': u'LJW',
u'luojiangdong': u'IKW',
u'luomen': u'LMJ',
u'luoping': u'LPM',
u'luopoling': u'LPP',
u'luoshan': u'LRN',
u'luotuoxiang': u'LTJ',
u'luowansanjiang': u'KRW',
u'luoyang': u'LYF',
u'luoyangdong': u'LDF',
u'luoyanglongmen': u'LLF',
u'luoyuan': u'LVS',
u'lushan': u'LAF',
u'lushuihe': u'LUL',
u'lutai': u'LTP',
u'luxi': u'LUG',
u'luzhai': u'LIZ',
u'luzhaibei': u'LSZ',
u'lvboyuan': u'LCF',
u'lvhua': u'LWJ',
u'lvliang': u'LHV',
u'lvshun': u'LST',
u'maanshan': u'MAH',
u'maanshandong': u'OMH',
u'macheng': u'MCN',
u'machengbei': u'MBN',
u'mahuang': u'MHZ',
u'maiyuan': u'MYS',
u'malan': u'MLR',
u'malianhe': u'MHB',
u'malin': u'MID',
u'malong': u'MGM',
u'manasi': u'MSR',
u'manasihu': u'MNR',
u'mangui': u'MHX',
u'manshuiwan': u'MKW',
u'manzhouli': u'MLX',
u'maoba': u'MBY',
u'maobaguan': u'MGY',
u'maocaoping': u'KPM',
u'maoershan': u'MRB',
u'maolin': u'MLD',
u'maoling': u'MLZ',
u'maoming': u'MDQ',
u'maomingxi': u'MMZ',
u'maoshezu': u'MOM',
u'maqiaohe': u'MQB',
u'masanjia': u'MJT',
u'mashan': u'MAB',
u'mawei': u'VAW',
u'mayang': u'MVQ',
u'meihekou': u'MHL',
u'meilan': u'MHQ',
u'meishan': u'MSW',
u'meishandong': u'IUW',
u'meixi': u'MEB',
u'meizhou': u'MOQ',
u'mengdonghe': u'MUQ',
u'mengjiagang': u'MGB',
u'mengzhuang': u'MZF',
u'mengzi': u'MZM',
u'mengzibei': u'MBM',
u'menyuan': u'MYO',
u'mianchi': u'MCF',
u'mianchinan': u'MNF',
u'mianduhe': u'MDX',
u'mianning': u'UGW',
u'mianxian': u'MVY',
u'mianyang': u'MYW',
u'miaocheng': u'MAP',
u'miaoling': u'MLL',
u'miaoshan': u'MSN',
u'miaozhuang': u'MZJ',
u'midu': u'MDF',
u'miluo': u'MLQ',
u'miluodong': u'MQQ',
u'mingcheng': u'MCL',
u'minggang': u'MGN',
u'minggangdong': u'MDN',
u'mingguang': u'MGH',
u'mingshuihe': u'MUT',
u'mingzhu': u'MFQ',
u'minhenan': u'MNO',
u'minle': u'MBJ',
u'minqing': u'MQS',
u'minqingbei': u'MBS',
u'minquan': u'MQF',
u'minquanbei': u'MIF',
u'mishan': u'MSB',
u'mishazi': u'MST',
u'miyi': u'MMW',
u'miyunbei': u'MUP',
u'mizhi': u'MEY',
u'modaoshi': u'MOB',
u'moerdaoga': u'MRX',
u'mohe': u'MVX',
u'moyu': u'MUR',
u'mudanjiang': u'MDB',
u'muling': u'MLB',
u'mulitu': u'MUD',
u'mupang': u'MPQ',
u'muping': u'MBK',
u'nailin': u'NLD',
u'naiman': u'NMD',
u'naluo': u'ULZ',
u'nanboshan': u'NBK',
u'nanbu': u'NBE',
u'nancao': u'NEF',
u'nancha': u'NCB',
u'nanchang': u'NCG',
u'nanchangxi': u'NXG',
u'nancheng': u'NDG',
u'nanchengsi': u'NSP',
u'nanchong': u'NCW',
u'nanchongbei': u'NCE',
u'nandamiao': u'NMP',
u'nandan': u'NDZ',
u'nanfen': u'NFT',
u'nanfenbei': u'NUT',
u'nanfeng': u'NFG',
u'nangongdong': u'NFP',
u'nanguancun': u'NGP',
u'nanguanling': u'NLT',
u'nanhechuan': u'NHJ',
u'nanhua': u'NHS',
u'nanhudong': u'NDN',
u'nanjiang': u'FIW',
u'nanjiangkou': u'NDQ',
u'nanjing': u'NJS',
u'nanjingnan': u'NKH',
u'nankou': u'NKP',
u'nankouqian': u'NKT',
u'nanlang': u'NNQ',
u'nanling': u'LLH',
u'nanmu': u'NMX',
u'nanning': u'NNZ',
u'nanningdong': u'NFZ',
u'nanningxi': u'NXZ',
u'nanping': u'NPS',
u'nanpingbei': u'NBS',
u'nanpingnan': u'NNS',
u'nanqiao': u'NQD',
u'nanqiu': u'NCK',
u'nantai': u'NTT',
u'nantong': u'NUH',
u'nantou': u'NOQ',
u'nanwanzi': u'NWP',
u'nanxiangbei': u'NEH',
u'nanxiong': u'NCQ',
u'nanyang': u'NFF',
u'nanyangzhai': u'NYF',
u'nanyu': u'NUP',
u'nanzamu': u'NZT',
u'nanzhao': u'NAF',
u'napu': u'NPZ',
u'naqu': u'NQO',
u'nayong': u'NYE',
u'nehe': u'NHX',
u'neijiang': u'NJW',
u'neijiangbei': u'NKW',
u'neixiang': u'NXF',
u'nengjia': u'NJD',
u'nenjiang': u'NGX',
u'niangziguan': u'NIP',
u'nianzishan': u'NZX',
u'nihezi': u'NHD',
u'nileke': u'NIR',
u'nimu': u'NMO',
u'ningan': u'NAB',
u'ningbo': u'NGH',
u'ningbodong': u'NVH',
u'ningcun': u'NCZ',
u'ningde': u'NES',
u'ningdong': u'NOJ',
u'ningdongnan': u'NDJ',
u'ningguo': u'NNH',
u'ninghai': u'NHH',
u'ningjia': u'NVT',
u'ninglingxian': u'NLF',
u'ningming': u'NMZ',
u'ningwu': u'NWV',
u'ningxiang': u'NXQ',
u'niujia': u'NJB',
u'niuxintai': u'NXT',
u'nongan': u'NAT',
u'nuanquan': u'NQJ',
u'paihuaibei': u'PHP',
u'pananzhen': u'PAJ',
u'panguan': u'PAM',
u'panjiadian': u'PDP',
u'panjin': u'PVD',
u'panjinbei': u'PBD',
u'panshi': u'PSL',
u'panzhihua': u'PRW',
u'panzhou': u'PAE',
u'paozi': u'POD',
u'peide': u'PDB',
u'pengan': u'PAW',
u'pengshan': u'PSW',
u'pengshanbei': u'PPW',
u'pengshui': u'PHW',
u'pengyang': u'PYJ',
u'pengze': u'PZG',
u'pengzhou': u'PMW',
u'piandian': u'PRP',
u'pianling': u'PNT',
u'piaoertun': u'PRT',
u'pikou': u'PUT',
u'pikounan': u'PKT',
u'pingan': u'PAL',
u'pinganyi': u'PNO',
u'pinganzhen': u'PZT',
u'pingbanan': u'PBE',
u'pingbian': u'PBM',
u'pingchang': u'PCE',
u'pingdingshan': u'PEN',
u'pingdingshanxi': u'BFF',
u'pingdu': u'PAK',
u'pingfang': u'PFB',
u'pinggang': u'PGL',
u'pingguan': u'PGM',
u'pingguo': u'PGZ',
u'pinghekou': u'PHM',
u'pinghu': u'PHQ',
u'pingliang': u'PIJ',
u'pingliangnan': u'POJ',
u'pingnannan': u'PAZ',
u'pingquan': u'PQP',
u'pingshan': u'PSB',
u'pingshang': u'PSK',
u'pingshe': u'PSV',
u'pingshi': u'PSQ',
u'pingtai': u'PVT',
u'pingtian': u'PTM',
u'pingwang': u'PWV',
u'pingxiang': u'PXG',
u'pingxiangbei': u'PBG',
u'pingxingguan': u'PGV',
u'pingyang': u'PYX',
u'pingyao': u'PYV',
u'pingyaogucheng': u'PDV',
u'pingyi': u'PIK',
u'pingyu': u'PYP',
u'pingyuan': u'PYK',
u'pingyuanpu': u'PPJ',
u'pingzhuang': u'PZD',
u'pingzhuangnan': u'PND',
u'pishan': u'PSR',
u'pixian': u'PWW',
u'pixianxi': u'PCW',
u'pizhou': u'PJH',
u'podixia': u'PXJ',
u'puan': u'PAN',
u'puanxian': u'PUE',
u'pucheng': u'PCY',
u'puchengdong': u'PEY',
u'puding': u'PGW',
u'pulandian': u'PLT',
u'puning': u'PEQ',
u'putaojing': u'PTW',
u'putian': u'PTS',
u'puwan': u'PWT',
u'puxiong': u'POW',
u'puyang': u'PYF',
u'qianan': u'QQP',
u'qianfeng': u'QFB',
u'qianhe': u'QUY',
u'qianjiang': u'QJN',
u'qianjinzhen': u'QEB',
u'qianmotou': u'QMP',
u'qianshan': u'QXQ',
u'qianwei': u'QWD',
u'qianweitang': u'QWP',
u'qianxian': u'QBY',
u'qianyang': u'QOY',
u'qiaotou': u'QAT',
u'qiaoxi': u'QXJ',
u'qichun': u'QRN',
u'qidian': u'QDM',
u'qidong': u'QMQ',
u'qidongbei': u'QRQ',
u'qifengta': u'QVP',
u'qijiang': u'QJW',
u'qijiapu': u'QBT',
u'qilihe': u'QLD',
u'qimen': u'QIH',
u'qingan': u'QAB',
u'qingbaijiangdong': u'QFW',
u'qingchengshan': u'QSW',
u'qingdao': u'QDK',
u'qingdaobei': u'QHK',
u'qingdui': u'QET',
u'qingfeng': u'QFT',
u'qinghe': u'QIP',
u'qinghecheng': u'QYP',
u'qinghemen': u'QHD',
u'qinghuayuan': u'QHP',
u'qingjianxian': u'QNY',
u'qinglian': u'QEW',
u'qinglong': u'QIB',
u'qinglongshan': u'QGH',
u'qingshan': u'QSB',
u'qingshen': u'QVW',
u'qingsheng': u'QSQ',
u'qingshui': u'QUJ',
u'qingshuibei': u'QEJ',
u'qingtian': u'QVH',
u'qingtongxia': u'QTJ',
u'qingxian': u'QXP',
u'qingxu': u'QUV',
u'qingyangshan': u'QSJ',
u'qingyuan': u'QYT',
u'qingzhoushi': u'QZK',
u'qinhuangdao': u'QTP',
u'qinjia': u'QJB',
u'qinjiazhuang': u'QZV',
u'qinling': u'QLY',
u'qinxian': u'QVV',
u'qinyang': u'QYF',
u'qinzhou': u'QRZ',
u'qinzhoudong': u'QDZ',
u'qionghai': u'QYQ',
u'qiqihaer': u'QHX',
u'qiqihaernan': u'QNB',
u'qishan': u'QAY',
u'qishuyan': u'QYH',
u'qitaihe': u'QTB',
u'qixian': u'QXV',
u'qixiandong': u'QGV',
u'qixiaying': u'QXC',
u'qiyang': u'QWQ',
u'qiyangbei': u'QVQ',
u'qiying': u'QYJ',
u'qiziwan': u'QZQ',
u'quanjiao': u'INH',
u'quanyang': u'QYL',
u'quanzhou': u'QYS',
u'quanzhoudong': u'QRS',
u'quanzhounan': u'QNZ',
u'queshan': u'QSN',
u'qufu': u'QFK',
u'qufudong': u'QAK',
u'qujiang': u'QIM',
u'qujing': u'QJM',
u'qujiu': u'QJZ',
u'quli': u'QLZ',
u'qushuixian': u'QSO',
u'quxian': u'QRW',
u'quzhou': u'QEH',
u'raoping': u'RVQ',
u'raoyang': u'RVP',
u'raoyanghe': u'RHD',
u'renbu': u'RUO',
u'renqiu': u'RQP',
u'reshui': u'RSD',
u'rikaze': u'RKO',
u'rizhao': u'RZK',
u'rongan': u'RAZ',
u'rongchang': u'RCW',
u'rongchangbei': u'RQW',
u'rongcheng': u'RCK',
u'ronggui': u'RUQ',
u'rongjiang': u'RVW',
u'rongshui': u'RSZ',
u'rongxian': u'RXZ',
u'rudong': u'RIH',
u'rugao': u'RBH',
u'ruian': u'RAH',
u'ruichang': u'RCG',
u'ruijin': u'RJG',
u'rujigou': u'RQJ',
u'rushan': u'ROK',
u'ruyang': u'RYF',
u'ruzhou': u'ROF',
u'saihantala': u'SHC',
u'salaqi': u'SLC',
u'sandaohu': u'SDL',
u'sanduxian': u'KKW',
u'sanggendalai': u'OGC',
u'sanguankou': u'OKJ',
u'sangyuanzi': u'SAJ',
u'sanhexian': u'OXP',
u'sanhezhuang': u'SVP',
u'sanhuizhen': u'OZW',
u'sanjiadian': u'ODP',
u'sanjianfang': u'SFX',
u'sanjiangkou': u'SKD',
u'sanjiangnan': u'SWZ',
u'sanjiangxian': u'SOZ',
u'sanjiazhai': u'SMM',
u'sanjingzi': u'OJT',
u'sanmenxia': u'SMF',
u'sanmenxian': u'OQH',
u'sanmenxianan': u'SCF',
u'sanmenxiaxi': u'SXF',
u'sanming': u'SMS',
u'sanmingbei': u'SHS',
u'sanshijia': u'SRD',
u'sanshilipu': u'SST',
u'sanshui': u'SJQ',
u'sanshuibei': u'ARQ',
u'sanshuinan': u'RNQ',
u'sansui': u'QHW',
u'santangji': u'SDH',
u'sanya': u'JUQ',
u'sanyangchuan': u'SYJ',
u'sanyijing': u'OYD',
u'sanying': u'OEJ',
u'sanyuan': u'SAY',
u'sanyuanpu': u'SYL',
u'shache': u'SCR',
u'shacheng': u'SCP',
u'shahai': u'SED',
u'shahe': u'SHP',
u'shahekou': u'SKT',
u'shaheshi': u'VOP',
u'shahousuo': u'SSD',
u'shalingzi': u'SLP',
u'shanchengzhen': u'SCL',
u'shandan': u'SDJ',
u'shangbancheng': u'SBP',
u'shangbanchengnan': u'OBP',
u'shangcheng': u'SWN',
u'shangdu': u'SXC',
u'shanggaozhen': u'SVK',
u'shanghai': u'SHH',
u'shanghaihongqiao': u'AOH',
u'shanghainan': u'SNH',
u'shanghaixi': u'SXH',
u'shanghang': u'JBS',
u'shanghe': u'SOK',
u'shangjia': u'SJB',
u'shangluo': u'OLY',
u'shangnan': u'ONY',
u'shangqiu': u'SQF',
u'shangqiunan': u'SPF',
u'shangrao': u'SRG',
u'shangwan': u'SWP',
u'shangxipu': u'SXM',
u'shangyaodun': u'SPJ',
u'shangyu': u'BDH',
u'shangyuan': u'SUD',
u'shangyubei': u'SSH',
u'shangzhi': u'SZB',
u'shanhaiguan': u'SHD',
u'shanhetun': u'SHL',
u'shanpodong': u'SBN',
u'shanshan': u'SSR',
u'shanshanbei': u'SMR',
u'shanshi': u'SQB',
u'shantou': u'OTQ',
u'shanwei': u'OGQ',
u'shanyin': u'SNV',
u'shaodong': u'SOQ',
u'shaoguan': u'SNQ',
u'shaoguandong': u'SGQ',
u'shaojiatang': u'SJJ',
u'shaoshan': u'SSQ',
u'shaoshannan': u'INQ',
u'shaowu': u'SWS',
u'shaoxing': u'SOH',
u'shaoxingbei': u'SLH',
u'shaoyang': u'SYQ',
u'shaoyangbei': u'OVQ',
u'shapotou': u'SFJ',
u'shaqiao': u'SQM',
u'shatuo': u'SFM',
u'shawanxian': u'SXR',
u'shaxian': u'SAS',
u'shelihu': u'VLD',
u'shenchi': u'SMV',
u'shenfang': u'OLH',
u'shengfang': u'SUP',
u'shenjia': u'OJB',
u'shenjiahe': u'OJJ',
u'shenjingzi': u'SWT',
u'shenmu': u'OMY',
u'shenqiu': u'SQN',
u'shenshu': u'SWB',
u'shentou': u'SEV',
u'shenyang': u'SYT',
u'shenyangbei': u'SBT',
u'shenyangdong': u'SDT',
u'shenyangnan': u'SOT',
u'shenzhen': u'SZQ',
u'shenzhenbei': u'IOQ',
u'shenzhendong': u'BJQ',
u'shenzhenpingshan': u'IFQ',
u'shenzhenxi': u'OSQ',
u'shenzhou': u'OZP',
u'shexian': u'OVH',
u'shexianbei': u'NPH',
u'shiba': u'OBJ',
u'shibing': u'AQW',
u'shiboyuan': u'ZWT',
u'shicheng': u'SCT',
u'shidu': u'SEP',
u'shihezi': u'SZR',
u'shijiazhuang': u'SJP',
u'shijiazhuangbei': u'VVP',
u'shijiazi': u'SJD',
u'shijiazui': u'SHM',
u'shijingshannan': u'SRP',
u'shilidian': u'OMP',
u'shilin': u'SLM',
u'shiling': u'SOL',
u'shilinnan': u'LNM',
u'shilong': u'SLQ',
u'shimenxian': u'OMQ',
u'shimenxianbei': u'VFQ',
u'shiqiao': u'SQE',
u'shiqiaozi': u'SQT',
u'shiquanxian': u'SXY',
u'shiren': u'SRL',
u'shirencheng': u'SRB',
u'shishan': u'KSQ',
u'shishanbei': u'NSQ',
u'shiti': u'STE',
u'shitou': u'OTB',
u'shixian': u'SXL',
u'shixiazi': u'SXJ',
u'shixing': u'IPQ',
u'shiyan': u'SNN',
u'shizhuang': u'SNM',
u'shizhuxian': u'OSW',
u'shizong': u'SEM',
u'shizuishan': u'QQJ',
u'shoushan': u'SAT',
u'shouyang': u'SYV',
u'shuangchengbei': u'SBB',
u'shuangchengpu': u'SCB',
u'shuangfeng': u'OFB',
u'shuangfengbei': u'NFQ',
u'shuanghezhen': u'SEL',
u'shuangliao': u'ZJD',
u'shuangliujichang': u'IPW',
u'shuangliuxi': u'IQW',
u'shuangpai': u'SBZ',
u'shuangyashan': u'SSB',
u'shucheng': u'OCH',
u'shuidong': u'SIL',
u'shuifu': u'OTW',
u'shuijiahu': u'SQH',
u'shuiquan': u'SID',
u'shuiyang': u'OYP',
u'shuiyuan': u'OYJ',
u'shulan': u'SLL',
u'shule': u'SUR',
u'shulehe': u'SHJ',
u'shunchang': u'SCS',
u'shunde': u'ORQ',
u'shundexueyuan': u'OJQ',
u'shunyi': u'SOP',
u'shuozhou': u'SUV',
u'shuyang': u'FMH',
u'sidaowan': u'OUD',
u'sifangtai': u'STB',
u'siheyong': u'OHD',
u'sihong': u'GQH',
u'sihui': u'AHQ',
u'sijialing': u'OLK',
u'siping': u'SPT',
u'sipingdong': u'PPT',
u'sishui': u'OSK',
u'sixian': u'GPH',
u'siyang': u'MPH',
u'song': u'SOB',
u'songchenglu': u'SFF',
u'songhe': u'SBM',
u'songjiang': u'SAH',
u'songjianghe': u'SJL',
u'songjiangnan': u'IMH',
u'songjiangzhen': u'OZL',
u'songshu': u'SFT',
u'songshuzhen': u'SSL',
u'songtao': u'MZQ',
u'songyuan': u'VYT',
u'songyuanbei': u'OCT',
u'songzi': u'SIN',
u'suide': u'ODY',
u'suifenhe': u'SFB',
u'suihua': u'SHB',
u'suiling': u'SIB',
u'suining': u'NIW',
u'suiping': u'SON',
u'suixi': u'SXZ',
u'suiyang': u'SYB',
u'suizhong': u'SZD',
u'suizhongbei': u'SND',
u'suizhou': u'SZN',
u'sujiatun': u'SXT',
u'suning': u'SYP',
u'sunjia': u'SUB',
u'sunwu': u'SKB',
u'sunzhen': u'OZY',
u'suolun': u'SNT',
u'suotuhan': u'SHX',
u'susong': u'OAH',
u'suzhou': u'SZH',
u'suzhoubei': u'OHH',
u'suzhoudong': u'SRH',
u'suzhouxinqu': u'ITH',
u'suzhouyuanqu': u'KAH',
u'taerqi': u'TVX',
u'taha': u'THX',
u'tahe': u'TXX',
u'taian': u'TID',
u'taigu': u'TGV',
u'taiguxi': u'TIV',
u'taihe': u'THG',
u'taihu': u'TKH',
u'taikang': u'TKX',
u'tailai': u'TLX',
u'taimushan': u'TLS',
u'taining': u'TNS',
u'taipingchuan': u'TIT',
u'taipingzhen': u'TEB',
u'taiqian': u'TTK',
u'taishan': u'TAK',
u'taiyangshan': u'TYJ',
u'taiyangsheng': u'TQT',
u'taiyuan': u'TYV',
u'taiyuanbei': u'TBV',
u'taiyuandong': u'TDV',
u'taiyuannan': u'TNV',
u'taizhou': u'TZH',
u'tancheng': u'TZK',
u'tangbao': u'TBQ',
u'tangchi': u'TCX',
u'tanggu': u'TGP',
u'tanghai': u'THM',
u'tanghe': u'THF',
u'tangjiawan': u'PDQ',
u'tangshan': u'TSP',
u'tangshanbei': u'FUP',
u'tangshancheng': u'TCT',
u'tangwanghe': u'THB',
u'tangxunhu': u'THN',
u'tangyin': u'TYF',
u'tangyuan': u'TYB',
u'tanjiajing': u'TNJ',
u'taocun': u'TCK',
u'taocunbei': u'TOK',
u'taojiatun': u'TOT',
u'taolaizhao': u'TPT',
u'taonan': u'TVT',
u'taoshan': u'TAB',
u'tashizui': u'TIM',
u'tayayi': u'TYP',
u'tengxian': u'TAZ',
u'tengzhou': u'TXK',
u'tengzhoudong': u'TEK',
u'tiandong': u'TDZ',
u'tiandongbei': u'TBZ',
u'tiangang': u'TGL',
u'tianjin': u'TJP',
u'tianjinbei': u'TBP',
u'tianjinnan': u'TIP',
u'tianjinxi': u'TXP',
u'tianlin': u'TFZ',
u'tianmen': u'TMN',
u'tianmennan': u'TNN',
u'tianqiaoling': u'TQL',
u'tianshifu': u'TFT',
u'tianshui': u'TSJ',
u'tianyang': u'TRZ',
u'tianyi': u'TND',
u'tianzhen': u'TZV',
u'tianzhu': u'TZJ',
u'tianzhushan': u'QWH',
u'tiechang': u'TCL',
u'tieli': u'TLB',
u'tieling': u'TLT',
u'tielingxi': u'PXT',
u'tingliang': u'TIZ',
u'tonganyi': u'TAJ',
u'tongbai': u'TBF',
u'tongbei': u'TBB',
u'tongcheng': u'TTH',
u'tongdao': u'TRQ',
u'tonggou': u'TOL',
u'tongguan': u'TGY',
u'tonghai': u'TAM',
u'tonghua': u'THL',
u'tonghuaxian': u'TXL',
u'tongjiang': u'TJB',
u'tongjunzhuang': u'TZP',
u'tongliao': u'TLD',
u'tongling': u'TJH',
u'tonglingbei': u'KXH',
u'tongnan': u'TVW',
u'tongren': u'RDQ',
u'tongrennan': u'TNW',
u'tongtu': u'TUT',
u'tongxiang': u'TCH',
u'tongxin': u'TXJ',
u'tongyuanpu': u'TYT',
u'tongyuanpuxi': u'TST',
u'tongzhouxi': u'TAP',
u'tongzi': u'TZW',
u'tongzilin': u'TEW',
u'tuanjie': u'TIX',
u'tuditangdong': u'TTN',
u'tuguiwula': u'TGC',
u'tuha': u'THR',
u'tuliemaodu': u'TMD',
u'tulihe': u'TEX',
u'tulufan': u'TFR',
u'tulufanbei': u'TAR',
u'tumen': u'TML',
u'tumenbei': u'QSL',
u'tumenzi': u'TCJ',
u'tumuertai': u'TRC',
u'tuoyaoling': u'TIL',
u'tuqiang': u'TQX',
u'tuqiaozi': u'TQJ',
u'tuxi': u'TSW',
u'wafangdian': u'WDT',
u'wafangdianxi': u'WXT',
u'waitoushan': u'WIT',
u'walagan': u'WVX',
u'wanfatun': u'WFB',
u'wanganzhen': u'WVP',
u'wangcang': u'WEW',
u'wangdu': u'WDP',
u'wangfu': u'WUT',
u'wanggang': u'WGB',
u'wangjiawan': u'WJJ',
u'wangjiayingxi': u'KNM',
u'wangou': u'WGL',
u'wangqing': u'WQL',
u'wangtong': u'WTP',
u'wangtuanzhuang': u'WZJ',
u'wangyang': u'WYB',
u'wangzhaotun': u'WZB',
u'wanle': u'WEB',
u'wannian': u'WWG',
u'wanning': u'WNQ',
u'wanyuan': u'WYY',
u'wanzhou': u'WYW',
u'wanzhoubei': u'WZE',
u'wawushan': u'WAH',
u'wayaotian': u'WIM',
u'weidong': u'WVT',
u'weifang': u'WFK',
u'weihai': u'WKK',
u'weihaibei': u'WHK',
u'weihe': u'WHB',
u'weihui': u'WHF',
u'weihulingbei': u'WBL',
u'weijin': u'WJL',
u'weinan': u'WNY',
u'weinanbei': u'WBY',
u'weinannan': u'WVY',
u'weinanzhen': u'WNJ',
u'weiqing': u'WAM',
u'weishanzhuang': u'WSP',
u'weishe': u'WSM',
u'weixing': u'WVB',
u'weizhangzi': u'WKD',
u'weizhuang': u'WZY',
u'weizigou': u'WZL',
u'weizizhen': u'WQP',
u'wenan': u'WBP',
u'wenchang': u'WEQ',
u'wenchun': u'WDB',
u'wendeng': u'WBK',
u'wendengdong': u'WGK',
u'wendi': u'WNZ',
u'wenling': u'VHH',
u'wenshui': u'WEV',
u'wenxi': u'WXV',
u'wenxixi': u'WOV',
u'wenzhou': u'RZH',
u'wenzhounan': u'VRH',
u'woken': u'WQB',
u'wolitun': u'WLX',
u'wopi': u'WPT',
u'wuan': u'WAP',
u'wuchagou': u'WCT',
u'wuchang': u'WCN',
u'wudalianchi': u'WRB',
u'wudangshan': u'WRN',
u'wudaogou': u'WDL',
u'wudaohe': u'WHP',
u'wuerqihan': u'WHX',
u'wufushan': u'WFG',
u'wugong': u'WGY',
u'wuguantian': u'WGM',
u'wuhai': u'WVC',
u'wuhaixi': u'WXC',
u'wuhan': u'WHN',
u'wuhu': u'WHH',
u'wuji': u'WJP',
u'wujia': u'WUB',
u'wujiachuan': u'WCJ',
u'wujiatun': u'WJT',
u'wukeshu': u'WKT',
u'wulanhada': u'WLC',
u'wulanhaote': u'WWT',
u'wulashan': u'WSC',
u'wulateqianqi': u'WQC',
u'wulian': u'WLK',
u'wulong': u'WLW',
u'wulongbei': u'WBT',
u'wulongbeidong': u'WMT',
u'wulongquannan': u'WFN',
u'wulumuqi': u'WAR',
u'wulumuqinan': u'WMR',
u'wunuer': u'WRX',
u'wunvshan': u'WET',
u'wupu': u'WUY',
u'wuqiao': u'WUP',
u'wuqing': u'WWP',
u'wushan': u'WSJ',
u'wusheng': u'WSE',
u'wutaishan': u'WSV',
u'wuwei': u'WUJ',
u'wuweinan': u'WWJ',
u'wuwu': u'WVR',
u'wuxi': u'WXH',
u'wuxiang': u'WVV',
u'wuxidong': u'WGH',
u'wuxixinqu': u'IFH',
u'wuxu': u'WYZ',
u'wuxue': u'WXN',
u'wuyi': u'RYH',
u'wuyibei': u'WDH',
u'wuyiling': u'WPB',
u'wuying': u'WWB',
u'wuyishan': u'WAS',
u'wuyishanbei': u'WBS',
u'wuyishandong': u'WCS',
u'wuyuan': u'WYC',
u'wuzhai': u'WZV',
u'wuzhi': u'WIF',
u'wuzhou': u'WZZ',
u'wuzhounan': u'WBZ',
u'xiabancheng': u'EBP',
u'xiachengzi': u'XCB',
u'xiaguanying': u'XGJ',
u'xiahuayuan': u'XYP',
u'xiajiang': u'EJG',
u'xiamatang': u'XAT',
u'xiamen': u'XMS',
u'xiamenbei': u'XKS',
u'xiamengaoqi': u'XBS',
u'xian': u'XAY',
u'xianbei': u'EAY',
u'xiangcheng': u'ERN',
u'xiangfang': u'XFB',
u'xiangfen': u'XFV',
u'xiangfenxi': u'XTV',
u'xianghe': u'XXB',
u'xianglan': u'XNB',
u'xiangtan': u'XTQ',
u'xiangtanbei': u'EDQ',
u'xiangtang': u'XTG',
u'xiangxiang': u'XXQ',
u'xiangyang': u'XFN',
u'xiangyangdong': u'XWN',
u'xiangyuan': u'EIF',
u'xiangyun': u'EXM',
u'xianlin': u'XPH',
u'xiannan': u'CAY',
u'xianning': u'XNN',
u'xianningbei': u'XRN',
u'xianningdong': u'XKN',
u'xianningnan': u'UNN',
u'xianrenqiao': u'XRL',
u'xiantaoxi': u'XAN',
u'xianyang': u'XYY',
u'xianyangqindu': u'XOY',
u'xianyou': u'XWS',
u'xiaocun': u'XEM',
u'xiaodejiang': u'EJM',
u'xiaodong': u'XOD',
u'xiaogan': u'XGN',
u'xiaoganbei': u'XJN',
u'xiaoheyan': u'XYD',
u'xiaohezhen': u'EKY',
u'xiaojinkou': u'NKQ',
u'xiaolan': u'EAQ',
u'xiaoling': u'XLB',
u'xiaonan': u'XNV',
u'xiaoshao': u'XAM',
u'xiaoshi': u'XST',
u'xiaosigou': u'ESP',
u'xiaoxi': u'XOV',
u'xiaoxianbei': u'QSH',
u'xiaoxinjie': u'XXM',
u'xiaoxizhuang': u'XXP',
u'xiaoyangqi': u'XYX',
u'xiaoyuejiu': u'XFM',
u'xiaoyugu': u'XHM',
u'xiapu': u'XOS',
u'xiashe': u'XSV',
u'xiashi': u'XIZ',
u'xiataizi': u'EIP',
u'xiayixian': u'EJH',
u'xibali': u'XLP',
u'xichang': u'ECW',
u'xichangnan': u'ENW',
u'xidamiao': u'XMP',
u'xide': u'EDW',
u'xiehejian': u'EEP',
u'xiejiazhen': u'XMT',
u'xifeng': u'XFW',
u'xigangzi': u'NBB',
u'xigu': u'XIJ',
u'xigucheng': u'XUJ',
u'xihudong': u'WDQ',
u'xijiekou': u'EKM',
u'xilin': u'XYB',
u'xilinhaote': u'XTC',
u'xiliu': u'GCT',
u'ximashan': u'XMB',
u'xinan': u'EAM',
u'xinanxian': u'XAF',
u'xinbaoan': u'XAP',
u'xinchengzi': u'XCT',
u'xinchuoyuan': u'XRX',
u'xindudong': u'EWW',
u'xinfeng': u'EFG',
u'xingan': u'XAZ',
u'xinganbei': u'XDZ',
u'xingcheng': u'XCD',
u'xingguo': u'EUG',
u'xinghexi': u'XEC',
u'xingkai': u'EKB',
u'xinglongdian': u'XDD',
u'xinglongxian': u'EXP',
u'xinglongzhen': u'XZB',
u'xingning': u'ENQ',
u'xingping': u'XPY',
u'xingquanbu': u'XQJ',
u'xingshu': u'XSB',
u'xingshutun': u'XDT',
u'xingtai': u'XTP',
u'xingtaidong': u'EDP',
u'xingye': u'SNZ',
u'xingyi': u'XRZ',
u'xinhe': u'XIR',
u'xinhua': u'EHQ',
u'xinhuanan': u'EJQ',
u'xinhuang': u'XLQ',
u'xinhuangxi': u'EWQ',
u'xinhuatun': u'XAX',
u'xinhui': u'EFQ',
u'xining': u'XNO',
u'xinji': u'ENP',
u'xinjiang': u'XJM',
u'xinjin': u'IRW',
u'xinjinnan': u'ITW',
u'xinle': u'ELP',
u'xinli': u'XLJ',
u'xinlin': u'XPX',
u'xinlitun': u'XLD',
u'xinlizhen': u'XGT',
u'xinmin': u'XMD',
u'xinpingtian': u'XPM',
u'xinqing': u'XQB',
u'xinqiu': u'XQD',
u'xinsongpu': u'XOB',
u'xinwopu': u'EPD',
u'xinxian': u'XSN',
u'xinxiang': u'XXF',
u'xinxiangdong': u'EGF',
u'xinxingxian': u'XGQ',
u'xinyang': u'XUN',
u'xinyangdong': u'OYN',
u'xinyangzhen': u'XZJ',
u'xinyi': u'EEQ',
u'xinyouyi': u'EYB',
u'xinyu': u'XUG',
u'xinyubei': u'XBG',
u'xinzhangfang': u'XZX',
u'xinzhangzi': u'ERP',
u'xinzhao': u'XZT',
u'xinzhengjichang': u'EZF',
u'xinzhou': u'XXV',
u'xiongyuecheng': u'XYT',
u'xiping': u'XPN',
u'xipu': u'XIW',
u'xipudong': u'XAW',
u'xishui': u'XZN',
u'xiushan': u'ETW',
u'xiuwu': u'XWF',
u'xiuwuxi': u'EXF',
u'xiwuqi': u'XWC',
u'xixia': u'XIF',
u'xixian': u'ENN',
u'xixiang': u'XQY',
u'xixiaozhao': u'XZC',
u'xiyangcun': u'XQF',
u'xizhelimu': u'XRD',
u'xizi': u'XZD',
u'xuancheng': u'ECH',
u'xuangang': u'XGV',
u'xuanhan': u'XHY',
u'xuanhe': u'XWJ',
u'xuanhua': u'XHP',
u'xuanwei': u'XWM',
u'xuanzhong': u'XRP',
u'xuchang': u'XCF',
u'xuchangdong': u'XVF',
u'xujia': u'XJB',
u'xujiatai': u'XTJ',
u'xujiatun': u'XJT',
u'xunyang': u'XUY',
u'xunyangbei': u'XBY',
u'xupu': u'EPQ',
u'xupunan': u'EMQ',
u'xusanwan': u'XSJ',
u'xushui': u'XSP',
u'xuwen': u'XJQ',
u'xuzhou': u'XCH',
u'xuzhoudong': u'UUH',
u'yabuli': u'YBB',
u'yabulinan': u'YWB',
u'yakeshi': u'YKX',
u'yalongwan': u'TWQ',
u'yanan': u'YWY',
u'yancheng': u'YEK',
u'yanchi': u'YKJ',
u'yanchuan': u'YYY',
u'yandangshan': u'YGH',
u'yangang': u'YGW',
u'yangcao': u'YAB',
u'yangcaodi': u'YKM',
u'yangcha': u'YAL',
u'yangchang': u'YED',
u'yangcheng': u'YNF',
u'yangchenghu': u'AIH',
u'yangchun': u'YQQ',
u'yangcun': u'YBP',
u'yanggang': u'YRB',
u'yanggao': u'YOV',
u'yanggu': u'YIK',
u'yanghe': u'GTH',
u'yangjiuhe': u'YHM',
u'yanglin': u'YLM',
u'yangling': u'YSY',
u'yanglingnan': u'YEY',
u'yangliuqing': u'YQP',
u'yangmingbu': u'YVV',
u'yangpingguan': u'YAY',
u'yangpu': u'ABM',
u'yangqu': u'YQV',
u'yangquan': u'AQP',
u'yangquanbei': u'YPP',
u'yangquanqu': u'YYV',
u'yangshuling': u'YAD',
u'yangshuo': u'YCZ',
u'yangweishao': u'YWM',
u'yangxin': u'YVK',
u'yangyi': u'ARP',
u'yangzhangzi': u'YZD',
u'yangzhewo': u'AEM',
u'yangzhou': u'YLH',
u'yanhecheng': u'YHP',
u'yanhui': u'AEP',
u'yanji': u'YJL',
u'yanjiao': u'AJP',
u'yanjiazhuang': u'AZK',
u'yanjin': u'AEW',
u'yanjixi': u'YXL',
u'yanliang': u'YNY',
u'yanling': u'YAG',
u'yanqi': u'YSR',
u'yanqing': u'YNP',
u'yanshan': u'AOP',
u'yanshi': u'YSF',
u'yantai': u'YAK',
u'yantainan': u'YLK',
u'yantongshan': u'YSL',
u'yantongtun': u'YUX',
u'yanzhou': u'YZK',
u'yanzibian': u'YZY',
u'yaoan': u'YAC',
u'yaojia': u'YAT',
u'yaoqianhutun': u'YQT',
u'yaoshang': u'ASP',
u'yatunpu': u'YTZ',
u'yayuan': u'YYL',
u'yazhou': u'YUQ',
u'yebaishou': u'YBD',
u'yecheng': u'YER',
u'yesanpo': u'AIP',
u'yian': u'YAX',
u'yibin': u'YBW',
u'yichang': u'YCN',
u'yichangdong': u'HAN',
u'yicheng': u'YIN',
u'yichun': u'YCB',
u'yichunxi': u'YCG',
u'yiershi': u'YET',
u'yijiang': u'RVH',
u'yijianpu': u'YJT',
u'yilaha': u'YLX',
u'yiliang': u'ALW',
u'yiliangbei': u'YSM',
u'yilin': u'YLB',
u'yima': u'YMF',
u'yimianpo': u'YPB',
u'yimianshan': u'YST',
u'yimin': u'YMX',
u'yinai': u'YVM',
u'yinan': u'YNK',
u'yinchuan': u'YIJ',
u'yindi': u'YDM',
u'yingbinlu': u'YFW',
u'yingcheng': u'YHN',
u'yingchengzi': u'YCT',
u'yingchun': u'YYB',
u'yingde': u'YDQ',
u'yingdexi': u'IIQ',
u'yingjie': u'YAM',
u'yingjisha': u'YIR',
u'yingkou': u'YKT',
u'yingkoudong': u'YGT',
u'yingpanshui': u'YZJ',
u'yingshan': u'NUW',
u'yingshouyingzi': u'YIP',
u'yingtan': u'YTG',
u'yingtanbei': u'YKG',
u'yingxian': u'YZV',
u'yining': u'YMR',
u'yiningdong': u'YNR',
u'yinlang': u'YJX',
u'yinping': u'KPQ',
u'yintan': u'CTQ',
u'yishui': u'YUK',
u'yitulihe': u'YEX',
u'yiwu': u'YWH',
u'yixian': u'YXD',
u'yixing': u'YUH',
u'yiyang': u'YIG',
u'yizheng': u'UZH',
u'yizhou': u'YSZ',
u'yizi': u'YQM',
u'yongan': u'YAS',
u'yonganxiang': u'YNB',
u'yongchengbei': u'RGH',
u'yongchuan': u'YCW',
u'yongchuandong': u'WMW',
u'yongdeng': u'YDJ',
u'yongding': u'YGS',
u'yongfengying': u'YYM',
u'yongfunan': u'YBZ',
u'yongji': u'YIV',
u'yongjia': u'URH',
u'yongjibei': u'AJV',
u'yongkang': u'RFH',
u'yongkangnan': u'QUH',
u'yonglang': u'YLW',
u'yongledian': u'YDY',
u'yongshou': u'ASY',
u'yongtai': u'YTS',
u'yongxiu': u'ACG',
u'yongzhou': u'AOQ',
u'youhao': u'YOB',
u'youxi': u'YXS',
u'youxian': u'YOG',
u'youxiannan': u'YXG',
u'youyang': u'AFW',
u'yuanbaoshan': u'YUD',
u'yuandun': u'YAJ',
u'yuanmou': u'YMM',
u'yuanping': u'YPV',
u'yuanqian': u'AQK',
u'yuanshi': u'YSP',
u'yuantan': u'YTQ',
u'yuanyangzhen': u'YYJ',
u'yucheng': u'YCK',
u'yuchengxian': u'IXH',
u'yuci': u'YCV',
u'yudu': u'YDG',
u'yuechi': u'AWW',
u'yuejiajing': u'YGJ',
u'yueliangtian': u'YUM',
u'yueqing': u'UPH',
u'yueshan': u'YBF',
u'yuexi': u'YHW',
u'yueyang': u'YYQ',
u'yueyangdong': u'YIQ',
u'yuge': u'VTM',
u'yuhang': u'EVH',
u'yujiang': u'YHG',
u'yujiapu': u'YKP',
u'yuliangpu': u'YLD',
u'yulin': u'YLZ',
u'yumen': u'YXJ',
u'yunan': u'YKQ',
u'yuncailing': u'ACP',
u'yuncheng': u'YPK',
u'yunchengbei': u'ABV',
u'yundonghai': u'NAQ',
u'yunfudong': u'IXQ',
u'yunjusi': u'AFP',
u'yunlianghe': u'YEF',
u'yunmeng': u'YMN',
u'yunshan': u'KZQ',
u'yunxiao': u'YBS',
u'yuping': u'YZW',
u'yuquan': u'YQB',
u'yushan': u'YNG',
u'yushannan': u'YGG',
u'yushe': u'AUM',
u'yushi': u'YSJ',
u'yushu': u'YRT',
u'yushugou': u'YGP',
u'yushutai': u'YUT',
u'yushutun': u'YSX',
u'yutianxian': u'ATP',
u'yuxi': u'YXM',
u'yuyao': u'YYH',
u'yuyaobei': u'CTH',
u'zaolin': u'ZIV',
u'zaoqiang': u'ZVP',
u'zaoyang': u'ZYN',
u'zaozhuang': u'ZEK',
u'zaozhuangdong': u'ZNK',
u'zaozhuangxi': u'ZFK',
u'zengjiapingzi': u'ZBW',
u'zengkou': u'ZKE',
u'zepu': u'ZPR',
u'zerunli': u'ZLM',
u'zhalainuoerxi': u'ZXX',
u'zhalantun': u'ZTX',
u'zhalute': u'ZLD',
u'zhangbaiwan': u'ZUP',
u'zhangdang': u'ZHT',
u'zhanggutai': u'ZGD',
u'zhangjiajie': u'DIQ',
u'zhangjiakou': u'ZKP',
u'zhangjiakounan': u'ZMP',
u'zhanglan': u'ZLV',
u'zhangmutou': u'ZOQ',
u'zhangmutoudong': u'ZRQ',
u'zhangping': u'ZPS',
u'zhangpu': u'ZCS',
u'zhangqiao': u'ZQY',
u'zhangqiu': u'ZTK',
u'zhangshu': u'ZSG',
u'zhangshudong': u'ZOG',
u'zhangweitun': u'ZWB',
u'zhangwu': u'ZWD',
u'zhangxin': u'ZIP',
u'zhangye': u'ZYJ',
u'zhangyexi': u'ZEJ',
u'zhangzhou': u'ZUS',
u'zhangzhoudong': u'GOS',
u'zhanjiang': u'ZJZ',
u'zhanjiangxi': u'ZWQ',
u'zhaoan': u'ZDS',
u'zhaobai': u'ZBP',
u'zhaocheng': u'ZCV',
u'zhaodong': u'ZDB',
u'zhaofupu': u'ZFM',
u'zhaoguang': u'ZGB',
u'zhaohua': u'ZHW',
u'zhaoqing': u'ZVQ',
u'zhaoqingdong': u'FCQ',
u'zhaotong': u'ZDW',
u'zhashui': u'ZSY',
u'zhazi': u'ZAL',
u'zhelimu': u'ZLC',
u'zhenan': u'ZEY',
u'zhenchengdi': u'ZDV',
u'zhengding': u'ZDP',
u'zhengdingjichang': u'ZHP',
u'zhengxiangbaiqi': u'ZXC',
u'zhengzhou': u'ZZF',
u'zhengzhoudong': u'ZAF',
u'zhengzhouxi': u'XPF',
u'zhenjiang': u'ZJH',
u'zhenjiangnan': u'ZEH',
u'zhenlai': u'ZLT',
u'zhenping': u'ZPF',
u'zhenxi': u'ZVT',
u'zhenyuan': u'ZUW',
u'zhian': u'ZAD',
u'zhicheng': u'ZCN',
u'zhifangdong': u'ZMN',
u'zhijiang': u'ZPQ',
u'zhijiangbei': u'ZIN',
u'zhijin': u'IZW',
u'zhijinbei': u'ZJE',
u'zhongchuanjichang': u'ZJJ',
u'zhonghe': u'ZHX',
u'zhonghuamen': u'VNH',
u'zhongjiacun': u'ZJY',
u'zhongkai': u'KKQ',
u'zhongmu': u'ZGF',
u'zhongning': u'VNJ',
u'zhongningdong': u'ZDJ',
u'zhongningnan': u'ZNJ',
u'zhongshan': u'ZSZ',
u'zhongshanbei': u'ZGQ',
u'zhongshanxi': u'ZAZ',
u'zhongwei': u'ZWJ',
u'zhongxiang': u'ZTN',
u'zhongzhai': u'ZZM',
u'zhoujia': u'ZOB',
u'zhoujiatun': u'ZOD',
u'zhoukou': u'ZKN',
u'zhoushuizi': u'ZIT',
u'zhuanghebei': u'ZUT',
u'zhuangqiao': u'ZQH',
u'zhuangzhi': u'ZUX',
u'zhucheng': u'ZQK',
u'zhuhai': u'ZHQ',
u'zhuhaibei': u'ZIQ',
u'zhuji': u'ZDH',
u'zhujiagou': u'ZUB',
u'zhujiawan': u'CWJ',
u'zhujiayao': u'ZUJ',
u'zhumadian': u'ZDN',
u'zhumadianxi': u'ZLN',
u'zhuozhou': u'ZXP',
u'zhuozhoudong': u'ZAP',
u'zhuozidong': u'ZDC',
u'zhuozishan': u'ZZC',
u'zhurihe': u'ZRC',
u'zhuwo': u'ZOP',
u'zhuyangxi': u'ZXW',
u'zhuyuanba': u'ZAW',
u'zhuzhou': u'ZZQ',
u'zhuzhouxi': u'ZAQ',
u'zibo': u'ZBK',
u'zichang': u'ZHY',
u'zigong': u'ZGW',
u'zijingguan': u'ZYP',
u'zixi': u'ZXS',
u'ziyang': u'ZVY',
u'ziyangbei': u'FYW',
u'zizhong': u'ZZW',
u'zizhongbei': u'WZW',
u'zizhou': u'ZZY',
u'zongxi': u'ZOY',
u'zoucheng': u'ZIK',
u'zunyi': u'ZIW',
u'zuoling': u'ZSN'}
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: anchen
# @Date: 2016-10-05 17:13:40
# @Last Modified by: anchen
# @Last Modified time: 2016-10-05 17:47:26
from prettytable import PrettyTable
class TrainCollection(object):
# 显示车次、出发/到达站、 出发/到达时间、历时、一等坐、二等坐、软卧、硬卧、硬座
header = 'train station time duration first second softsleep hardsleep hardsit'.split()
def __init__(self, rows):
self.rows = rows
def _get_duration(self, row):
"""
获取车次运行时间
"""
duration = row.get('lishi').replace(':', 'h') + 'm'
if duration.startswith('00'):
return duration[4:]
if duration.startswith('0'):
return duration[1:]
return duration
@property
def trains(self):
for row in self.rows:
row = row[u'queryLeftNewDTO']
train = [
# 车次
row[u'station_train_code'],
# 出发、到达站
'\n'.join([row[u'from_station_name'], row[u'to_station_name']]),
# 出发、到达时间
'\n'.join([row[u'start_time'], row[u'arrive_time']]),
# 历时
self._get_duration(row),
# 一等坐
row[u'zy_num'],
# 二等坐
row[u'ze_num'],
# 软卧
row[u'rw_num'],
# 软坐
row[u'yw_num'],
# 硬坐
row[u'yz_num']
]
yield train
def pretty_print(self):
"""
数据已经获取到了,剩下的就是提取我们要的信息并将它显示出来。
`prettytable`这个库可以让我们它像MySQL数据库那样格式化显示数据。
"""
pt = PrettyTable()
# 设置每一列的标题
pt._set_field_names(self.header)
for train in self.trains:
pt.add_row(train)
print(pt)
"""Pythonic command-line interface parser that will make you smile.
* http://docopt.org
* Repository and issue-tracker: https://github.com/docopt/docopt
* Licensed under terms of MIT license (see LICENSE-MIT)
* Copyright (c) 2013 Vladimir Keleshev, [email protected]
"""
import sys
import re
__all__ = ['docopt']
__version__ = '0.6.2'
class DocoptLanguageError(Exception):
"""Error in construction of usage-message by developer."""
class DocoptExit(SystemExit):
"""Exit in case user invoked program with incorrect arguments."""
usage = ''
def __init__(self, message=''):
SystemExit.__init__(self, (message + '\n' + self.usage).strip())
class Pattern(object):
def __eq__(self, other):
return repr(self) == repr(other)
def __hash__(self):
return hash(repr(self))
def fix(self):
self.fix_identities()
self.fix_repeating_arguments()
return self
def fix_identities(self, uniq=None):
"""Make pattern-tree tips point to same object if they are equal."""
if not hasattr(self, 'children'):
return self
uniq = list(set(self.flat())) if uniq is None else uniq
for i, c in enumerate(self.children):
if not hasattr(c, 'children'):
assert c in uniq
self.children[i] = uniq[uniq.index(c)]
else:
c.fix_identities(uniq)
def fix_repeating_arguments(self):
"""Fix elements that should accumulate/increment values."""
either = [list(c.children) for c in self.either.children]
for case in either:
for e in [c for c in case if case.count(c) > 1]:
if type(e) is Argument or type(e) is Option and e.argcount:
if e.value is None:
e.value = []
elif type(e.value) is not list:
e.value = e.value.split()
if type(e) is Command or type(e) is Option and e.argcount == 0:
e.value = 0
return self
@property
def either(self):
"""Transform pattern into an equivalent, with only top-level Either."""
# Currently the pattern will not be equivalent, but more "narrow",
# although good enough to reason about list arguments.
ret = []
groups = [[self]]
while groups:
children = groups.pop(0)
types = [type(c) for c in children]
if Either in types:
either = [c for c in children if type(c) is Either][0]
children.pop(children.index(either))
for c in either.children:
groups.append([c] + children)
elif Required in types:
required = [c for c in children if type(c) is Required][0]
children.pop(children.index(required))
groups.append(list(required.children) + children)
elif Optional in types:
optional = [c for c in children if type(c) is Optional][0]
children.pop(children.index(optional))
groups.append(list(optional.children) + children)
elif AnyOptions in types:
optional = [c for c in children if type(c) is AnyOptions][0]
children.pop(children.index(optional))
groups.append(list(optional.children) + children)
elif OneOrMore in types:
oneormore = [c for c in children if type(c) is OneOrMore][0]
children.pop(children.index(oneormore))
groups.append(list(oneormore.children) * 2 + children)
else:
ret.append(children)
return Either(*[Required(*e) for e in ret])
class ChildPattern(Pattern):
def __init__(self, name, value=None):
self.name = name
self.value = value
def __repr__(self):
return '%s(%r, %r)' % (self.__class__.__name__, self.name, self.value)
def flat(self, *types):
return [self] if not types or type(self) in types else []
def match(self, left, collected=None):
collected = [] if collected is None else collected
pos, match = self.single_match(left)
if match is None:
return False, left, collected
left_ = left[:pos] + left[pos + 1:]
same_name = [a for a in collected if a.name == self.name]
if type(self.value) in (int, list):
if type(self.value) is int:
increment = 1
else:
increment = ([match.value] if type(match.value) is str
else match.value)
if not same_name:
match.value = increment
return True, left_, collected + [match]
same_name[0].value += increment
return True, left_, collected
return True, left_, collected + [match]
class ParentPattern(Pattern):
def __init__(self, *children):
self.children = list(children)
def __repr__(self):
return '%s(%s)' % (self.__class__.__name__,
', '.join(repr(a) for a in self.children))
def flat(self, *types):
if type(self) in types:
return [self]
return sum([c.flat(*types) for c in self.children], [])
class Argument(ChildPattern):
def single_match(self, left):
for n, p in enumerate(left):
if type(p) is Argument:
return n, Argument(self.name, p.value)
return None, None
@classmethod
def parse(class_, source):
name = re.findall('(<\S*?>)', source)[0]
value = re.findall('\[default: (.*)\]', source, flags=re.I)
return class_(name, value[0] if value else None)
class Command(Argument):
def __init__(self, name, value=False):
self.name = name
self.value = value
def single_match(self, left):
for n, p in enumerate(left):
if type(p) is Argument:
if p.value == self.name:
return n, Command(self.name, True)
else:
break
return None, None
class Option(ChildPattern):
def __init__(self, short=None, long=None, argcount=0, value=False):
assert argcount in (0, 1)
self.short, self.long = short, long
self.argcount, self.value = argcount, value
self.value = None if value is False and argcount else value
@classmethod
def parse(class_, option_description):
short, long, argcount, value = None, None, 0, False
options, _, description = option_description.strip().partition(' ')
options = options.replace(',', ' ').replace('=', ' ')
for s in options.split():
if s.startswith('--'):
long = s
elif s.startswith('-'):
short = s
else:
argcount = 1
if argcount:
matched = re.findall('\[default: (.*)\]', description, flags=re.I)
value = matched[0] if matched else None
return class_(short, long, argcount, value)
def single_match(self, left):
for n, p in enumerate(left):
if self.name == p.name:
return n, p
return None, None
@property
def name(self):
return self.long or self.short
def __repr__(self):
return 'Option(%r, %r, %r, %r)' % (self.short, self.long,
self.argcount, self.value)
class Required(ParentPattern):
def match(self, left, collected=None):
collected = [] if collected is None else collected
l = left
c = collected
for p in self.children:
matched, l, c = p.match(l, c)
if not matched:
return False, left, collected
return True, l, c
class Optional(ParentPattern):
def match(self, left, collected=None):
collected = [] if collected is None else collected
for p in self.children:
m, left, collected = p.match(left, collected)
return True, left, collected
class AnyOptions(Optional):
"""Marker/placeholder for [options] shortcut."""
class OneOrMore(ParentPattern):
def match(self, left, collected=None):
assert len(self.children) == 1
collected = [] if collected is None else collected
l = left
c = collected
l_ = None
matched = True
times = 0
while matched:
# could it be that something didn't match but changed l or c?
matched, l, c = self.children[0].match(l, c)
times += 1 if matched else 0
if l_ == l:
break
l_ = l
if times >= 1:
return True, l, c
return False, left, collected
class Either(ParentPattern):
def match(self, left, collected=None):
collected = [] if collected is None else collected
outcomes = []
for p in self.children:
matched, _, _ = outcome = p.match(left, collected)
if matched:
outcomes.append(outcome)
if outcomes:
return min(outcomes, key=lambda outcome: len(outcome[1]))
return False, left, collected
class TokenStream(list):
def __init__(self, source, error):
self += source.split() if hasattr(source, 'split') else source
self.error = error
def move(self):
return self.pop(0) if len(self) else None
def current(self):
return self[0] if len(self) else None
def parse_long(tokens, options):
"""long ::= '--' chars [ ( ' ' | '=' ) chars ] ;"""
long, eq, value = tokens.move().partition('=')
assert long.startswith('--')
value = None if eq == value == '' else value
similar = [o for o in options if o.long == long]
if tokens.error is DocoptExit and similar == []: # if no exact match
similar = [o for o in options if o.long and o.long.startswith(long)]
if len(similar) > 1: # might be simply specified ambiguously 2+ times?
raise tokens.error('%s is not a unique prefix: %s?' %
(long, ', '.join(o.long for o in similar)))
elif len(similar) < 1:
argcount = 1 if eq == '=' else 0
o = Option(None, long, argcount)
options.append(o)
if tokens.error is DocoptExit:
o = Option(None, long, argcount, value if argcount else True)
else:
o = Option(similar[0].short, similar[0].long,
similar[0].argcount, similar[0].value)
if o.argcount == 0:
if value is not None:
raise tokens.error('%s must not have an argument' % o.long)
else:
if value is None:
if tokens.current() is None:
raise tokens.error('%s requires argument' % o.long)
value = tokens.move()
if tokens.error is DocoptExit:
o.value = value if value is not None else True
return [o]
def parse_shorts(tokens, options):
"""shorts ::= '-' ( chars )* [ [ ' ' ] chars ] ;"""
token = tokens.move()
assert token.startswith('-') and not token.startswith('--')
left = token.lstrip('-')
parsed = []
while left != '':
short, left = '-' + left[0], left[1:]
similar = [o for o in options if o.short == short]
if len(similar) > 1:
raise tokens.error('%s is specified ambiguously %d times' %
(short, len(similar)))
elif len(similar) < 1:
o = Option(short, None, 0)
options.append(o)
if tokens.error is DocoptExit:
o = Option(short, None, 0, True)
else: # why copying is necessary here?
o = Option(short, similar[0].long,
similar[0].argcount, similar[0].value)
value = None
if o.argcount != 0:
if left == '':
if tokens.current() is None:
raise tokens.error('%s requires argument' % short)
value = tokens.move()
else:
value = left
left = ''
if tokens.error is DocoptExit:
o.value = value if value is not None else True
parsed.append(o)
return parsed
def parse_pattern(source, options):
tokens = TokenStream(re.sub(r'([\[\]\(\)\|]|\.\.\.)', r' \1 ', source),
DocoptLanguageError)
result = parse_expr(tokens, options)
if tokens.current() is not None:
raise tokens.error('unexpected ending: %r' % ' '.join(tokens))
return Required(*result)
def parse_expr(tokens, options):
"""expr ::= seq ( '|' seq )* ;"""
seq = parse_seq(tokens, options)
if tokens.current() != '|':
return seq
result = [Required(*seq)] if len(seq) > 1 else seq
while tokens.current() == '|':
tokens.move()
seq = parse_seq(tokens, options)
result += [Required(*seq)] if len(seq) > 1 else seq
return [Either(*result)] if len(result) > 1 else result
def parse_seq(tokens, options):
"""seq ::= ( atom [ '...' ] )* ;"""
result = []
while tokens.current() not in [None, ']', ')', '|']:
atom = parse_atom(tokens, options)
if tokens.current() == '...':
atom = [OneOrMore(*atom)]
tokens.move()
result += atom
return result
def parse_atom(tokens, options):
"""atom ::= '(' expr ')' | '[' expr ']' | 'options'
| long | shorts | argument | command ;
"""
token = tokens.current()
result = []
if token in '([':
tokens.move()
matching, pattern = {'(': [')', Required], '[': [']', Optional]}[token]
result = pattern(*parse_expr(tokens, options))
if tokens.move() != matching:
raise tokens.error("unmatched '%s'" % token)
return [result]
elif token == 'options':
tokens.move()
return [AnyOptions()]
elif token.startswith('--') and token != '--':
return parse_long(tokens, options)
elif token.startswith('-') and token not in ('-', '--'):
return parse_shorts(tokens, options)
elif token.startswith('<') and token.endswith('>') or token.isupper():
return [Argument(tokens.move())]
else:
return [Command(tokens.move())]
def parse_argv(tokens, options, options_first=False):
"""Parse command-line argument vector.
If options_first:
argv ::= [ long | shorts ]* [ argument ]* [ '--' [ argument ]* ] ;
else:
argv ::= [ long | shorts | argument ]* [ '--' [ argument ]* ] ;
"""
parsed = []
while tokens.current() is not None:
if tokens.current() == '--':
return parsed + [Argument(None, v) for v in tokens]
elif tokens.current().startswith('--'):
parsed += parse_long(tokens, options)
elif tokens.current().startswith('-') and tokens.current() != '-':
parsed += parse_shorts(tokens, options)
elif options_first:
return parsed + [Argument(None, v) for v in tokens]
else:
parsed.append(Argument(None, tokens.move()))
return parsed
def parse_defaults(doc):
# in python < 2.7 you can't pass flags=re.MULTILINE
split = re.split('\n *(<\S+?>|-\S+?)', doc)[1:]
split = [s1 + s2 for s1, s2 in zip(split[::2], split[1::2])]
options = [Option.parse(s) for s in split if s.startswith('-')]
#arguments = [Argument.parse(s) for s in split if s.startswith('<')]
#return options, arguments
return options
def printable_usage(doc):
# in python < 2.7 you can't pass flags=re.IGNORECASE
usage_split = re.split(r'([Uu][Ss][Aa][Gg][Ee]:)', doc)
if len(usage_split) < 3:
raise DocoptLanguageError('"usage:" (case-insensitive) not found.')
if len(usage_split) > 3:
raise DocoptLanguageError('More than one "usage:" (case-insensitive).')
return re.split(r'\n\s*\n', ''.join(usage_split[1:]))[0].strip()
def formal_usage(printable_usage):
pu = printable_usage.split()[1:] # split and drop "usage:"
return '( ' + ' '.join(') | (' if s == pu[0] else s for s in pu[1:]) + ' )'
def extras(help, version, options, doc):
if help and any((o.name in ('-h', '--help')) and o.value for o in options):
print(doc.strip("\n"))
sys.exit()
if version and any(o.name == '--version' and o.value for o in options):
print(version)
sys.exit()
class Dict(dict):
def __repr__(self):
return '{%s}' % ',\n '.join('%r: %r' % i for i in sorted(self.items()))
def docopt(doc, argv=None, help=True, version=None, options_first=False):
"""Parse `argv` based on command-line interface described in `doc`.
`docopt` creates your command-line interface based on its
description that you pass as `doc`. Such description can contain
--options, , commands, which could be
[optional], (required), (mutually | exclusive) or repeated...
Parameters
----------
doc : str
Description of your command-line interface.
argv : list of str, optional
Argument vector to be parsed. sys.argv[1:] is used if not
provided.
help : bool (default: True)
Set to False to disable automatic help on -h or --help
options.
version : any object
If passed, the object will be printed if --version is in
`argv`.
options_first : bool (default: False)
Set to True to require options preceed positional arguments,
i.e. to forbid options and positional arguments intermix.
Returns
-------
args : dict
A dictionary, where keys are names of command-line elements
such as e.g. "--verbose" and "", and values are the
parsed values of those elements.
Example
-------
>>> from docopt import docopt
>>> doc = '''
Usage:
my_program tcp [--timeout=]
my_program serial [--baud=] [--timeout=]
my_program (-h | --help | --version)
Options:
-h, --help Show this screen and exit.
--baud= Baudrate [default: 9600]
'''
>>> argv = ['tcp', '127.0.0.1', '80', '--timeout', '30']
>>> docopt(doc, argv)
{'--baud': '9600',
'--help': False,
'--timeout': '30',
'--version': False,
'': '127.0.0.1',
'': '80',
'serial': False,
'tcp': True}
See also
--------
* For video introduction see http://docopt.org
* Full documentation is available in README.rst as well as online
at https://github.com/docopt/docopt#readme
"""
if argv is None:
argv = sys.argv[1:]
DocoptExit.usage = printable_usage(doc) # 查找 usage: 检查是否只有一个(正则表达式) , 结果为: Usage : xxx
options = parse_defaults(doc) # 利用 Option 对象 解析 成不同部分
pattern = parse_pattern(formal_usage(DocoptExit.usage), options)
# [default] syntax for argument is disabled
#for a in pattern.flat(Argument):
# same_name = [d for d in arguments if d.name == a.name]
# if same_name:
# a.value = same_name[0].value
argv = parse_argv(TokenStream(argv, DocoptExit), list(options),
options_first)
pattern_options = set(pattern.flat(Option))
for ao in pattern.flat(AnyOptions):
doc_options = parse_defaults(doc)
ao.children = list(set(doc_options) - pattern_options)
#if any_options:
# ao.children += [Option(o.short, o.long, o.argcount)
# for o in argv if type(o) is Option]
extras(help, version, argv, doc)
matched, left, collected = pattern.fix().match(argv)
if matched and left == []: # better error message if left?
return Dict((a.name, a.value) for a in (pattern.flat() + collected))
raise DocoptExit()