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

原贴链接

https://bbs.songma.com/thread-1723615-1-1.html

本次更新内容
1.下级行政区划根据文本长度进行空格填充,确保排版对齐。
2.添加城乡分类代码,并标注对应的中文含义。注意:仅5级行政区划有城乡分类代码
3.更新行政区划代码库至2023年度库。
4.去除了行政区划代码补全12位的功能。
5.提供Mac版本。

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

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

可根据需要搭配3级或5级版本,将对应数据库db文件放置在与py文件或编译好的exe文件同一目录下即可
3级行政区划数据库较小,3,353行数据,大小127KB
5级行政区划数据库较大,有662,893行数据,大小37MB
数据库更新截止到2023年6月30日,为2023年年度数据库,此数据一般每年更新一次,数据来源国家统计局,如数据库后续有更新,将会同步更新此项目。
本程序采用本地Sqlite3数据库查询,且代码公开,不具备联网功能,也无需另外安装数据库软件。
温馨提示:本数据库来源于国家统计局公布的最新数据,作者整理免费提供,不保证数据准确性,如用于重大用途,请酌情思考,或自行对数据库进行检查。

许可协议:本作品采用

CC BY-NC-SA 4.0(

署名-非商业性使用-一样方式共享 4.0

)许可协议,您可以自由修改,但不得对本程序进行商业性使用。

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

本工具支持通过行政区划名称 和 行政区划代码查询,查询下级行政区划,同时显示他的所有上级行政区划
通过行政区划代码查询时,只需输入需要查询的级别的代码,例如33为浙江省,如果输入3300,则查询不到结果

本程序支持通配符查询,%代表任意数量的任意字符,_代表一个任意字符。
查询优先级:通配符查询>行政区划编码>行政区划名称全称
如果没有通配符,则进入行政区划编码查询;如果行政区划编码不符合正则规则或行政区划编码查询结果为空,进入行政区划名称查询。
使用通配符查询时,请尽可能提供详细的地名,避免对常见字进行直接搜索,否则由于追溯地名上级可能消耗大量时间。

Mac版使用说明:
无需单独下载数据库文件,已打包5级数据库。下载压缩包并双击解压,右键xzqh.app,选择“显示包内容”,进入Contents>MacOS目录,双击xzqh运行。如需常常使用,可以创建替身(即快捷方式)。在xzqh上右键,选择

“制作替身”,将出现的替身移动到桌面即可。

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

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

>>百度网盘<<提取码(52pj) >>蓝奏云<<提取码(3tr0)
通过蓝奏云下载的数据库文件,请务必删除数字,确保数据库文件名为xzqh.db

#!/usr/bin/env python3
# -*-coding:utf-8-*-
import os.path
import re
import sqlite3


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


def get_dict_max_length(dic):
    max_length = 0
    for x in dic:
        t_len = len(x[1])
        max_length = t_len if t_len > max_length else max_length
    return max_length


def str_add_space(text, max_length):
    space_count = (max_length - len(str(text))) * 2 + 3
    return text + " " * space_count


def main():
    print("行政区划双向查询工具[52Pojie] By: 繁华中的沉寂
")
    print("本程序支持通配符查询,%代表任意数量的任意字符,_代表一个任意字符。")
    print("查询优先级:通配符查询>行政区划编码>行政区划名称
")

    if not os.path.isfile("xzqh.db"):
        input("没有找到行政区划数据库文件,请先在同目录放置xzqh.db文件再运行本程序
请按回车键退出...")
        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 '{}'".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='{}'".format(in_val)).fetchall()
            if rows is None or not rows:
                rows = cursorObj.execute("SELECT * FROM xzqh WHERE name LIKE '{}'".format(in_val)).fetchall()

        if rows:
            if len(rows) > 1:
                print("查询到多个结果,请根据以下信息重新查询吧~")
                # 输出每个结果的行政区划树
                for i in range(0, len(rows)):
                    print("{}[{}]".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)
            cx_code = rows[0][5]  # 城乡分类代码
            cx_code_dic = {'111': '主城区', '112': '城乡结合区', '121': '镇中心区', '122': '镇乡结合区', '123': '特殊区域', '210': '乡中心区', '220': '村庄'}
            cx_code_text = ",他的城乡分类代码是[{}]{}".format(cx_code, cx_code_dic[cx_code]) if cx_code != '0' else ""
            print("{}[{}],这是一个{}级行政区划地区{}".format(">".join(tree), value, level, cx_code_text))

            ll_rows = cursorObj.execute("SELECT * FROM xzqh WHERE father_value='{}'".format(value)).fetchall()
            if ll_rows:
                t_max_length = get_dict_max_length(ll_rows)
                for row in ll_rows:
                    # print("{0}{1:<012}".format(str_add_space(row[1], t_max_length), row[2]))
                    cx_code = row[5]  # 获取城乡分类代码
                    cx_code_text = "   [{}]{}".format(cx_code, cx_code_dic[cx_code]) if cx_code != '0' else ""
                    print("{}{}{}".format(str_add_space(row[1], t_max_length), row[2], cx_code_text))
                print()
            else:
                print("他没有下级行政区划
")
        else:
            print("无法查询到您的输入对应的行政区划信息,请检查后重试
")
            continue


if __name__ == "__main__":
    main()

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 共47条

请登录后发表评论