中国四级城市联动数据,包含港澳台,内含json , sql , python 脚本

python脚本:

复制代码
import json
from pypinyin import lazy_pinyin, Style

def get_pinyin(text):
    full = ''.join(lazy_pinyin(text, style=Style.TONE3))
    short = ''.join([p[0] for p in lazy_pinyin(text, style=Style.TONE3)])
    return full, short

def escape_sql(s):
    return s.replace("'", "''")

def main():
    with open('pcas-code.json', 'r', encoding='utf-8') as f:
        provinces = json.load(f)

    records = []
    id_counter = 1
    province_id_map = {}
    city_id_map = {}
    district_id_map = {}

    # === 构建所有记录(四级)===
    for province in provinces:
        p_code = province['code']
        p_name = province['name']
        pf, ps = get_pinyin(p_name)
        records.append({
            'id': id_counter,
            'name': p_name,
            'province': p_name,
            'code': p_code,
            'level': 1,
            'parent_id': 0,
            'pinyin': pf,
            'short_pinyin': ps
        })
        province_id_map[p_code] = id_counter
        id_counter += 1

        for city in province.get('children', []):
            c_code = city['code']
            c_name = city['name']
            cf, cs = get_pinyin(c_name)
            records.append({
                'id': id_counter,
                'name': c_name,
                'province': p_name,
                'code': c_code,
                'level': 2,
                'parent_id': province_id_map[p_code],
                'pinyin': cf,
                'short_pinyin': cs
            })
            city_id_map[c_code] = id_counter
            id_counter += 1

            for district in city.get('children', []):
                d_code = district['code']
                d_name = district['name']
                df, ds = get_pinyin(d_name)
                records.append({
                    'id': id_counter,
                    'name': d_name,
                    'province': p_name,
                    'code': d_code,
                    'level': 3,
                    'parent_id': city_id_map[c_code],
                    'pinyin': df,
                    'short_pinyin': ds
                })
                district_id_map[d_code] = id_counter
                id_counter += 1

                for town in district.get('children', []):
                    t_code = town['code']
                    t_name = town['name']
                    tf, ts = get_pinyin(t_name)
                    records.append({
                        'id': id_counter,
                        'name': t_name,
                        'province': p_name,
                        'code': t_code,
                        'level': 4,
                        'parent_id': district_id_map[d_code],
                        'pinyin': tf,
                        'short_pinyin': ts
                    })
                    id_counter += 1

    print(f"📊 共生成 {len(records)} 条记录(省+市+区县+乡镇)")

    # === 分批写入 SQL ===
    batch_size = 1000
    total_batches = (len(records) + batch_size - 1) // batch_size

    with open('insert_city_batch_1000.sql', 'w', encoding='utf-8') as f:
        f.write("-- 四级行政区划数据(省/市/区县/乡镇)\n")
        f.write("-- 每批 1000 条,自动分批插入\n")
        f.write("SET foreign_key_checks = 0;\n")
        f.write("SET sql_log_bin = 0; -- 可选:跳过 binlog(如需)\n\n")

        for i in range(0, len(records), batch_size):
            batch = records[i:i + batch_size]
            f.write("INSERT INTO `city` (`id`, `name`, `province`, `code`, `level`, `parent_id`, `pinyin`, `short_pinyin`, `sort`, `del_flag`, `create_time`, `update_time`) VALUES\n")
            lines = []
            for r in batch:
                parent_str = 'NULL' if r['parent_id'] is None else str(r['parent_id'])
                name = escape_sql(r['name'])
                province = escape_sql(r['province'])
                line = f"({r['id']}, '{name}', '{province}', '{r['code']}', {r['level']}, {parent_str}, '{r['pinyin']}', '{r['short_pinyin']}', 0, '0', NOW(), NOW())"
                lines.append(line)
            f.write(",\n".join(lines))
            f.write(";\n\n")

        f.write("SET foreign_key_checks = 1;\n")
        f.write("-- ✅ 导入完成\n")

    print(f"✅ 已生成 {total_batches} 个批次")
    print("📄 输出文件:insert_city_batch_1000.sql")

if __name__ == '__main__':
    main()
相关推荐
橙橙笔记3 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
小小张说故事3 小时前
Python 的 class 语句到底执行了什么?拆开 __prepare__、metaclass.__new__ 和那个被讲反的 __set_name__ 顺序
python
天天被压力5 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力5 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A6 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
小lo想吃棒棒糖6 小时前
把机器人训练从 GPU 搬到昇腾 NPU:启元 Q1 起身动作 PPO 训练全记录
python·机器人·昇腾·启元机器人
Thanks_ks6 小时前
【第 006 讲】搭建 PyCharm 开发环境:PyCharm 的下载与安装 | 初始设置与常用配置
ide·python·pycharm·开发工具·jetbrains·开发环境·集成开发环境
青少儿编程课堂7 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛
tellmewhoisi7 小时前
nlp:知识库检索和dify知识库创建
python·自然语言处理
2601_968793148 小时前
Python Requests 轻量自动化:无需浏览器,实现真人级账号浏览模拟
开发语言·python·自动化