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

问题来源于@明月清疯 的

悬赏贴

后进一步修改完善,作为一个小工具公开发布吧

程序使用Python编写,Python版本3

数据库已更新至2022年度库

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

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

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

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

本程序支持通配符查询,%代表任意数量的任意字符,_代表一个任意字符。
查询优先级:通配符查询>行政区划编码>行政区划名称全称
如果没有通配符,则进入行政区划编码查询;如果行政区划编码不符合正则规则或行政区划编码查询结果为空,进入行政区划名称查询。

如果我的程序能给您带来协助,请记得在页面下方的评分处为我评上热心值和吾爱币哦,评分不会消耗自己的积分

蓝奏云下载(密码:ei6j) 百度云下载(密码:52pj)

通过蓝奏云下载的数据库文件,请务必删除数字,确保数据库文件名为xzqh.db

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

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

# -*-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: 繁华中的沉寂
")
print("本程序支持通配符查询,%代表任意数量的任意字符,_代表一个任意字符。")
print("查询优先级:通配符查询>行政区划编码>行政区划名称
")

if not os.path.isfile("xzqh.db"):
    print("没有找到行政区划数据库文件,请先在同目录放置xzqh.db文件再运行本程序
请按任意键退出...")
    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}	{1:<012}".format(row[1], row[2]))
            print()
        else:
            print("他没有下级行政区划
")
    else:
        print("无法查询到您的输入对应的行政区划信息,请检查后重试
")
        continue
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 共48条

请登录后发表评论

    暂无评论内容