行政区划双向查询工具【已更新至2022年度库】

1次阅读
没有评论

问题来源于@明月清疯悬赏贴
后进一步修改完善,作为一个小工具公开发布吧
程序使用Python编写,Python版本3

数据库已更新至2022年度库

考虑到完整的全国行政区划数据过于庞大,用字典来实现显然过于繁琐,故采用Sqlite3数据库,通过SQL语句查询,可操作和可拓展性更强

可根据需要搭配3级或5级版本,将对应数据库db文件放置在与py文件或编译好的exe文件同一目录下即可
3级行政区划数据库较小,仅3000多行数据,大小124KB
5级行政区划数据库较大,有66万余行数据,大小34MB
数据库更新截止到2022年10月31日,为2022年年度数据库,此数据一般每年更新一次,数据来源国家统计局,如数据库后续有更新,将会同步更新此项目

如需修改数据库,使用Navicat等工具即可进行修改

本工具支持通过行政区划名称 和 行政区划代码查询,查询下级行政区划,同时显示他的所有上级行政区划
通过行政区划名称查询时,可只输入前面的字,例如杭州市可以输入杭州,但如果前面的字有重复,将列出多个结果,遇到重复请写全,或根据列出的编码,再通过编码查询
通过行政区划代码查询时,只需输入需要查询的级别的代码,例如33为浙江省,如果输入3300,则查询不到结果

本程序支持通配符查询,%代表任意数量的任意字符,_代表一个任意字符。
查询优先级:通配符查询>行政区划编码>行政区划名称全称
如果没有通配符,则进入行政区划编码查询;如果行政区划编码不符合正则规则或行政区划编码查询结果为空,进入行政区划名称查询。
如果我的程序能给您带来帮助,请记得在页面下方的评分处为我评上热心值和116博客币哦,评分不会消耗自己的积分
蓝奏云下载(密码:ei6j) 百度云下载(密码:52pj)
通过蓝奏云下载的数据库文件,请务必删除数字,确保数据库文件名为xzqh.db

[Python] 纯文本查看 复制代码

# -*-coding:utf-8-*-
import os.path
import re
import sqlite3
from os import system

def get_tree(m_cursor, father_value, m_name):
m_tree = [m_name]
f_value = father_value
while f_value != "0":
f_rows = m_cursor.execute("SELECT * FROM xzqh WHERE value='{0}'".format(f_value)).fetchall()
m_tree.insert(0, f_rows[0][1])
f_value = f_rows[0][3]
return m_tree

system("title 行政区划双向查询工具[52Pojie] By: 繁华中的沉寂")
print("行政区划双向查询工具[52Pojie] By: 繁华中的沉寂\r\n")
print("本程序支持通配符查询,%代表任意数量的任意字符,_代表一个任意字符。")
print("查询优先级:通配符查询>行政区划编码>行政区划名称\r\n")
if not os.path.isfile("xzqh.db"):
print("没有找到行政区划数据库文件,请先在同目录放置xzqh.db文件再运行本程序\r\n请按任意键退出...")
system("pause>nul")
exit()
db = sqlite3.connect("xzqh.db")
cursorObj = db.cursor()
while True:
in_val = input("输入行政区划名称 或 行政区划代码(输入[0]退出) >> ")
if in_val == "0":
exit()
elif in_val is None or in_val == "":
continue
print()
# 是否存在通配符,如有,则按名称搜索
if in_val.find("%") != -1 or in_val.find("_") != -1:
rows = cursorObj.execute("SELECT * FROM xzqh WHERE name LIKE '{0}'".format(in_val)).fetchall()
else:
# 通过正则表达式对行政区划代码进行检查,如果与行政区划代码编码规则一致,优先查询行政区划编码
pattern = re.compile(r"([1-9][0-9]){1}([0-9]{2}){0,2}([0-9]{3}){0,2}$")
rows = None
if pattern.match(in_val):
rows = cursorObj.execute("SELECT * FROM xzqh WHERE value='{0}'".format(in_val)).fetchall()
if rows is None or not rows:
rows = cursorObj.execute("SELECT * FROM xzqh WHERE name LIKE '{0}'".format(in_val)).fetchall()
if rows:
if len(rows) > 1:
print("查询到多个结果,请根据以下信息重新查询吧~")
for i in range(0, len(rows)):
print("{0}[{1}]".format(
">".join(get_tree(cursorObj, rows[i][3], rows[i][1]))
, rows[i][2]
))
print()
continue
n_name = rows[0][1] # 行政区划名称
level = rows[0][4] # 行政区划级别
value = rows[0][2] # 行政区划代码
tree = get_tree(cursorObj, rows[0][3], n_name)
print("{0}[{1:<012}],这是一个{2}级行政区划地区".format(">".join(tree), value, level))
ll_rows = cursorObj.execute("SELECT * FROM xzqh WHERE father_value='{0}'".format(value)).fetchall()
if ll_rows:
for row in ll_rows:
print("{0}\t{1:<012}".format(row[1], row[2]))
print()
else:
print("他没有下级行政区划\r\n")
else:
print("无法查询到您的输入对应的行政区划信息,请检查后重试\r\n")
continue

正文完
 0
116博客
版权声明:本篇文章由 116博客 于2024-11-28发表,共计2633字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码