From 72427e9e432d1204b368be5e3bfa7df6858dcd6c Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Wed, 10 Sep 2025 14:26:55 +0800 Subject: [PATCH] 'commit' --- Log/1.log | 565 +++++++++++++----- Tools/Full_Original.py | 103 ++++ Tools/T3_SchoolCount.py | 383 ++++++------ Tools/T8_SchoolMianJi.py | 470 ++++++++------- Tools/__pycache__/T1_RenKou.cpython-310.pyc | Bin 0 -> 2140 bytes .../__pycache__/T2_MaoRuXueLv.cpython-310.pyc | Bin 0 -> 3043 bytes .../T3_SchoolCount.cpython-310.pyc | Bin 0 -> 5095 bytes .../__pycache__/T4_ClassCount.cpython-310.pyc | Bin 0 -> 4203 bytes .../T5_ZhaoShengCount.cpython-310.pyc | Bin 0 -> 5046 bytes .../T6_ZaiXiaoShengCount.cpython-310.pyc | Bin 0 -> 5897 bytes .../T7_TeacherCount.cpython-310.pyc | Bin 0 -> 6917 bytes .../T8_SchoolMianJi.cpython-310.pyc | Bin 0 -> 7433 bytes 12 files changed, 955 insertions(+), 566 deletions(-) create mode 100644 Tools/Full_Original.py create mode 100644 Tools/__pycache__/T1_RenKou.cpython-310.pyc create mode 100644 Tools/__pycache__/T2_MaoRuXueLv.cpython-310.pyc create mode 100644 Tools/__pycache__/T3_SchoolCount.cpython-310.pyc create mode 100644 Tools/__pycache__/T4_ClassCount.cpython-310.pyc create mode 100644 Tools/__pycache__/T5_ZhaoShengCount.cpython-310.pyc create mode 100644 Tools/__pycache__/T6_ZaiXiaoShengCount.cpython-310.pyc create mode 100644 Tools/__pycache__/T7_TeacherCount.cpython-310.pyc create mode 100644 Tools/__pycache__/T8_SchoolMianJi.cpython-310.pyc diff --git a/Log/1.log b/Log/1.log index 3e8cc96..494e685 100644 --- a/Log/1.log +++ b/Log/1.log @@ -1,150 +1,419 @@ -C:\Users\Administrator\.conda\envs\yunnan\python.exe -X pycache_prefix=C:\Users\Administrator\AppData\Local\JetBrains\PyCharm2025.2\cpython-cache "C:/Program Files/JetBrains/PyCharm 2025.2.0.1/plugins/python-ce/helpers/pydev/pydevd.py" --multiprocess --qt-support=auto --client 127.0.0.1 --port 51895 --file D:\dsWork\YunNanProject\Tools\T2_GetJson.py -Connected to: . -已连接到 pydev 调试器(内部版本号 252.23892.515)行 3: 云南省 -> 全称: 云南省, 行政区划码: 530000000 -行 4: 昆明市 -> 全称: 昆明市, 行政区划码: 530100000 -行 5: 五华区 -> 全称: 五华区, 行政区划码: 530102000 -行 6: 盘龙区 -> 全称: 盘龙区, 行政区划码: 530103000 -行 7: 官渡区 -> 全称: 官渡区, 行政区划码: 530111000 -行 8: 西山区 -> 全称: 西山区, 行政区划码: 530112000 -行 9: 东川区 -> 全称: 东川区, 行政区划码: 530113000 -行 10: 呈贡区 -> 全称: 呈贡区, 行政区划码: 530114000 -行 11: 晋宁区 -> 全称: 晋宁区, 行政区划码: 530115000 -行 12: 富民县 -> 全称: 富民县, 行政区划码: 530124000 -行 13: 宜良县 -> 全称: 宜良县, 行政区划码: 530125000 -行 14: 石林县 -> 全称: 石林彝族自治县, 行政区划码: 530126000 -行 15: 嵩明县 -> 全称: 嵩明县, 行政区划码: 530127000 -行 16: 禄劝县 -> 全称: 禄劝彝族苗族自治县, 行政区划码: 530128000 -行 17: 寻甸县 -> 全称: 寻甸回族彝族自治县, 行政区划码: 530129000 -行 18: 安宁市 -> 全称: 安宁市, 行政区划码: 530181000 -行 19: 曲靖市 -> 全称: 曲靖市, 行政区划码: 530300000 -行 20: 麒麟区 -> 全称: 麒麟区, 行政区划码: 530302000 -行 21: 沾益区 -> 全称: 沾益区, 行政区划码: 530303000 -行 22: 马龙区 -> 全称: 马龙区, 行政区划码: 530304000 -行 23: 陆良县 -> 全称: 陆良县, 行政区划码: 530322000 -行 24: 师宗县 -> 全称: 师宗县, 行政区划码: 530323000 -行 25: 罗平县 -> 全称: 罗平县, 行政区划码: 530324000 -行 26: 富源县 -> 全称: 富源县, 行政区划码: 530325000 -行 27: 会泽县 -> 全称: 会泽县, 行政区划码: 530326000 -行 28: 宣威市 -> 全称: 宣威市, 行政区划码: 530381000 -行 29: 玉溪市 -> 全称: 玉溪市, 行政区划码: 530400000 -行 30: 红塔区 -> 全称: 红塔区, 行政区划码: 530402000 -行 31: 江川区 -> 全称: 江川区, 行政区划码: 530403000 -行 32: 澄江县 -> 全称: 澄江市, 行政区划码: 530481000 -行 33: 通海县 -> 全称: 通海县, 行政区划码: 530423000 -行 34: 华宁县 -> 全称: 华宁县, 行政区划码: 530424000 -行 35: 易门县 -> 全称: 易门县, 行政区划码: 530425000 -行 36: 峨山县 -> 全称: 峨山彝族自治县, 行政区划码: 530426000 -行 37: 新平县 -> 全称: 新平彝族傣族自治县, 行政区划码: 530427000 -行 38: 元江县 -> 全称: 元江哈尼族彝族傣族自治县, 行政区划码: 530428000 -行 39: 保山市 -> 全称: 保山市, 行政区划码: 530500000 -行 40: 隆阳区 -> 全称: 隆阳区, 行政区划码: 530502000 -行 41: 施甸县 -> 全称: 施甸县, 行政区划码: 530521000 -行 42: 龙陵县 -> 全称: 龙陵县, 行政区划码: 530523000 -行 43: 昌宁县 -> 全称: 昌宁县, 行政区划码: 530524000 -行 44: 腾冲市 -> 全称: 腾冲市, 行政区划码: 530581000 -行 45: 昭通市 -> 全称: 昭通市, 行政区划码: 530600000 -行 46: 昭阳区 -> 全称: 昭阳区, 行政区划码: 530602000 -行 47: 鲁甸县 -> 全称: 鲁甸县, 行政区划码: 530621000 -行 48: 巧家县 -> 全称: 巧家县, 行政区划码: 530622000 -行 49: 盐津县 -> 全称: 盐津县, 行政区划码: 530623000 -行 50: 大关县 -> 全称: 大关县, 行政区划码: 530624000 -行 51: 永善县 -> 全称: 永善县, 行政区划码: 530625000 -行 52: 绥江县 -> 全称: 绥江县, 行政区划码: 530626000 -行 53: 镇雄县 -> 全称: 镇雄县, 行政区划码: 530627000 -行 54: 彝良县 -> 全称: 彝良县, 行政区划码: 530628000 -行 55: 威信县 -> 全称: 威信县, 行政区划码: 530629000 -行 56: 水富市 -> 全称: 水富市, 行政区划码: 530681000 -行 57: 丽江市 -> 全称: 丽江市, 行政区划码: 530700000 -行 58: 古城区 -> 全称: 古城区, 行政区划码: 530702000 -行 59: 玉龙县 -> 全称: 玉龙纳西族自治县, 行政区划码: 530721000 -行 60: 永胜县 -> 全称: 永胜县, 行政区划码: 530722000 -行 61: 华坪县 -> 全称: 华坪县, 行政区划码: 530723000 -行 62: 宁蒗县 -> 全称: 宁蒗彝族自治县, 行政区划码: 530724000 -行 63: 普洱市 -> 全称: 普洱市, 行政区划码: 530800000 -行 64: 思茅区 -> 全称: 思茅区, 行政区划码: 530802000 -行 65: 宁洱县 -> 全称: 宁洱哈尼族彝族自治县, 行政区划码: 530821000 -行 66: 墨江县 -> 全称: 墨江哈尼族自治县, 行政区划码: 530822000 -行 67: 景东县 -> 全称: 景东彝族自治县, 行政区划码: 530823000 -行 68: 景谷县 -> 全称: 景谷傣族彝族自治县, 行政区划码: 530824000 -行 69: 镇沅县 -> 全称: 镇沅彝族哈尼族拉祜族自治县, 行政区划码: 530825000 -行 70: 江城县 -> 全称: 江城哈尼族彝族自治县, 行政区划码: 530826000 -行 71: 孟连县 -> 全称: 孟连傣族拉祜族佤族自治县, 行政区划码: 530827000 -行 72: 澜沧县 -> 全称: 澜沧拉祜族自治县, 行政区划码: 530828000 -行 73: 西盟县 -> 全称: 西盟佤族自治县, 行政区划码: 530829000 -行 74: 临沧市 -> 全称: 临沧市, 行政区划码: 530900000 -行 75: 临翔区 -> 全称: 临翔区, 行政区划码: 530902000 -行 76: 凤庆县 -> 全称: 凤庆县, 行政区划码: 530921000 -行 77: 云县 -> 全称: 云县, 行政区划码: 530922000 -行 78: 永德县 -> 全称: 永德县, 行政区划码: 530923000 -行 79: 镇康县 -> 全称: 镇康县, 行政区划码: 530924000 -行 80: 双江县 -> 全称: 双江拉祜族佤族布朗族傣族自治县, 行政区划码: 530925000 -行 81: 耿马县 -> 全称: 耿马傣族佤族自治县, 行政区划码: 530926000 -行 82: 沧源县 -> 全称: 沧源佤族自治县, 行政区划码: 530927000 -行 83: 楚雄州 -> 全称: 楚雄彝族自治州, 行政区划码: 532300000 -行 84: 楚雄市 -> 全称: 楚雄市, 行政区划码: 532301000 -行 85: 禄丰市 -> 全称: 禄丰县, 行政区划码: 532331000 -行 86: 双柏县 -> 全称: 双柏县, 行政区划码: 532322000 -行 87: 牟定县 -> 全称: 牟定县, 行政区划码: 532323000 -行 88: 南华县 -> 全称: 南华县, 行政区划码: 532324000 -行 89: 姚安县 -> 全称: 姚安县, 行政区划码: 532325000 -行 90: 大姚县 -> 全称: 大姚县, 行政区划码: 532326000 -行 91: 永仁县 -> 全称: 永仁县, 行政区划码: 532327000 -行 92: 元谋县 -> 全称: 元谋县, 行政区划码: 532328000 -行 93: 武定县 -> 全称: 武定县, 行政区划码: 532329000 -行 94: 红河州 -> 全称: 红河哈尼族彝族自治州, 行政区划码: 532500000 -行 95: 个旧市 -> 全称: 个旧市, 行政区划码: 532501000 -行 96: 开远市 -> 全称: 开远市, 行政区划码: 532502000 -行 97: 蒙自市 -> 全称: 蒙自市, 行政区划码: 532503000 -行 98: 弥勒市 -> 全称: 弥勒市, 行政区划码: 532504000 -行 99: 屏边县 -> 全称: 屏边苗族自治县, 行政区划码: 532523000 -行 100: 建水县 -> 全称: 建水县, 行政区划码: 532524000 -行 101: 石屏县 -> 全称: 石屏县, 行政区划码: 532525000 -行 102: 泸西县 -> 全称: 泸西县, 行政区划码: 532527000 -行 103: 元阳县 -> 全称: 元阳县, 行政区划码: 532528000 -行 104: 红河县 -> 全称: 红河县, 行政区划码: 532529000 -行 105: 金平县 -> 全称: 金平苗族瑶族傣族自治县, 行政区划码: 532530000 -行 106: 绿春县 -> 全称: 绿春县, 行政区划码: 532531000 -行 107: 河口县 -> 全称: 河口瑶族自治县, 行政区划码: 532532000 -行 108: 文山州 -> 全称: 文山壮族苗族自治州, 行政区划码: 532600000 -行 109: 文山市 -> 全称: 文山市, 行政区划码: 532601000 -行 110: 砚山县 -> 全称: 砚山县, 行政区划码: 532622000 -行 111: 西畴县 -> 全称: 西畴县, 行政区划码: 532623000 -行 112: 麻栗坡县 -> 全称: 麻栗坡县, 行政区划码: 532624000 -行 113: 马关县 -> 全称: 马关县, 行政区划码: 532625000 -行 114: 丘北县 -> 全称: 丘北县, 行政区划码: 532626000 -行 115: 广南县 -> 全称: 广南县, 行政区划码: 532627000 -行 116: 富宁县 -> 全称: 富宁县, 行政区划码: 532628000 -行 117: 西双版纳州 -> 全称: 西双版纳傣族自治州, 行政区划码: 532800000 -行 118: 景洪市 -> 全称: 景洪市, 行政区划码: 532801000 -行 119: 勐海县 -> 全称: 勐海县, 行政区划码: 532822000 -行 120: 勐腊县 -> 全称: 勐腊县, 行政区划码: 532823000 -行 121: 大理州 -> 全称: 大理白族自治州, 行政区划码: 532900000 -行 122: 大理市 -> 全称: 大理市, 行政区划码: 532901000 -行 123: 漾濞县 -> 全称: 漾濞彝族自治县, 行政区划码: 532922000 -行 124: 祥云县 -> 全称: 祥云县, 行政区划码: 532923000 -行 125: 宾川县 -> 全称: 宾川县, 行政区划码: 532924000 -行 126: 弥渡县 -> 全称: 弥渡县, 行政区划码: 532925000 -行 127: 南涧县 -> 全称: 南涧彝族自治县, 行政区划码: 532926000 -行 128: 巍山县 -> 全称: 巍山彝族回族自治县, 行政区划码: 532927000 -行 129: 永平县 -> 全称: 永平县, 行政区划码: 532928000 -行 130: 云龙县 -> 全称: 云龙县, 行政区划码: 532929000 -行 131: 洱源县 -> 全称: 洱源县, 行政区划码: 532930000 -行 132: 剑川县 -> 全称: 剑川县, 行政区划码: 532931000 -行 133: 鹤庆县 -> 全称: 鹤庆县, 行政区划码: 532932000 -行 134: 德宏州 -> 全称: 德宏傣族景颇族自治州, 行政区划码: 533100000 -行 135: 瑞丽市 -> 全称: 瑞丽市, 行政区划码: 533102000 -行 136: 芒市 -> 全称: 芒市, 行政区划码: 533103000 -行 137: 梁河县 -> 全称: 梁河县, 行政区划码: 533122000 -行 138: 盈江县 -> 全称: 盈江县, 行政区划码: 533123000 -行 139: 陇川县 -> 全称: 陇川县, 行政区划码: 533124000 -行 140: 怒江州 -> 全称: 怒江傈僳族自治州, 行政区划码: 533300000 -行 141: 泸水市 -> 全称: 泸水市, 行政区划码: 533301000 -行 142: 福贡县 -> 全称: 福贡县, 行政区划码: 533323000 -行 143: 贡山县 -> 全称: 贡山独龙族怒族自治县, 行政区划码: 533324000 -行 144: 兰坪县 -> 全称: 兰坪白族普米族自治县, 行政区划码: 533325000 -行 145: 迪庆州 -> 全称: 迪庆藏族自治州, 行政区划码: 533400000 -行 146: 香格里拉市 -> 全称: 香格里拉市, 行政区划码: 533401000 -行 147: 德钦县 -> 全称: 德钦县, 行政区划码: 533422000 -行 148: 维西县 -> 全称: 维西傈僳族自治县, 行政区划码: 533423000 +C:\Users\Administrator\.conda\envs\yunnan\python.exe D:\dsWork\YunNanProject\Tools\Full_Original.py +开始执行全部数据处理工具 (T1-T8) +当前工作目录: D:\dsWork\YunNanProject\Tools +切换到工具目录: D:\dsWork\YunNanProject\Tools + +================================================== +开始执行 T1_RenKou +================================================== +开始时间: 2025-09-10 14:23:24 + +=== 名称转换记录 === +🔄 行 14: 石林县 → 石林彝族自治县 +🔄 行 16: 禄劝县 → 禄劝彝族苗族自治县 +🔄 行 17: 寻甸县 → 寻甸回族彝族自治县 +🔄 行 32: 澄江县 → 澄江市 +🔄 行 36: 峨山县 → 峨山彝族自治县 +🔄 行 37: 新平县 → 新平彝族傣族自治县 +🔄 行 38: 元江县 → 元江哈尼族彝族傣族自治县 +🔄 行 59: 玉龙县 → 玉龙纳西族自治县 +🔄 行 62: 宁蒗县 → 宁蒗彝族自治县 +🔄 行 65: 宁洱县 → 宁洱哈尼族彝族自治县 +🔄 行 66: 墨江县 → 墨江哈尼族自治县 +🔄 行 67: 景东县 → 景东彝族自治县 +🔄 行 68: 景谷县 → 景谷傣族彝族自治县 +🔄 行 69: 镇沅县 → 镇沅彝族哈尼族拉祜族自治县 +🔄 行 70: 江城县 → 江城哈尼族彝族自治县 +🔄 行 71: 孟连县 → 孟连傣族拉祜族佤族自治县 +🔄 行 72: 澜沧县 → 澜沧拉祜族自治县 +🔄 行 73: 西盟县 → 西盟佤族自治县 +🔄 行 80: 双江县 → 双江拉祜族佤族布朗族傣族自治县 +🔄 行 81: 耿马县 → 耿马傣族佤族自治县 +🔄 行 82: 沧源县 → 沧源佤族自治县 +🔄 行 83: 楚雄州 → 楚雄彝族自治州 +🔄 行 85: 禄丰市 → 禄丰县 +🔄 行 94: 红河州 → 红河哈尼族彝族自治州 +🔄 行 99: 屏边县 → 屏边苗族自治县 +🔄 行 105: 金平县 → 金平苗族瑶族傣族自治县 +🔄 行 107: 河口县 → 河口瑶族自治县 +🔄 行 108: 文山州 → 文山壮族苗族自治州 +🔄 行 117: 西双版纳州 → 西双版纳傣族自治州 +🔄 行 121: 大理州 → 大理白族自治州 +🔄 行 123: 漾濞县 → 漾濞彝族自治县 +🔄 行 127: 南涧县 → 南涧彝族自治县 +🔄 行 128: 巍山县 → 巍山彝族回族自治县 +🔄 行 134: 德宏州 → 德宏傣族景颇族自治州 +🔄 行 140: 怒江州 → 怒江傈僳族自治州 +🔄 行 143: 贡山县 → 贡山独龙族怒族自治县 +🔄 行 144: 兰坪县 → 兰坪白族普米族自治县 +🔄 行 145: 迪庆州 → 迪庆藏族自治州 +🔄 行 148: 维西县 → 维西傈僳族自治县 +📊 共检测到 39 项名称转换 +✅ 所有区域名称均成功转换为全称 +✅ 数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\RenKou.json +📊 共处理 146 条地区数据 + +✅ T1_RenKou 执行成功 +结束时间: 2025-09-10 14:23:26 +耗时: 2.31 秒 + +================================================== +开始执行 T2_MaoRuXueLv +================================================== +开始时间: 2025-09-10 14:23:26 +✅ 数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\MaoRuXueLv.json +📊 共处理 146 条地区数据 + +=== 名称转换记录 === +🔄 行 13: 晋宁县 → 晋宁区 +🔄 行 23: 马龙县 → 马龙区 +🔄 行 29: 沾益县 → 沾益区 +🔄 行 33: 江川县 → 江川区 +🔄 行 34: 澄江县 → 澄江市 +🔄 行 44: 腾冲县 → 腾冲市 +🔄 行 58: 水富县 → 水富市 +🔄 行 143: 泸水县 → 泸水市 +🔄 行 148: 香格里拉县 → 香格里拉市 +📊 共检测到 9 项名称转换 +✅ 所有区域名称均成功转换为全称 + +✅ T2_MaoRuXueLv 执行成功 +结束时间: 2025-09-10 14:23:26 +耗时: 0.15 秒 + +================================================== +开始执行 T3_SchoolCount +================================================== +开始时间: 2025-09-10 14:23:26 +✅ 学校数数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\SchoolCount.json +📊 共处理 146 条地区数据 + +=== 名称转换记录 === +🔄 行 12: 晋宁县 → 晋宁区 +🔄 行 22: 马龙县 → 马龙区 +🔄 行 28: 沾益县 → 沾益区 +🔄 行 32: 江川县 → 江川区 +🔄 行 33: 澄江县 → 澄江市 +🔄 行 43: 腾冲县 → 腾冲市 +🔄 行 57: 水富县 → 水富市 +🔄 行 142: 泸水县 → 泸水市 +🔄 行 147: 香格里拉县 → 香格里拉市 +📊 共检测到 9 项名称转换 + +❌ T3_SchoolCount 没有找到main函数 + +⚠️ T3_SchoolCount 执行失败,但继续执行后续工具... + +================================================== +开始执行 T4_ClassCount +================================================== +开始时间: 2025-09-10 14:23:27 + +=== 名称转换记录 === +🔄 行 12: 晋宁县 → 晋宁区 +🔄 行 22: 马龙县 → 马龙区 +🔄 行 28: 沾益县 → 沾益区 +🔄 行 32: 江川县 → 江川区 +🔄 行 33: 澄江县 → 澄江市 +🔄 行 43: 腾冲县 → 腾冲市 +🔄 行 57: 水富县 → 水富市 +🔄 行 142: 泸水县 → 泸水市 +🔄 行 147: 香格里拉县 → 香格里拉市 +📊 共检测到 9 项名称转换 +✅ 所有区域名称均成功转换为全称 +✅ 数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\ClassCount.json +📊 共处理 146 条地区数据 + +✅ T4_ClassCount 执行成功 +结束时间: 2025-09-10 14:23:27 +耗时: 0.24 秒 + +================================================== +开始执行 T5_ZhaoShengCount +================================================== +开始时间: 2025-09-10 14:23:27 +✅ 成功加载Excel文件:D:\dsWork\YunNanProject\Doc\数据库-2015-2024-v2.xlsx +✅ 开始处理招生数数据,共149行数据 +🔄 已处理 10 条数据... +🔄 已处理 20 条数据... +🔄 已处理 30 条数据... +🔄 已处理 40 条数据... +🔄 已处理 50 条数据... +🔄 已处理 60 条数据... +🔄 已处理 70 条数据... +🔄 已处理 80 条数据... +🔄 已处理 90 条数据... +🔄 已处理 100 条数据... +🔄 已处理 110 条数据... +🔄 已处理 120 条数据... +🔄 已处理 130 条数据... +🔄 已处理 140 条数据... + +=== 名称转换记录 === +🔄 行 12: 晋宁县 → 晋宁区 +🔄 行 22: 马龙县 → 马龙区 +🔄 行 28: 沾益县 → 沾益区 +🔄 行 32: 江川县 → 江川区 +🔄 行 33: 澄江县 → 澄江市 +🔄 行 43: 腾冲县 → 腾冲市 +🔄 行 57: 水富县 → 水富市 +🔄 行 142: 泸水县 → 泸水市 +🔄 行 147: 香格里拉县 → 香格里拉市 +📊 共检测到 9 项名称转换 +✅ 所有区域名称均成功转换为全称 +✅ 数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\ZhaoShengCount.json +📊 共处理 145 条地区数据 + +✅ T5_ZhaoShengCount 执行成功 +结束时间: 2025-09-10 14:23:27 +耗时: 0.26 秒 + +================================================== +开始执行 T6_ZaiXiaoShengCount +================================================== +开始时间: 2025-09-10 14:23:27 +✅ 开始处理在校生数数据,共149行数据 +🔄 已处理10条数据... +🔄 已处理20条数据... +🔄 已处理30条数据... +🔄 已处理40条数据... +🔄 已处理50条数据... +🔄 已处理60条数据... +🔄 已处理70条数据... +🔄 已处理80条数据... +🔄 已处理90条数据... +🔄 已处理100条数据... +🔄 已处理110条数据... +🔄 已处理120条数据... +🔄 已处理130条数据... +🔄 已处理140条数据... +✅ 数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\ZaiXiaoShengCount.json +📊 共处理 145 条地区数据 + +=== 名称转换记录 === +🔄 行 5: 昆明市 → 昆明市 +🔄 行 6: 五华区 → 五华区 +🔄 行 7: 盘龙区 → 盘龙区 +🔄 行 8: 官渡区 → 官渡区 +🔄 行 9: 西山区 → 西山区 +🔄 行 10: 东川区 → 东川区 +🔄 行 11: 呈贡区 → 呈贡区 +🔄 行 12: 晋宁县 → 晋宁区 +🔄 行 12: 晋宁县 → 晋宁区 +🔄 行 13: 富民县 → 富民县 +🔄 行 14: 宜良县 → 宜良县 +🔄 行 15: 石林彝族自治县 → 石林彝族自治县 +🔄 行 16: 嵩明县 → 嵩明县 +🔄 行 17: 禄劝彝族苗族自治县 → 禄劝彝族苗族自治县 +🔄 行 18: 寻甸回族彝族自治县 → 寻甸回族彝族自治县 +🔄 行 19: 安宁市 → 安宁市 +🔄 行 20: 曲靖市 → 曲靖市 +🔄 行 21: 麒麟区 → 麒麟区 +🔄 行 22: 马龙县 → 马龙区 +🔄 行 22: 马龙县 → 马龙区 +🔄 行 23: 陆良县 → 陆良县 +🔄 行 24: 师宗县 → 师宗县 +🔄 行 25: 罗平县 → 罗平县 +🔄 行 26: 富源县 → 富源县 +🔄 行 27: 会泽县 → 会泽县 +🔄 行 28: 沾益县 → 沾益区 +🔄 行 28: 沾益县 → 沾益区 +🔄 行 29: 宣威市 → 宣威市 +🔄 行 30: 玉溪市 → 玉溪市 +🔄 行 31: 红塔区 → 红塔区 +🔄 行 32: 江川县 → 江川区 +🔄 行 32: 江川县 → 江川区 +🔄 行 33: 澄江县 → 澄江市 +🔄 行 33: 澄江县 → 澄江市 +🔄 行 34: 通海县 → 通海县 +🔄 行 35: 华宁县 → 华宁县 +🔄 行 36: 易门县 → 易门县 +🔄 行 37: 峨山彝族自治县 → 峨山彝族自治县 +🔄 行 38: 新平彝族傣族自治县 → 新平彝族傣族自治县 +🔄 行 39: 元江哈尼族彝族傣族自治县 → 元江哈尼族彝族傣族自治县 +🔄 行 40: 保山市 → 保山市 +🔄 行 41: 隆阳区 → 隆阳区 +🔄 行 42: 施甸县 → 施甸县 +🔄 行 43: 腾冲县 → 腾冲市 +🔄 行 43: 腾冲县 → 腾冲市 +🔄 行 44: 龙陵县 → 龙陵县 +🔄 行 45: 昌宁县 → 昌宁县 +🔄 行 46: 昭通市 → 昭通市 +🔄 行 47: 昭阳区 → 昭阳区 +🔄 行 48: 鲁甸县 → 鲁甸县 +🔄 行 49: 巧家县 → 巧家县 +🔄 行 50: 盐津县 → 盐津县 +🔄 行 51: 大关县 → 大关县 +🔄 行 52: 永善县 → 永善县 +🔄 行 53: 绥江县 → 绥江县 +🔄 行 54: 镇雄县 → 镇雄县 +🔄 行 55: 彝良县 → 彝良县 +🔄 行 56: 威信县 → 威信县 +🔄 行 57: 水富县 → 水富市 +🔄 行 57: 水富县 → 水富市 +🔄 行 58: 丽江市 → 丽江市 +🔄 行 59: 古城区 → 古城区 +🔄 行 60: 玉龙纳西族自治县 → 玉龙纳西族自治县 +🔄 行 61: 永胜县 → 永胜县 +🔄 行 62: 华坪县 → 华坪县 +🔄 行 63: 宁蒗彝族自治县 → 宁蒗彝族自治县 +🔄 行 64: 普洱市 → 普洱市 +🔄 行 65: 思茅区 → 思茅区 +🔄 行 66: 宁洱哈尼族彝族自治县 → 宁洱哈尼族彝族自治县 +🔄 行 67: 墨江哈尼族自治县 → 墨江哈尼族自治县 +🔄 行 68: 景东彝族自治县 → 景东彝族自治县 +🔄 行 69: 景谷傣族彝族自治县 → 景谷傣族彝族自治县 +🔄 行 70: 镇沅彝族哈尼族拉祜族自治县 → 镇沅彝族哈尼族拉祜族自治县 +🔄 行 71: 江城哈尼族彝族自治县 → 江城哈尼族彝族自治县 +🔄 行 72: 孟连傣族拉祜族佤族自治县 → 孟连傣族拉祜族佤族自治县 +🔄 行 73: 澜沧拉祜族自治县 → 澜沧拉祜族自治县 +🔄 行 74: 西盟佤族自治县 → 西盟佤族自治县 +🔄 行 75: 临沧市 → 临沧市 +🔄 行 76: 临翔区 → 临翔区 +🔄 行 77: 凤庆县 → 凤庆县 +🔄 行 78: 云县 → 云县 +🔄 行 79: 永德县 → 永德县 +🔄 行 80: 镇康县 → 镇康县 +🔄 行 81: 双江拉祜族佤族布朗族傣族自治县 → 双江拉祜族佤族布朗族傣族自治县 +🔄 行 82: 耿马傣族佤族自治县 → 耿马傣族佤族自治县 +🔄 行 83: 沧源佤族自治县 → 沧源佤族自治县 +🔄 行 84: 楚雄彝族自治州 → 楚雄彝族自治州 +🔄 行 85: 楚雄市 → 楚雄市 +🔄 行 86: 双柏县 → 双柏县 +🔄 行 87: 牟定县 → 牟定县 +🔄 行 88: 南华县 → 南华县 +🔄 行 89: 姚安县 → 姚安县 +🔄 行 90: 大姚县 → 大姚县 +🔄 行 91: 永仁县 → 永仁县 +🔄 行 92: 元谋县 → 元谋县 +🔄 行 93: 武定县 → 武定县 +🔄 行 94: 禄丰县 → 禄丰县 +🔄 行 95: 红河哈尼族彝族自治州 → 红河哈尼族彝族自治州 +🔄 行 96: 个旧市 → 个旧市 +🔄 行 97: 开远市 → 开远市 +🔄 行 98: 蒙自市 → 蒙自市 +🔄 行 99: 弥勒市 → 弥勒市 +🔄 行 100: 屏边苗族自治县 → 屏边苗族自治县 +🔄 行 101: 建水县 → 建水县 +🔄 行 102: 石屏县 → 石屏县 +🔄 行 103: 泸西县 → 泸西县 +🔄 行 104: 元阳县 → 元阳县 +🔄 行 105: 红河县 → 红河县 +🔄 行 106: 金平苗族瑶族傣族自治县 → 金平苗族瑶族傣族自治县 +🔄 行 107: 绿春县 → 绿春县 +🔄 行 108: 河口瑶族自治县 → 河口瑶族自治县 +🔄 行 109: 文山壮族苗族自治州 → 文山壮族苗族自治州 +🔄 行 110: 文山市 → 文山市 +🔄 行 111: 砚山县 → 砚山县 +🔄 行 112: 西畴县 → 西畴县 +🔄 行 113: 麻栗坡县 → 麻栗坡县 +🔄 行 114: 马关县 → 马关县 +🔄 行 115: 丘北县 → 丘北县 +🔄 行 116: 广南县 → 广南县 +🔄 行 117: 富宁县 → 富宁县 +🔄 行 118: 西双版纳傣族自治州 → 西双版纳傣族自治州 +🔄 行 119: 景洪市 → 景洪市 +🔄 行 120: 勐海县 → 勐海县 +🔄 行 121: 勐腊县 → 勐腊县 +🔄 行 122: 大理白族自治州 → 大理白族自治州 +🔄 行 123: 大理市 → 大理市 +🔄 行 124: 漾濞彝族自治县 → 漾濞彝族自治县 +🔄 行 125: 祥云县 → 祥云县 +🔄 行 126: 宾川县 → 宾川县 +🔄 行 127: 弥渡县 → 弥渡县 +🔄 行 128: 南涧彝族自治县 → 南涧彝族自治县 +🔄 行 129: 巍山彝族回族自治县 → 巍山彝族回族自治县 +🔄 行 130: 永平县 → 永平县 +🔄 行 131: 云龙县 → 云龙县 +🔄 行 132: 洱源县 → 洱源县 +🔄 行 133: 剑川县 → 剑川县 +🔄 行 134: 鹤庆县 → 鹤庆县 +🔄 行 135: 德宏傣族景颇族自治州 → 德宏傣族景颇族自治州 +🔄 行 136: 瑞丽市 → 瑞丽市 +🔄 行 137: 芒市 → 芒市 +🔄 行 138: 梁河县 → 梁河县 +🔄 行 139: 盈江县 → 盈江县 +🔄 行 140: 陇川县 → 陇川县 +🔄 行 141: 怒江傈僳族自治州 → 怒江傈僳族自治州 +🔄 行 142: 泸水县 → 泸水市 +🔄 行 142: 泸水县 → 泸水市 +🔄 行 143: 福贡县 → 福贡县 +🔄 行 144: 贡山独龙族怒族自治县 → 贡山独龙族怒族自治县 +🔄 行 145: 兰坪白族普米族自治县 → 兰坪白族普米族自治县 +🔄 行 146: 迪庆藏族自治州 → 迪庆藏族自治州 +🔄 行 147: 香格里拉县 → 香格里拉市 +🔄 行 147: 香格里拉县 → 香格里拉市 +🔄 行 148: 德钦县 → 德钦县 +🔄 行 149: 维西傈僳族自治县 → 维西傈僳族自治县 +📊 共检测到 154 项名称转换 +✅ 所有区域名称均成功转换为全称 +💾 数据已保存至 D:\dsWork\YunNanProject\Data\ZaiXiaoShengCount.json + +✅ T6_ZaiXiaoShengCount 执行成功 +结束时间: 2025-09-10 14:23:27 +耗时: 0.25 秒 + +================================================== +开始执行 T7_TeacherCount +================================================== +开始时间: 2025-09-10 14:23:27 +✅ 开始处理教师数据,共150行数据 +✅ 数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\TeacherCount.json +📊 共处理 146 条地区数据 + +=== 名称转换记录 === +🔄 行 13: 晋宁县 → 晋宁区 +🔄 行 23: 马龙县 → 马龙区 +🔄 行 29: 沾益县 → 沾益区 +🔄 行 33: 江川县 → 江川区 +🔄 行 34: 澄江县 → 澄江市 +🔄 行 44: 腾冲县 → 腾冲市 +🔄 行 58: 水富县 → 水富市 +🔄 行 143: 泸水县 → 泸水市 +🔄 行 148: 香格里拉县 → 香格里拉市 +📊 共检测到 9 项名称转换 +✅ 所有区域名称均成功转换为全称 + +✅ T7_TeacherCount 执行成功 +结束时间: 2025-09-10 14:23:28 +耗时: 0.39 秒 + +================================================== +开始执行 T8_SchoolMianJi +================================================== +开始时间: 2025-09-10 14:23:28 +✅ 学校面积数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\SchoolArea.json +📊 共处理 146 条地区数据 + +=== 名称转换记录 === +🔄 行 13: 晋宁县 → 晋宁区 +🔄 行 23: 马龙县 → 马龙区 +🔄 行 29: 沾益县 → 沾益区 +🔄 行 33: 江川县 → 江川区 +🔄 行 34: 澄江县 → 澄江市 +🔄 行 44: 腾冲县 → 腾冲市 +🔄 行 58: 水富县 → 水富市 +🔄 行 143: 泸水县 → 泸水市 +🔄 行 148: 香格里拉县 → 香格里拉市 +📊 共检测到 9 项名称转换 + +❌ T8_SchoolMianJi 没有找到main函数 + +⚠️ T8_SchoolMianJi 执行失败,但继续执行后续工具... + +================================================== +执行结果摘要 +================================================== +T1_RenKou: ✅ 成功 +T2_MaoRuXueLv: ✅ 成功 +T3_SchoolCount: ❌ 失败 +T4_ClassCount: ✅ 成功 +T5_ZhaoShengCount: ✅ 成功 +T6_ZaiXiaoShengCount: ✅ 成功 +T7_TeacherCount: ✅ 成功 +T8_SchoolMianJi: ❌ 失败 + +总计: 6/8 个工具执行成功 +⚠️ 部分工具执行失败,请检查错误信息 进程已结束,退出代码为 0 diff --git a/Tools/Full_Original.py b/Tools/Full_Original.py new file mode 100644 index 0000000..f96c292 --- /dev/null +++ b/Tools/Full_Original.py @@ -0,0 +1,103 @@ +import os +import sys +import importlib +import traceback +from datetime import datetime + +def run_tool(tool_name): + """运行指定的工具脚本""" + print(f"\n{'='*50}") + print(f"开始执行 {tool_name}") + print(f"{'='*50}") + + start_time = datetime.now() + print(f"开始时间: {start_time.strftime('%Y-%m-%d %H:%M:%S')}") + + try: + # 导入工具模块 + module = importlib.import_module(tool_name) + + # 执行main函数 + if hasattr(module, 'main'): + module.main() + print(f"\n✅ {tool_name} 执行成功") + else: + print(f"\n❌ {tool_name} 没有找到main函数") + return False + + except Exception as e: + print(f"\n❌ {tool_name} 执行失败: {str(e)}") + traceback.print_exc() + return False + + end_time = datetime.now() + duration = end_time - start_time + print(f"结束时间: {end_time.strftime('%Y-%m-%d %H:%M:%S')}") + print(f"耗时: {duration.total_seconds():.2f} 秒") + + return True + +def main(): + """主函数:依次执行所有工具""" + print("开始执行全部数据处理工具 (T1-T8)") + print(f"当前工作目录: {os.getcwd()}") + + # 确保在Tools目录下执行 + tools_dir = os.path.dirname(os.path.abspath(__file__)) + os.chdir(tools_dir) + print(f"切换到工具目录: {tools_dir}") + + # 将Tools目录添加到Python路径 + if tools_dir not in sys.path: + sys.path.insert(0, tools_dir) + + # 将项目根目录添加到Python路径 + project_root = os.path.dirname(tools_dir) + if project_root not in sys.path: + sys.path.insert(0, project_root) + + # 定义要执行的工具列表 + tools = [ + "T1_RenKou", + "T2_MaoRuXueLv", + "T3_SchoolCount", + "T4_ClassCount", + "T5_ZhaoShengCount", + "T6_ZaiXiaoShengCount", + "T7_TeacherCount", + "T8_SchoolMianJi" + ] + + # 记录执行结果 + results = {} + + # 依次执行每个工具 + for tool in tools: + success = run_tool(tool) + results[tool] = success + + # 如果某个工具执行失败,可以选择是否继续执行后续工具 + if not success: + print(f"\n⚠️ {tool} 执行失败,但继续执行后续工具...") + + # 打印执行结果摘要 + print("\n" + "="*50) + print("执行结果摘要") + print("="*50) + + success_count = sum(1 for result in results.values() if result) + total_count = len(results) + + for tool, success in results.items(): + status = "✅ 成功" if success else "❌ 失败" + print(f"{tool}: {status}") + + print(f"\n总计: {success_count}/{total_count} 个工具执行成功") + + if success_count == total_count: + print("🎉 所有工具执行完成!") + else: + print("⚠️ 部分工具执行失败,请检查错误信息") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/Tools/T3_SchoolCount.py b/Tools/T3_SchoolCount.py index 3937fae..b8b7102 100644 --- a/Tools/T3_SchoolCount.py +++ b/Tools/T3_SchoolCount.py @@ -12,209 +12,220 @@ from Util.DataUtil import ( convert_area_name, save_to_json, load_workbook_sheet ) -# 创建数据保存目录 -DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'Data') -os.makedirs(DATA_DIR, exist_ok=True) -JSON_PATH = os.path.join(DATA_DIR, 'SchoolCount.json') # 学校数JSON路径 +def main(): + """主函数:提取学校数量数据""" + # 创建数据保存目录 + DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'Data') + os.makedirs(DATA_DIR, exist_ok=True) + JSON_PATH = os.path.join(DATA_DIR, 'SchoolCount.json') # 学校数JSON路径 -file_name = EXCEL_PATH -school_data = [] -name_conversion_errors = [] # 记录转换失败的名称 -conversion_records = [] # 定义转换记录变量 + file_name = EXCEL_PATH + school_data = [] + name_conversion_errors = [] # 记录转换失败的名称 + conversion_records = [] # 定义转换记录变量 + + workbook = None # 初始化workbook变量,确保在finally块中可以访问 -try: - # 加载工作簿并选择学校数Sheet - workbook = openpyxl.load_workbook(file_name, read_only=True) - if '学校数' not in workbook.sheetnames: - print("❌ 错误:未找到'学校数'Sheet") - exit(1) - sheet = workbook['学校数'] + try: + # 加载工作簿并选择学校数Sheet + workbook = openpyxl.load_workbook(file_name, read_only=True) + if '学校数' not in workbook.sheetnames: + print("❌ 错误:未找到'学校数'Sheet") + return + sheet = workbook['学校数'] - # 定义数据列范围与英文属性映射 - # 每个教育阶段包含:年份列表、列配置(年份→列名映射)、数据类别 - data_columns = { - # 学前教育(每年份4列:城区/镇区/乡村/总计,取前3列) - 'preschool_schools': { - 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], - 'columns': [ - {'year': 2015, 'urban': 'D', 'town': 'E', 'rural': 'F'}, - {'year': 2016, 'urban': 'H', 'town': 'I', 'rural': 'J'}, - {'year': 2017, 'urban': 'L', 'town': 'M', 'rural': 'N'}, - {'year': 2018, 'urban': 'P', 'town': 'Q', 'rural': 'R'}, - {'year': 2019, 'urban': 'T', 'town': 'U', 'rural': 'V'}, - {'year': 2020, 'urban': 'X', 'town': 'Y', 'rural': 'Z'}, - {'year': 2021, 'urban': 'AB', 'town': 'AC', 'rural': 'AD'}, - {'year': 2022, 'urban': 'AF', 'town': 'AG', 'rural': 'AH'}, - {'year': 2023, 'urban': 'AJ', 'town': 'AK', 'rural': 'AL'}, - {'year': 2024, 'urban': 'AN', 'town': 'AO', 'rural': 'AP'} - ], - 'categories': ['urban', 'town', 'rural'] - }, + # 定义数据列范围与英文属性映射 + # 每个教育阶段包含:年份列表、列配置(年份→列名映射)、数据类别 + data_columns = { + # 学前教育(每年份4列:城区/镇区/乡村/总计,取前3列) + 'preschool_schools': { + 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], + 'columns': [ + {'year': 2015, 'urban': 'D', 'town': 'E', 'rural': 'F'}, + {'year': 2016, 'urban': 'H', 'town': 'I', 'rural': 'J'}, + {'year': 2017, 'urban': 'L', 'town': 'M', 'rural': 'N'}, + {'year': 2018, 'urban': 'P', 'town': 'Q', 'rural': 'R'}, + {'year': 2019, 'urban': 'T', 'town': 'U', 'rural': 'V'}, + {'year': 2020, 'urban': 'X', 'town': 'Y', 'rural': 'Z'}, + {'year': 2021, 'urban': 'AB', 'town': 'AC', 'rural': 'AD'}, + {'year': 2022, 'urban': 'AF', 'town': 'AG', 'rural': 'AH'}, + {'year': 2023, 'urban': 'AJ', 'town': 'AK', 'rural': 'AL'}, + {'year': 2024, 'urban': 'AN', 'town': 'AO', 'rural': 'AP'} + ], + 'categories': ['urban', 'town', 'rural'] + }, - # 小学教育(每年份4列,取前3列) - 'primary_schools': { - 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], - 'columns': [ - {'year': 2015, 'urban': 'AR', 'town': 'AS', 'rural': 'AT'}, - {'year': 2016, 'urban': 'AV', 'town': 'AW', 'rural': 'AX'}, - {'year': 2017, 'urban': 'AZ', 'town': 'BA', 'rural': 'BB'}, - {'year': 2018, 'urban': 'BD', 'town': 'BE', 'rural': 'BF'}, - {'year': 2019, 'urban': 'BH', 'town': 'BI', 'rural': 'BJ'}, - {'year': 2020, 'urban': 'BL', 'town': 'BM', 'rural': 'BN'}, - {'year': 2021, 'urban': 'BP', 'town': 'BQ', 'rural': 'BR'}, - {'year': 2022, 'urban': 'BT', 'town': 'BU', 'rural': 'BV'}, - {'year': 2023, 'urban': 'BX', 'town': 'BY', 'rural': 'BZ'}, - {'year': 2024, 'urban': 'CB', 'town': 'CC', 'rural': 'CD'} - ], - 'categories': ['urban', 'town', 'rural'] - }, + # 小学教育(每年份4列,取前3列) + 'primary_schools': { + 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], + 'columns': [ + {'year': 2015, 'urban': 'AR', 'town': 'AS', 'rural': 'AT'}, + {'year': 2016, 'urban': 'AV', 'town': 'AW', 'rural': 'AX'}, + {'year': 2017, 'urban': 'AZ', 'town': 'BA', 'rural': 'BB'}, + {'year': 2018, 'urban': 'BD', 'town': 'BE', 'rural': 'BF'}, + {'year': 2019, 'urban': 'BH', 'town': 'BI', 'rural': 'BJ'}, + {'year': 2020, 'urban': 'BL', 'town': 'BM', 'rural': 'BN'}, + {'year': 2021, 'urban': 'BP', 'town': 'BQ', 'rural': 'BR'}, + {'year': 2022, 'urban': 'BT', 'town': 'BU', 'rural': 'BV'}, + {'year': 2023, 'urban': 'BX', 'town': 'BY', 'rural': 'BZ'}, + {'year': 2024, 'urban': 'CB', 'town': 'CC', 'rural': 'CD'} + ], + 'categories': ['urban', 'town', 'rural'] + }, - # 初中教育 - 'junior_high_schools': { - 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], - 'columns': [ - {'year': 2015, 'urban': 'CF', 'town': 'CG', 'rural': 'CH'}, - {'year': 2016, 'urban': 'CJ', 'town': 'CK', 'rural': 'CL'}, - {'year': 2017, 'urban': 'CN', 'town': 'CO', 'rural': 'CP'}, - {'year': 2018, 'urban': 'CR', 'town': 'CS', 'rural': 'CT'}, - {'year': 2019, 'urban': 'CV', 'town': 'CW', 'rural': 'CX'}, - {'year': 2020, 'urban': 'CZ', 'town': 'DA', 'rural': 'DB'}, - {'year': 2021, 'urban': 'DD', 'town': 'DE', 'rural': 'DF'}, - {'year': 2022, 'urban': 'DH', 'town': 'DI', 'rural': 'DJ'}, - {'year': 2023, 'urban': 'DL', 'town': 'DM', 'rural': 'DN'}, - {'year': 2024, 'urban': 'DP', 'town': 'DQ', 'rural': 'DR'} - ], - 'categories': ['urban', 'town', 'rural'] - }, + # 初中教育 + 'junior_high_schools': { + 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], + 'columns': [ + {'year': 2015, 'urban': 'CF', 'town': 'CG', 'rural': 'CH'}, + {'year': 2016, 'urban': 'CJ', 'town': 'CK', 'rural': 'CL'}, + {'year': 2017, 'urban': 'CN', 'town': 'CO', 'rural': 'CP'}, + {'year': 2018, 'urban': 'CR', 'town': 'CS', 'rural': 'CT'}, + {'year': 2019, 'urban': 'CV', 'town': 'CW', 'rural': 'CX'}, + {'year': 2020, 'urban': 'CZ', 'town': 'DA', 'rural': 'DB'}, + {'year': 2021, 'urban': 'DD', 'town': 'DE', 'rural': 'DF'}, + {'year': 2022, 'urban': 'DH', 'town': 'DI', 'rural': 'DJ'}, + {'year': 2023, 'urban': 'DL', 'town': 'DM', 'rural': 'DN'}, + {'year': 2024, 'urban': 'DP', 'town': 'DQ', 'rural': 'DR'} + ], + 'categories': ['urban', 'town', 'rural'] + }, - # 普通高中教育 - 'senior_high_schools': { - 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], - 'columns': [ - {'year': 2015, 'urban': 'DT', 'town': 'DU', 'rural': 'DV'}, - {'year': 2016, 'urban': 'DX', 'town': 'DY', 'rural': 'DZ'}, - {'year': 2017, 'urban': 'EB', 'town': 'EC', 'rural': 'ED'}, - {'year': 2018, 'urban': 'EF', 'town': 'EG', 'rural': 'EH'}, - {'year': 2019, 'urban': 'EJ', 'town': 'EK', 'rural': 'EL'}, - {'year': 2020, 'urban': 'EN', 'town': 'EO', 'rural': 'EP'}, - {'year': 2021, 'urban': 'ER', 'town': 'ES', 'rural': 'ET'}, - {'year': 2022, 'urban': 'EV', 'town': 'EW', 'rural': 'EX'}, - {'year': 2023, 'urban': 'EZ', 'town': 'FA', 'rural': 'FB'}, - {'year': 2024, 'urban': 'FD', 'town': 'FE', 'rural': 'FF'} - ], - 'categories': ['urban', 'town', 'rural'] - }, + # 普通高中教育 + 'senior_high_schools': { + 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], + 'columns': [ + {'year': 2015, 'urban': 'DT', 'town': 'DU', 'rural': 'DV'}, + {'year': 2016, 'urban': 'DX', 'town': 'DY', 'rural': 'DZ'}, + {'year': 2017, 'urban': 'EB', 'town': 'EC', 'rural': 'ED'}, + {'year': 2018, 'urban': 'EF', 'town': 'EG', 'rural': 'EH'}, + {'year': 2019, 'urban': 'EJ', 'town': 'EK', 'rural': 'EL'}, + {'year': 2020, 'urban': 'EN', 'town': 'EO', 'rural': 'EP'}, + {'year': 2021, 'urban': 'ER', 'town': 'ES', 'rural': 'ET'}, + {'year': 2022, 'urban': 'EV', 'town': 'EW', 'rural': 'EX'}, + {'year': 2023, 'urban': 'EZ', 'town': 'FA', 'rural': 'FB'}, + {'year': 2024, 'urban': 'FD', 'town': 'FE', 'rural': 'FF'} + ], + 'categories': ['urban', 'town', 'rural'] + }, - # 中职教育(特殊:每年份1列) - 'vocational_schools': { - 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], - 'columns': [ - {'year': 2015, 'column': 'FH'}, - {'year': 2016, 'column': 'FI'}, - {'year': 2017, 'column': 'FJ'}, - {'year': 2018, 'column': 'FK'}, - {'year': 2019, 'column': 'FL'}, - {'year': 2020, 'column': 'FM'}, - {'year': 2021, 'column': 'FN'}, - {'year': 2022, 'column': 'FO'}, - {'year': 2023, 'column': 'FP'}, - {'year': 2024, 'column': 'FQ'} - ] - } - } - - # 遍历数据行(跳过前4行表头,与T4_2保持一致) - for row_num, row in enumerate(sheet.iter_rows(min_row=4, values_only=True), start=4): - # 区域名称从B列获取(索引1) - raw_name = row[1] if (len(row) > 1 and row[1] is not None) else '未知地区' - if not raw_name: # 跳过空行 - continue - - # 区域名称转换 - str_raw_name = str(raw_name).strip() if raw_name is not None else '未知地区' - area_info = query_area_info(str_raw_name) - if area_info: - area_name = area_info['full_name'] - area_code = area_info['area_code'] - if raw_name != area_name: - conversion_records.append({ - 'row': row_num, - 'raw_name': raw_name, - 'converted_name': area_name - }) - else: - area_name = raw_name - area_code = 'unknown' - name_conversion_errors.append(f"行 {row_num}: '{raw_name}'") - - area_data = { - 'area_name': area_name, - 'area_code': area_code, - 'raw_name': raw_name + # 中职教育(特殊:每年份1列) + 'vocational_schools': { + 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], + 'columns': [ + {'year': 2015, 'column': 'FH'}, + {'year': 2016, 'column': 'FI'}, + {'year': 2017, 'column': 'FJ'}, + {'year': 2018, 'column': 'FK'}, + {'year': 2019, 'column': 'FL'}, + {'year': 2020, 'column': 'FM'}, + {'year': 2021, 'column': 'FN'}, + {'year': 2022, 'column': 'FO'}, + {'year': 2023, 'column': 'FP'}, + {'year': 2024, 'column': 'FQ'} + ] + } } - # 提取各教育阶段数据 - for stage, config in data_columns.items(): - stage_data = {} - # 处理学前/小学/初中/高中(多类别) - if 'categories' in config: - for year_config in config['columns']: - year = year_config['year'] - year_data = {} - for category in config['categories']: - col_name = year_config[category] + # 遍历数据行(跳过前4行表头,与T4_2保持一致) + for row_num, row in enumerate(sheet.iter_rows(min_row=4, values_only=True), start=4): + # 区域名称从B列获取(索引1) + raw_name = row[1] if (len(row) > 1 and row[1] is not None) else '未知地区' + if not raw_name: # 跳过空行 + continue + + # 区域名称转换 + str_raw_name = str(raw_name).strip() if raw_name is not None else '未知地区' + area_info = query_area_info(str_raw_name) + if area_info: + area_name = area_info['full_name'] + area_code = area_info['area_code'] + if raw_name != area_name: + conversion_records.append({ + 'row': row_num, + 'raw_name': raw_name, + 'converted_name': area_name + }) + else: + area_name = raw_name + area_code = 'unknown' + name_conversion_errors.append(f"行 {row_num}: '{raw_name}'") + + area_data = { + 'area_name': area_name, + 'area_code': area_code, + 'raw_name': raw_name + } + + # 提取各教育阶段数据 + for stage, config in data_columns.items(): + stage_data = {} + # 处理学前/小学/初中/高中(多类别) + if 'categories' in config: + for year_config in config['columns']: + year = year_config['year'] + year_data = {} + for category in config['categories']: + col_name = year_config[category] + col_idx = openpyxl.utils.column_index_from_string(col_name) - 1 + if col_idx < len(row): + value = row[col_idx] + # 数据清洗 + if value is None: + year_data[category] = 0 + else: + str_value = str(value).strip() + if str_value in ['', '####']: + year_data[category] = 0 + else: + year_data[category] = int(str_value) if str_value.isdigit() else 0 + stage_data[str(year)] = year_data + # 处理中职教育(单值) + else: + for year_config in config['columns']: + year = year_config['year'] + col_name = year_config['column'] col_idx = openpyxl.utils.column_index_from_string(col_name) - 1 if col_idx < len(row): value = row[col_idx] - # 数据清洗 if value is None: - year_data[category] = 0 + stage_data[str(year)] = 0 else: str_value = str(value).strip() - if str_value in ['', '####']: - year_data[category] = 0 - else: - year_data[category] = int(str_value) if str_value.isdigit() else 0 - stage_data[str(year)] = year_data - # 处理中职教育(单值) - else: - for year_config in config['columns']: - year = year_config['year'] - col_name = year_config['column'] - col_idx = openpyxl.utils.column_index_from_string(col_name) - 1 - if col_idx < len(row): - value = row[col_idx] - if value is None: - stage_data[str(year)] = 0 - else: - str_value = str(value).strip() - stage_data[str(year)] = int(str_value) if str_value.isdigit() else 0 - area_data[stage] = stage_data + stage_data[str(year)] = int(str_value) if str_value.isdigit() else 0 + area_data[stage] = stage_data - school_data.append(area_data) + school_data.append(area_data) - workbook.close() + # 保存JSON + with open(JSON_PATH, 'w', encoding='utf-8') as f: + json.dump(school_data, f, ensure_ascii=False, indent=2) - # 保存JSON - with open(JSON_PATH, 'w', encoding='utf-8') as f: - json.dump(school_data, f, ensure_ascii=False, indent=2) + # 输出统计信息 + print(f"✅ 学校数数据提取完成,已保存至:{JSON_PATH}") + print(f"📊 共处理 {len(school_data)} 条地区数据") + print("\n=== 名称转换记录 ===") + if conversion_records: + for record in conversion_records: + print(f"🔄 行 {record['row']}: {record['raw_name']} → {record['converted_name']}") + print(f"📊 共检测到 {len(conversion_records)} 项名称转换") + else: + print("📝 不存在名称转换的情况") + if name_conversion_errors: + print(f"⚠️ 发现 {len(name_conversion_errors)} 个区域名称转换失败:") + for error in name_conversion_errors: + print(f" - {error}") - # 输出统计信息 - print(f"✅ 学校数数据提取完成,已保存至:{JSON_PATH}") - print(f"📊 共处理 {len(school_data)} 条地区数据") - print("\n=== 名称转换记录 ===") - if conversion_records: - for record in conversion_records: - print(f"🔄 行 {record['row']}: {record['raw_name']} → {record['converted_name']}") - print(f"📊 共检测到 {len(conversion_records)} 项名称转换") - else: - print("📝 不存在名称转换的情况") - if name_conversion_errors: - print(f"⚠️ 发现 {len(name_conversion_errors)} 个区域名称转换失败:") - for error in name_conversion_errors: - print(f" - {error}") + except FileNotFoundError: + print(f"🔴 错误:Excel文件 '{file_name}' 不存在") + except Exception as e: + print(f"🔴 处理数据时发生错误:{str(e)}{traceback.format_exc()}") # 修复:添加闭合引号 + finally: + try: + if workbook: + workbook.close() + except: + pass -except FileNotFoundError: - print(f"🔴 错误:Excel文件 '{file_name}' 不存在") -except Exception as e: - print(f"🔴 处理数据时发生错误:{str(e)}{traceback.format_exc()}") # 修复:添加闭合引号 \ No newline at end of file +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/Tools/T8_SchoolMianJi.py b/Tools/T8_SchoolMianJi.py index f3523d3..1e9372c 100644 --- a/Tools/T8_SchoolMianJi.py +++ b/Tools/T8_SchoolMianJi.py @@ -6,266 +6,272 @@ import traceback from Config.Config import EXCEL_PATH from Util.AreaUtil import query_area_info -# 创建数据保存目录 -DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'Data') -os.makedirs(DATA_DIR, exist_ok=True) -JSON_PATH = os.path.join(DATA_DIR, 'SchoolArea.json') # 修改为学校面积的JSON路径 +def main(): + """主函数:提取学校面积数据""" + # 创建数据保存目录 + DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'Data') + os.makedirs(DATA_DIR, exist_ok=True) + JSON_PATH = os.path.join(DATA_DIR, 'SchoolArea.json') # 修改为学校面积的JSON路径 -file_name = EXCEL_PATH -area_data = [] -name_conversion_errors = [] # 记录转换失败的名称 -conversion_records = [] # 定义转换记录变量 + file_name = EXCEL_PATH + area_data = [] + name_conversion_errors = [] # 记录转换失败的名称 + conversion_records = [] # 定义转换记录变量 + + workbook = None # 初始化workbook变量,确保在finally块中可以访问 -try: - # 加载工作簿并选择学校面积、教学辅助房面积Sheet - workbook = openpyxl.load_workbook(file_name, data_only=True) - if '学校面积、教学辅助房面积' not in workbook.sheetnames: - print("❌ 错误:未找到'学校面积、教学辅助房面积'Sheet") - exit(1) - sheet = workbook['学校面积、教学辅助房面积'] + try: + # 加载工作簿并选择学校面积、教学辅助房面积Sheet + workbook = openpyxl.load_workbook(file_name, data_only=True) + if '学校面积、教学辅助房面积' not in workbook.sheetnames: + print("❌ 错误:未找到'学校面积、教学辅助房面积'Sheet") + return + sheet = workbook['学校面积、教学辅助房面积'] - # 定义数据列范围与英文属性映射 - data_columns = { - # 学前教育(每年份8列:学校占地面积[总计/城区/镇区/乡村],教学及辅助用房[总计/城区/镇区/乡村]) - 'preschool_area': { - 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], - 'columns': [ - {'year': 2015, 'school_total': 'D', 'school_urban': 'E', 'school_town': 'F', 'school_rural': 'G', 'teaching_total': 'H', 'teaching_urban': 'I', 'teaching_town': 'J', 'teaching_rural': 'K'}, - {'year': 2016, 'school_total': 'L', 'school_urban': 'M', 'school_town': 'N', 'school_rural': 'O', 'teaching_total': 'P', 'teaching_urban': 'Q', 'teaching_town': 'R', 'teaching_rural': 'S'}, - {'year': 2017, 'school_total': 'T', 'school_urban': 'U', 'school_town': 'V', 'school_rural': 'W', 'teaching_total': 'X', 'teaching_urban': 'Y', 'teaching_town': 'Z', 'teaching_rural': 'AA'}, - {'year': 2018, 'school_total': 'AB', 'school_urban': 'AC', 'school_town': 'AD', 'school_rural': 'AE', 'teaching_total': 'AF', 'teaching_urban': 'AG', 'teaching_town': 'AH', 'teaching_rural': 'AI'}, - {'year': 2019, 'school_total': 'AJ', 'school_urban': 'AK', 'school_town': 'AL', 'school_rural': 'AM', 'teaching_total': 'AN', 'teaching_urban': 'AO', 'teaching_town': 'AP', 'teaching_rural': 'AQ'}, - {'year': 2020, 'school_total': 'AR', 'school_urban': 'AS', 'school_town': 'AT', 'school_rural': 'AU', 'teaching_total': 'AV', 'teaching_urban': 'AW', 'teaching_town': 'AX', 'teaching_rural': 'AY'}, - {'year': 2021, 'school_total': 'AZ', 'school_urban': 'BA', 'school_town': 'BB', 'school_rural': 'BC', 'teaching_total': 'BD', 'teaching_urban': 'BE', 'teaching_town': 'BF', 'teaching_rural': 'BG'}, - {'year': 2022, 'school_total': 'BH', 'school_urban': 'BI', 'school_town': 'BJ', 'school_rural': 'BK', 'teaching_total': 'BL', 'teaching_urban': 'BM', 'teaching_town': 'BN', 'teaching_rural': 'BO'}, - {'year': 2023, 'school_total': 'BP', 'school_urban': 'BQ', 'school_town': 'BR', 'school_rural': 'BS', 'teaching_total': 'BT', 'teaching_urban': 'BU', 'teaching_town': 'BV', 'teaching_rural': 'BW'}, - {'year': 2024, 'school_total': 'BX', 'school_urban': 'BY', 'school_town': 'BZ', 'school_rural': 'CA', 'teaching_total': 'CB', 'teaching_urban': 'CC', 'teaching_town': 'CD', 'teaching_rural': 'CE'} - ] - }, + # 定义数据列范围与英文属性映射 + data_columns = { + # 学前教育(每年份8列:学校占地面积[总计/城区/镇区/乡村],教学及辅助用房[总计/城区/镇区/乡村]) + 'preschool_area': { + 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], + 'columns': [ + {'year': 2015, 'school_total': 'D', 'school_urban': 'E', 'school_town': 'F', 'school_rural': 'G', 'teaching_total': 'H', 'teaching_urban': 'I', 'teaching_town': 'J', 'teaching_rural': 'K'}, + {'year': 2016, 'school_total': 'L', 'school_urban': 'M', 'school_town': 'N', 'school_rural': 'O', 'teaching_total': 'P', 'teaching_urban': 'Q', 'teaching_town': 'R', 'teaching_rural': 'S'}, + {'year': 2017, 'school_total': 'T', 'school_urban': 'U', 'school_town': 'V', 'school_rural': 'W', 'teaching_total': 'X', 'teaching_urban': 'Y', 'teaching_town': 'Z', 'teaching_rural': 'AA'}, + {'year': 2018, 'school_total': 'AB', 'school_urban': 'AC', 'school_town': 'AD', 'school_rural': 'AE', 'teaching_total': 'AF', 'teaching_urban': 'AG', 'teaching_town': 'AH', 'teaching_rural': 'AI'}, + {'year': 2019, 'school_total': 'AJ', 'school_urban': 'AK', 'school_town': 'AL', 'school_rural': 'AM', 'teaching_total': 'AN', 'teaching_urban': 'AO', 'teaching_town': 'AP', 'teaching_rural': 'AQ'}, + {'year': 2020, 'school_total': 'AR', 'school_urban': 'AS', 'school_town': 'AT', 'school_rural': 'AU', 'teaching_total': 'AV', 'teaching_urban': 'AW', 'teaching_town': 'AX', 'teaching_rural': 'AY'}, + {'year': 2021, 'school_total': 'AZ', 'school_urban': 'BA', 'school_town': 'BB', 'school_rural': 'BC', 'teaching_total': 'BD', 'teaching_urban': 'BE', 'teaching_town': 'BF', 'teaching_rural': 'BG'}, + {'year': 2022, 'school_total': 'BH', 'school_urban': 'BI', 'school_town': 'BJ', 'school_rural': 'BK', 'teaching_total': 'BL', 'teaching_urban': 'BM', 'teaching_town': 'BN', 'teaching_rural': 'BO'}, + {'year': 2023, 'school_total': 'BP', 'school_urban': 'BQ', 'school_town': 'BR', 'school_rural': 'BS', 'teaching_total': 'BT', 'teaching_urban': 'BU', 'teaching_town': 'BV', 'teaching_rural': 'BW'}, + {'year': 2024, 'school_total': 'BX', 'school_urban': 'BY', 'school_town': 'BZ', 'school_rural': 'CA', 'teaching_total': 'CB', 'teaching_urban': 'CC', 'teaching_town': 'CD', 'teaching_rural': 'CE'} + ] + }, - # 小学教育 - 'primary_area': { - 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], - 'columns': [ - {'year': 2015, 'school_total': 'CF', 'school_urban': 'CG', 'school_town': 'CH', 'school_rural': 'CI', 'teaching_total': 'CJ', 'teaching_urban': 'CK', 'teaching_town': 'CL', 'teaching_rural': 'CM'}, - {'year': 2016, 'school_total': 'CN', 'school_urban': 'CO', 'school_town': 'CP', 'school_rural': 'CQ', 'teaching_total': 'CR', 'teaching_urban': 'CS', 'teaching_town': 'CT', 'teaching_rural': 'CU'}, - {'year': 2017, 'school_total': 'CV', 'school_urban': 'CW', 'school_town': 'CX', 'school_rural': 'CY', 'teaching_total': 'CZ', 'teaching_urban': 'DA', 'teaching_town': 'DB', 'teaching_rural': 'DC'}, - {'year': 2018, 'school_total': 'DD', 'school_urban': 'DE', 'school_town': 'DF', 'school_rural': 'DG', 'teaching_total': 'DH', 'teaching_urban': 'DI', 'teaching_town': 'DJ', 'teaching_rural': 'DK'}, - {'year': 2019, 'school_total': 'DL', 'school_urban': 'DM', 'school_town': 'DN', 'school_rural': 'DO', 'teaching_total': 'DP', 'teaching_urban': 'DQ', 'teaching_town': 'DR', 'teaching_rural': 'DS'}, - {'year': 2020, 'school_total': 'DT', 'school_urban': 'DU', 'school_town': 'DV', 'school_rural': 'DW', 'teaching_total': 'DX', 'teaching_urban': 'DY', 'teaching_town': 'DZ', 'teaching_rural': 'EA'}, - {'year': 2021, 'school_total': 'EB', 'school_urban': 'EC', 'school_town': 'ED', 'school_rural': 'EE', 'teaching_total': 'EF', 'teaching_urban': 'EG', 'teaching_town': 'EH', 'teaching_rural': 'EI'}, - {'year': 2022, 'school_total': 'EJ', 'school_urban': 'EK', 'school_town': 'EL', 'school_rural': 'EM', 'teaching_total': 'EN', 'teaching_urban': 'EO', 'teaching_town': 'EP', 'teaching_rural': 'EQ'}, - {'year': 2023, 'school_total': 'ER', 'school_urban': 'ES', 'school_town': 'ET', 'school_rural': 'EU', 'teaching_total': 'EV', 'teaching_urban': 'EW', 'teaching_town': 'EX', 'teaching_rural': 'EY'}, - {'year': 2024, 'school_total': 'EZ', 'school_urban': 'FA', 'school_town': 'FB', 'school_rural': 'FC', 'teaching_total': 'FD', 'teaching_urban': 'FE', 'teaching_town': 'FF', 'teaching_rural': 'FG'} - ] - }, + # 小学教育 + 'primary_area': { + 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], + 'columns': [ + {'year': 2015, 'school_total': 'CF', 'school_urban': 'CG', 'school_town': 'CH', 'school_rural': 'CI', 'teaching_total': 'CJ', 'teaching_urban': 'CK', 'teaching_town': 'CL', 'teaching_rural': 'CM'}, + {'year': 2016, 'school_total': 'CN', 'school_urban': 'CO', 'school_town': 'CP', 'school_rural': 'CQ', 'teaching_total': 'CR', 'teaching_urban': 'CS', 'teaching_town': 'CT', 'teaching_rural': 'CU'}, + {'year': 2017, 'school_total': 'CV', 'school_urban': 'CW', 'school_town': 'CX', 'school_rural': 'CY', 'teaching_total': 'CZ', 'teaching_urban': 'DA', 'teaching_town': 'DB', 'teaching_rural': 'DC'}, + {'year': 2018, 'school_total': 'DD', 'school_urban': 'DE', 'school_town': 'DF', 'school_rural': 'DG', 'teaching_total': 'DH', 'teaching_urban': 'DI', 'teaching_town': 'DJ', 'teaching_rural': 'DK'}, + {'year': 2019, 'school_total': 'DL', 'school_urban': 'DM', 'school_town': 'DN', 'school_rural': 'DO', 'teaching_total': 'DP', 'teaching_urban': 'DQ', 'teaching_town': 'DR', 'teaching_rural': 'DS'}, + {'year': 2020, 'school_total': 'DT', 'school_urban': 'DU', 'school_town': 'DV', 'school_rural': 'DW', 'teaching_total': 'DX', 'teaching_urban': 'DY', 'teaching_town': 'DZ', 'teaching_rural': 'EA'}, + {'year': 2021, 'school_total': 'EB', 'school_urban': 'EC', 'school_town': 'ED', 'school_rural': 'EE', 'teaching_total': 'EF', 'teaching_urban': 'EG', 'teaching_town': 'EH', 'teaching_rural': 'EI'}, + {'year': 2022, 'school_total': 'EJ', 'school_urban': 'EK', 'school_town': 'EL', 'school_rural': 'EM', 'teaching_total': 'EN', 'teaching_urban': 'EO', 'teaching_town': 'EP', 'teaching_rural': 'EQ'}, + {'year': 2023, 'school_total': 'ER', 'school_urban': 'ES', 'school_town': 'ET', 'school_rural': 'EU', 'teaching_total': 'EV', 'teaching_urban': 'EW', 'teaching_town': 'EX', 'teaching_rural': 'EY'}, + {'year': 2024, 'school_total': 'EZ', 'school_urban': 'FA', 'school_town': 'FB', 'school_rural': 'FC', 'teaching_total': 'FD', 'teaching_urban': 'FE', 'teaching_town': 'FF', 'teaching_rural': 'FG'} + ] + }, - # 初中教育 - 'junior_high_area': { - 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], - 'columns': [ - {'year': 2015, 'school_total': 'FH', 'school_urban': 'FI', 'school_town': 'FJ', 'school_rural': 'FK', 'teaching_total': 'FL', 'teaching_urban': 'FM', 'teaching_town': 'FN', 'teaching_rural': 'FO'}, - {'year': 2016, 'school_total': 'FP', 'school_urban': 'FQ', 'school_town': 'FR', 'school_rural': 'FS', 'teaching_total': 'FT', 'teaching_urban': 'FU', 'teaching_town': 'FV', 'teaching_rural': 'FW'}, - {'year': 2017, 'school_total': 'FX', 'school_urban': 'FY', 'school_town': 'FZ', 'school_rural': 'GA', 'teaching_total': 'GB', 'teaching_urban': 'GC', 'teaching_town': 'GD', 'teaching_rural': 'GE'}, - {'year': 2018, 'school_total': 'GF', 'school_urban': 'GG', 'school_town': 'GH', 'school_rural': 'GI', 'teaching_total': 'GJ', 'teaching_urban': 'GK', 'teaching_town': 'GL', 'teaching_rural': 'GM'}, - {'year': 2019, 'school_total': 'GN', 'school_urban': 'GO', 'school_town': 'GP', 'school_rural': 'GQ', 'teaching_total': 'GR', 'teaching_urban': 'GS', 'teaching_town': 'GT', 'teaching_rural': 'GU'}, - {'year': 2020, 'school_total': 'GV', 'school_urban': 'GW', 'school_town': 'GX', 'school_rural': 'GY', 'teaching_total': 'GZ', 'teaching_urban': 'HA', 'teaching_town': 'HB', 'teaching_rural': 'HC'}, - {'year': 2021, 'school_total': 'HD', 'school_urban': 'HE', 'school_town': 'HF', 'school_rural': 'HG', 'teaching_total': 'HH', 'teaching_urban': 'HI', 'teaching_town': 'HJ', 'teaching_rural': 'HK'}, - {'year': 2022, 'school_total': 'HL', 'school_urban': 'HM', 'school_town': 'HN', 'school_rural': 'HO', 'teaching_total': 'HP', 'teaching_urban': 'HQ', 'teaching_town': 'HR', 'teaching_rural': 'HS'}, - {'year': 2023, 'school_total': 'HT', 'school_urban': 'HU', 'school_town': 'HV', 'school_rural': 'HW', 'teaching_total': 'HX', 'teaching_urban': 'HY', 'teaching_town': 'HZ', 'teaching_rural': 'IA'}, - {'year': 2024, 'school_total': 'IB', 'school_urban': 'IC', 'school_town': 'ID', 'school_rural': 'IE', 'teaching_total': 'IF', 'teaching_urban': 'IG', 'teaching_town': 'IH', 'teaching_rural': 'II'} - ] - }, + # 初中教育 + 'junior_high_area': { + 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], + 'columns': [ + {'year': 2015, 'school_total': 'FH', 'school_urban': 'FI', 'school_town': 'FJ', 'school_rural': 'FK', 'teaching_total': 'FL', 'teaching_urban': 'FM', 'teaching_town': 'FN', 'teaching_rural': 'FO'}, + {'year': 2016, 'school_total': 'FP', 'school_urban': 'FQ', 'school_town': 'FR', 'school_rural': 'FS', 'teaching_total': 'FT', 'teaching_urban': 'FU', 'teaching_town': 'FV', 'teaching_rural': 'FW'}, + {'year': 2017, 'school_total': 'FX', 'school_urban': 'FY', 'school_town': 'FZ', 'school_rural': 'GA', 'teaching_total': 'GB', 'teaching_urban': 'GC', 'teaching_town': 'GD', 'teaching_rural': 'GE'}, + {'year': 2018, 'school_total': 'GF', 'school_urban': 'GG', 'school_town': 'GH', 'school_rural': 'GI', 'teaching_total': 'GJ', 'teaching_urban': 'GK', 'teaching_town': 'GL', 'teaching_rural': 'GM'}, + {'year': 2019, 'school_total': 'GN', 'school_urban': 'GO', 'school_town': 'GP', 'school_rural': 'GQ', 'teaching_total': 'GR', 'teaching_urban': 'GS', 'teaching_town': 'GT', 'teaching_rural': 'GU'}, + {'year': 2020, 'school_total': 'GV', 'school_urban': 'GW', 'school_town': 'GX', 'school_rural': 'GY', 'teaching_total': 'GZ', 'teaching_urban': 'HA', 'teaching_town': 'HB', 'teaching_rural': 'HC'}, + {'year': 2021, 'school_total': 'HD', 'school_urban': 'HE', 'school_town': 'HF', 'school_rural': 'HG', 'teaching_total': 'HH', 'teaching_urban': 'HI', 'teaching_town': 'HJ', 'teaching_rural': 'HK'}, + {'year': 2022, 'school_total': 'HL', 'school_urban': 'HM', 'school_town': 'HN', 'school_rural': 'HO', 'teaching_total': 'HP', 'teaching_urban': 'HQ', 'teaching_town': 'HR', 'teaching_rural': 'HS'}, + {'year': 2023, 'school_total': 'HT', 'school_urban': 'HU', 'school_town': 'HV', 'school_rural': 'HW', 'teaching_total': 'HX', 'teaching_urban': 'HY', 'teaching_town': 'HZ', 'teaching_rural': 'IA'}, + {'year': 2024, 'school_total': 'IB', 'school_urban': 'IC', 'school_town': 'ID', 'school_rural': 'IE', 'teaching_total': 'IF', 'teaching_urban': 'IG', 'teaching_town': 'IH', 'teaching_rural': 'II'} + ] + }, - # 高中教育 - 'senior_high_area': { - 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], - 'columns': [ - {'year': 2015, 'school_total': 'IJ', 'school_urban': 'IK', 'school_town': 'IL', 'school_rural': 'IM', 'teaching_total': 'IN', 'teaching_urban': 'IO', 'teaching_town': 'IP', 'teaching_rural': 'IQ'}, - {'year': 2016, 'school_total': 'IR', 'school_urban': 'IS', 'school_town': 'IT', 'school_rural': 'IU', 'teaching_total': 'IV', 'teaching_urban': 'IW', 'teaching_town': 'IX', 'teaching_rural': 'IY'}, - {'year': 2017, 'school_total': 'IZ', 'school_urban': 'JA', 'school_town': 'JB', 'school_rural': 'JC', 'teaching_total': 'JD', 'teaching_urban': 'JE', 'teaching_town': 'JF', 'teaching_rural': 'JG'}, - {'year': 2018, 'school_total': 'JH', 'school_urban': 'JI', 'school_town': 'JJ', 'school_rural': 'JK', 'teaching_total': 'JL', 'teaching_urban': 'JM', 'teaching_town': 'JN', 'teaching_rural': 'JO'}, - {'year': 2019, 'school_total': 'JP', 'school_urban': 'JQ', 'school_town': 'JR', 'school_rural': 'JS', 'teaching_total': 'JT', 'teaching_urban': 'JU', 'teaching_town': 'JV', 'teaching_rural': 'JW'}, - {'year': 2020, 'school_total': 'JX', 'school_urban': 'JY', 'school_town': 'JZ', 'school_rural': 'KA', 'teaching_total': 'KB', 'teaching_urban': 'KC', 'teaching_town': 'KD', 'teaching_rural': 'KE'}, - {'year': 2021, 'school_total': 'KF', 'school_urban': 'KG', 'school_town': 'KH', 'school_rural': 'KI', 'teaching_total': 'KJ', 'teaching_urban': 'KK', 'teaching_town': 'KL', 'teaching_rural': 'KM'}, - {'year': 2022, 'school_total': 'KN', 'school_urban': 'KO', 'school_town': 'KP', 'school_rural': 'KQ', 'teaching_total': 'KR', 'teaching_urban': 'KS', 'teaching_town': 'KT', 'teaching_rural': 'KU'}, - {'year': 2023, 'school_total': 'KV', 'school_urban': 'KW', 'school_town': 'KX', 'school_rural': 'KY', 'teaching_total': 'KZ', 'teaching_urban': 'LA', 'teaching_town': 'LB', 'teaching_rural': 'LC'}, - {'year': 2024, 'school_total': 'LD', 'school_urban': 'LE', 'school_town': 'LF', 'school_rural': 'LG', 'teaching_total': 'LH', 'teaching_urban': 'LI', 'teaching_town': 'LJ', 'teaching_rural': 'LK'} - ] - }, + # 高中教育 + 'senior_high_area': { + 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], + 'columns': [ + {'year': 2015, 'school_total': 'IJ', 'school_urban': 'IK', 'school_town': 'IL', 'school_rural': 'IM', 'teaching_total': 'IN', 'teaching_urban': 'IO', 'teaching_town': 'IP', 'teaching_rural': 'IQ'}, + {'year': 2016, 'school_total': 'IR', 'school_urban': 'IS', 'school_town': 'IT', 'school_rural': 'IU', 'teaching_total': 'IV', 'teaching_urban': 'IW', 'teaching_town': 'IX', 'teaching_rural': 'IY'}, + {'year': 2017, 'school_total': 'IZ', 'school_urban': 'JA', 'school_town': 'JB', 'school_rural': 'JC', 'teaching_total': 'JD', 'teaching_urban': 'JE', 'teaching_town': 'JF', 'teaching_rural': 'JG'}, + {'year': 2018, 'school_total': 'JH', 'school_urban': 'JI', 'school_town': 'JJ', 'school_rural': 'JK', 'teaching_total': 'JL', 'teaching_urban': 'JM', 'teaching_town': 'JN', 'teaching_rural': 'JO'}, + {'year': 2019, 'school_total': 'JP', 'school_urban': 'JQ', 'school_town': 'JR', 'school_rural': 'JS', 'teaching_total': 'JT', 'teaching_urban': 'JU', 'teaching_town': 'JV', 'teaching_rural': 'JW'}, + {'year': 2020, 'school_total': 'JX', 'school_urban': 'JY', 'school_town': 'JZ', 'school_rural': 'KA', 'teaching_total': 'KB', 'teaching_urban': 'KC', 'teaching_town': 'KD', 'teaching_rural': 'KE'}, + {'year': 2021, 'school_total': 'KF', 'school_urban': 'KG', 'school_town': 'KH', 'school_rural': 'KI', 'teaching_total': 'KJ', 'teaching_urban': 'KK', 'teaching_town': 'KL', 'teaching_rural': 'KM'}, + {'year': 2022, 'school_total': 'KN', 'school_urban': 'KO', 'school_town': 'KP', 'school_rural': 'KQ', 'teaching_total': 'KR', 'teaching_urban': 'KS', 'teaching_town': 'KT', 'teaching_rural': 'KU'}, + {'year': 2023, 'school_total': 'KV', 'school_urban': 'KW', 'school_town': 'KX', 'school_rural': 'KY', 'teaching_total': 'KZ', 'teaching_urban': 'LA', 'teaching_town': 'LB', 'teaching_rural': 'LC'}, + {'year': 2024, 'school_total': 'LD', 'school_urban': 'LE', 'school_town': 'LF', 'school_rural': 'LG', 'teaching_total': 'LH', 'teaching_urban': 'LI', 'teaching_town': 'LJ', 'teaching_rural': 'LK'} + ] + }, - # 中职教育(特殊:每年2列) - 'vocational_area': { - 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], - 'columns': [ - {'year': 2015, 'school_total': 'LL', 'teaching_total': 'LM'}, - {'year': 2016, 'school_total': 'LN', 'teaching_total': 'LO'}, - {'year': 2017, 'school_total': 'LP', 'teaching_total': 'LQ'}, - {'year': 2018, 'school_total': 'LR', 'teaching_total': 'LS'}, - {'year': 2019, 'school_total': 'LT', 'teaching_total': 'LU'}, - {'year': 2020, 'school_total': 'LV', 'teaching_total': 'LW'}, - {'year': 2021, 'school_total': 'LX', 'teaching_total': 'LY'}, - {'year': 2022, 'school_total': 'LZ', 'teaching_total': 'MA'}, - {'year': 2023, 'school_total': 'MB', 'teaching_total': 'MC'}, - {'year': 2024, 'school_total': 'MD', 'teaching_total': 'ME'} - ] - } - } - - # 遍历数据行(跳过前4行表头,从第5行开始) - for row_num, row in enumerate(sheet.iter_rows(min_row=5, values_only=True), start=5): - # 区域名称从B列获取(索引1) - raw_name = row[1] if (len(row) > 1 and row[1] is not None) else '未知地区' - if not raw_name: # 跳过空行 - continue - - # 区域名称转换 - str_raw_name = str(raw_name).strip() if raw_name is not None else '未知地区' - area_info = query_area_info(str_raw_name) - if area_info and isinstance(area_info, dict) and 'full_name' in area_info and 'area_code' in area_info: - area_name = area_info['full_name'] - area_code = area_info['area_code'] - if raw_name != area_name: - conversion_records.append({ - 'row': row_num, - 'raw_name': raw_name, - 'converted_name': area_name - }) - else: - area_name = raw_name - area_code = 'unknown' - name_conversion_errors.append(f"行 {row_num}: '{raw_name}'") - - # 循环中创建区域数据字典(重命名变量) - current_area_data = { - 'area_name': area_name, - 'area_code': area_code, - 'raw_name': raw_name + # 中职教育(特殊:每年2列) + 'vocational_area': { + 'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], + 'columns': [ + {'year': 2015, 'school_total': 'LL', 'teaching_total': 'LM'}, + {'year': 2016, 'school_total': 'LN', 'teaching_total': 'LO'}, + {'year': 2017, 'school_total': 'LP', 'teaching_total': 'LQ'}, + {'year': 2018, 'school_total': 'LR', 'teaching_total': 'LS'}, + {'year': 2019, 'school_total': 'LT', 'teaching_total': 'LU'}, + {'year': 2020, 'school_total': 'LV', 'teaching_total': 'LW'}, + {'year': 2021, 'school_total': 'LX', 'teaching_total': 'LY'}, + {'year': 2022, 'school_total': 'LZ', 'teaching_total': 'MA'}, + {'year': 2023, 'school_total': 'MB', 'teaching_total': 'MC'}, + {'year': 2024, 'school_total': 'MD', 'teaching_total': 'ME'} + ] + } } - # 提取各教育阶段面积数据 - for stage, config in data_columns.items(): - stage_data = {} - for year_config in config['columns']: - year = year_config['year'] - year_data = {} - # 处理学校占地面积数据 - school_cols = ['school_total', 'school_urban', 'school_town', 'school_rural'] - has_school_categories = all(col in year_config for col in school_cols) - - if has_school_categories: - # 处理分类学校面积数据 - for col in school_cols: - col_name = year_config[col] + # 遍历数据行(跳过前4行表头,从第5行开始) + for row_num, row in enumerate(sheet.iter_rows(min_row=5, values_only=True), start=5): + # 区域名称从B列获取(索引1) + raw_name = row[1] if (len(row) > 1 and row[1] is not None) else '未知地区' + if not raw_name: # 跳过空行 + continue + + # 区域名称转换 + str_raw_name = str(raw_name).strip() if raw_name is not None else '未知地区' + area_info = query_area_info(str_raw_name) + if area_info and isinstance(area_info, dict) and 'full_name' in area_info and 'area_code' in area_info: + area_name = area_info['full_name'] + area_code = area_info['area_code'] + if raw_name != area_name: + conversion_records.append({ + 'row': row_num, + 'raw_name': raw_name, + 'converted_name': area_name + }) + else: + area_name = raw_name + area_code = 'unknown' + name_conversion_errors.append(f"行 {row_num}: '{raw_name}'") + + # 循环中创建区域数据字典(重命名变量) + current_area_data = { + 'area_name': area_name, + 'area_code': area_code, + 'raw_name': raw_name + } + + # 提取各教育阶段面积数据 + for stage, config in data_columns.items(): + stage_data = {} + for year_config in config['columns']: + year = year_config['year'] + year_data = {} + # 处理学校占地面积数据 + school_cols = ['school_total', 'school_urban', 'school_town', 'school_rural'] + has_school_categories = all(col in year_config for col in school_cols) + + if has_school_categories: + # 处理分类学校面积数据 + for col in school_cols: + col_name = year_config[col] + col_idx = openpyxl.utils.column_index_from_string(col_name) - 1 + if col_idx < len(row): + value = row[col_idx] + # 数据清洗与转换 + if value is None: + year_data[col] = 0 + else: + str_value = str(value).strip() + if str_value in ['', '####']: + year_data[col] = 0 + else: + try: + year_data[col] = float(str_value) + except ValueError: + year_data[col] = 0 + else: + # 处理中职学校总面积 + col_name = year_config['school_total'] col_idx = openpyxl.utils.column_index_from_string(col_name) - 1 if col_idx < len(row): value = row[col_idx] - # 数据清洗与转换 if value is None: - year_data[col] = 0 - else: - str_value = str(value).strip() - if str_value in ['', '####']: - year_data[col] = 0 - else: - try: - year_data[col] = float(str_value) - except ValueError: - year_data[col] = 0 - else: - # 处理中职学校总面积 - col_name = year_config['school_total'] - col_idx = openpyxl.utils.column_index_from_string(col_name) - 1 - if col_idx < len(row): - value = row[col_idx] - if value is None: - year_data['school_total'] = 0 - else: - str_value = str(value).strip() - if str_value in ['', '####']: year_data['school_total'] = 0 else: - try: - year_data['school_total'] = float(str_value) - except ValueError: + str_value = str(value).strip() + if str_value in ['', '####']: year_data['school_total'] = 0 - - # 处理教学辅助用房面积数据 - teaching_cols = ['teaching_total', 'teaching_urban', 'teaching_town', 'teaching_rural'] - has_teaching_categories = all(col in year_config for col in teaching_cols) - - if has_teaching_categories: - # 处理分类教学辅助用房面积数据 - for col in teaching_cols: - col_name = year_config[col] + else: + try: + year_data['school_total'] = float(str_value) + except ValueError: + year_data['school_total'] = 0 + + # 处理教学辅助用房面积数据 + teaching_cols = ['teaching_total', 'teaching_urban', 'teaching_town', 'teaching_rural'] + has_teaching_categories = all(col in year_config for col in teaching_cols) + + if has_teaching_categories: + # 处理分类教学辅助用房面积数据 + for col in teaching_cols: + col_name = year_config[col] + col_idx = openpyxl.utils.column_index_from_string(col_name) - 1 + if col_idx < len(row): + value = row[col_idx] + # 数据清洗与转换 + if value is None: + year_data[col] = 0 + else: + str_value = str(value).strip() + if str_value in ['', '####']: + year_data[col] = 0 + else: + try: + year_data[col] = float(str_value) + except ValueError: + year_data[col] = 0 + else: + # 处理中职教学辅助用房总面积 + col_name = year_config['teaching_total'] col_idx = openpyxl.utils.column_index_from_string(col_name) - 1 if col_idx < len(row): value = row[col_idx] - # 数据清洗与转换 if value is None: - year_data[col] = 0 + year_data['teaching_total'] = 0 else: str_value = str(value).strip() if str_value in ['', '####']: - year_data[col] = 0 + year_data['teaching_total'] = 0 else: try: - year_data[col] = float(str_value) + year_data['teaching_total'] = float(str_value) except ValueError: - year_data[col] = 0 - else: - # 处理中职教学辅助用房总面积 - col_name = year_config['teaching_total'] - col_idx = openpyxl.utils.column_index_from_string(col_name) - 1 - if col_idx < len(row): - value = row[col_idx] - if value is None: - year_data['teaching_total'] = 0 - else: - str_value = str(value).strip() - if str_value in ['', '####']: - year_data['teaching_total'] = 0 - else: - try: - year_data['teaching_total'] = float(str_value) - except ValueError: - year_data['teaching_total'] = 0 - - stage_data[str(year)] = year_data - # 修复:将阶段数据添加到当前区域字典,而非区域列表 - current_area_data[stage] = stage_data - - # 将当前区域数据添加到列表 - area_data.append(current_area_data) + year_data['teaching_total'] = 0 + + stage_data[str(year)] = year_data + # 修复:将阶段数据添加到当前区域字典,而非区域列表 + current_area_data[stage] = stage_data + + # 将当前区域数据添加到列表 + area_data.append(current_area_data) - workbook.close() + # 保存JSON文件 + with open(JSON_PATH, 'w', encoding='utf-8') as f: + json.dump(area_data, f, ensure_ascii=False, indent=2) - # 保存JSON文件 - with open(JSON_PATH, 'w', encoding='utf-8') as f: - json.dump(area_data, f, ensure_ascii=False, indent=2) + # 输出统计信息 + print(f"✅ 学校面积数据提取完成,已保存至:{JSON_PATH}") + print(f"📊 共处理 {len(area_data)} 条地区数据") + print("\n=== 名称转换记录 ===") + if conversion_records: + for record in conversion_records: + print(f"🔄 行 {record['row']}: {record['raw_name']} → {record['converted_name']}") + print(f"📊 共检测到 {len(conversion_records)} 项名称转换") + else: + print("📝 不存在名称转换的情况") + if name_conversion_errors: + print(f"⚠️ 发现 {len(name_conversion_errors)} 个区域名称转换失败:") + for error in name_conversion_errors: + print(f" - {error}") - # 输出统计信息 - print(f"✅ 学校面积数据提取完成,已保存至:{JSON_PATH}") - print(f"📊 共处理 {len(area_data)} 条地区数据") - print("\n=== 名称转换记录 ===") - if conversion_records: - for record in conversion_records: - print(f"🔄 行 {record['row']}: {record['raw_name']} → {record['converted_name']}") - print(f"📊 共检测到 {len(conversion_records)} 项名称转换") - else: - print("📝 不存在名称转换的情况") - if name_conversion_errors: - print(f"⚠️ 发现 {len(name_conversion_errors)} 个区域名称转换失败:") - for error in name_conversion_errors: - print(f" - {error}") + except FileNotFoundError: + print(f"🔴 错误:Excel文件 '{file_name}' 不存在") + except Exception as e: + print(f"🔴 处理数据时发生错误:{str(e)}{traceback.format_exc()}") + finally: + try: + if workbook: + workbook.close() + except: + pass -except FileNotFoundError: - print(f"🔴 错误:Excel文件 '{file_name}' 不存在") -except Exception as e: - print(f"🔴 处理数据时发生错误:{str(e)}{traceback.format_exc()}") -finally: - try: - workbook.close() - except: - pass +if __name__ == "__main__": + main() diff --git a/Tools/__pycache__/T1_RenKou.cpython-310.pyc b/Tools/__pycache__/T1_RenKou.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ff68b83f3e494f3ff132af6cdcb46284fdd1c3d GIT binary patch literal 2140 zcmY*aOK%)S5T5Rt-JKopuJ_?*-XIWK9wxZ}LJ?xImn6ioBikXQWi*;>x9zd#vF_}dA1NL+w$fs>`!LP)>?dsyZ$f9Rr@( z>TheyMZ@?*8ONU-81F+%4na_ZqQD^iFCqwR9N^F-W@r&B%#aLHeP)mib0nvAE3m^n z$%hVc!XYvg7Dyp1l44jQC1fzPKD=AjvNDj>J+y~tW)G9vptnY|V2#im8KpKEqj@sU zCa6P)dYDYo0xi-K9j0Yk*~yR-w91V2lklFRHD)r4oo1O8JZVfCD;6E0qn}yi44tH7 zbR4v^>>Qogz1U<~~bgvCZQaOA_~v7j&2$YjZymZYz%NFrN5v4_ zI=KIxM2#a8EdO`-Y5oz2I+o}IiLR>etVB1|_hW(^%{m78A+&j|T?g$}JwwVO7GB`C z<8~+T1b`*w4!`Y1&v|%3T$N2a343~R?k@9Vyi?w6ZWJVuAW;qib9<`8)@ZcGP zucFyBwB!u*tQuVe4MQ`9v5t1JFo6_k!suGU5}DLk&r&pQ^ze-F>1G$~G&5;*vuQT9 zCXMx6Hz({gmu7l++3MQeeAnp?rFb`=I(rBisR`PU*6if%&9T%@^J$JZgp=laXm@DO zh!Dlp+%dZaQP?f+8L-Pc%eY&FR_YG-5v8R8qVm8V9@rJ%=vGBZSZO(}^ihgojkE&u zYuyn*S<@&-ML8Yqp|lD+kMz(*V{;>|riHW!+LaXTR?>n(xj81PDNfBE2JAr5y45)Y zk=lR!)xj^{??2i3Yww4{`(Gd2|MuXEM+Xlc9Deig@XMc%RDe4L5QjTI{rTYggPn)a z4UEn|<6B>C#gs{#dv`Sn>osY|Z5Fk+w*r~z2tP>3L@N$DVdVM|Wn1nFk3--vuzFQi z7n+x@%+I-VjcZMJdVcoCwKu;ebx-z2%v+j4n)S7vld@I0WBS+*ru zM5PH!0Xbm3wk*svmKuX~7G=g4EKH<%4|<$i&BlVe(3rc_$L$Tex~nAR_1 zefstZz5naugU_FUXRdB@Rp+Fw88UNafe(SnGs@>IUT!v*GzT>}t}Zm0|7a12sjD>B z^x&_k87hE%@wysig`OW>11(XhV(SxH$TmwRzo7bU*Ht52w~qM;IOggv@JZEy<3wh~ zb{n#Qs{n8n0d9dH#pyU&@mHt%AB~X|Z$KtZsp72^eHP7Q&0n1m8nr%^wA!9nlh%6d zM=}Rji@qEH$%-E^*X2`cClzP@rV=W2T>VsjN{N@1co782tGlCrZR8bMw93z^e)SKZ z9#AKQdn__KMmjw9#W1FwfW4=xNupe~VWSaLz~|7JYzfGrUPn^~hy!o-pO^B^d3zYB G^xywXXji!a literal 0 HcmV?d00001 diff --git a/Tools/__pycache__/T2_MaoRuXueLv.cpython-310.pyc b/Tools/__pycache__/T2_MaoRuXueLv.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..560929edb60e5d6cd813911e9f0dd5beaadedd04 GIT binary patch literal 3043 zcmb7G&2JmW6`z@1E|(NZNt7&$a-ujzER7awd!A9TV%q+0zTI2E8daZC!MAYue3Nr7h%U-@(=lv?K3eI^*UJ3F!GDy)dMY z4(Ve<`uLDu9MUI-^vNOp!c*OyI?P&^+=~?LJO}^h-D#SpDoxQ@s%?@IDxtI9?6cl% z32iC>)h)R*-&3s@+*$XM`y6PO>5K03yM%o}FZU7b8D5bnzwku7lX_X@>Vg-=T&;So zm@AdwfTx<>PMel7&(_w=+Je1YY0i~3KIR2pY`Y$#tvF;Jjd;Gp!WNApd(UZiDWB>v zFNp0{80=9Nd0}8ju@gspd|-)fhf&849G~)B%4>)8GE=1qP0da@PAx8X@nm zLi|mLzYFoP5D$eo5#m&cM?yRXQO8zunw4d6F`-?%9}4G6`k1C{{|0Pq{YZvejm{3h_5Rq4417Kp{T1ps~n z_>EP-IwvOZo4{|@gr^Cym=KFO4*-4>_|0WbOyDEOzc~+Y_F|~@2gTBKKhTSiI+BR^W+UW*f z$n0%zYkPRWrSt7)gCctVp!4m6K^OMImJ`E~aQT6iL2Zv(5m-I6@C5N8>E-& zX>mHy`Z!T{RrYeCC29$|sV;u12iVnm=~z$FNvcma)SlkU^s>E?gdAm(>@mhDQ9v7! znjY0&FC}`CNz!a7&L-(TJ{mbjg2PQ8D!p8sJIWs;nENWso$nPq)Ejm6q_BtBeK#{` z<3dt!^%4S^DWSfIbQZkFdgFt2C1YpnDkjB2?7N8FgUE{|)SHM$lL=VOD9k?I$Jfy7 zK{A@;l00au2|gN2aw1ZQ5+@{4HkB190o|8i7axB3*2(W5JpAbJ@$tK-Z~y4z?Vk+S znA0D>e|rBnPsA%|ikjeifz86Zd_>m0$PR<{0hG%WlsgvJ2PNw8SC4-F;NtTlmorC>0PjzFj9r5Ww4YIw!rTg|K3wLAt#YLeM@d}K zT%-Fj4P34Oors=!9iFRJnw2xI6`leHKjO+8UWe&&h|_`S-0~#*tmuw@aw=^X>NPJ8 zRe!iBLgq$%N|gNJYk@KrvWOQL-4eG1EYJ4beV&F$Z3vz#ps+6kKl`E(UlKFr1hM^; zQahsK#Woh8J>22|hDA+P6OBXZ9dq)*US=8l>Dft55L+lPr@y{#Os~c{# z3fIuadN-&$!7>YX;Ii9jLj8$0nxD6aE~Cx?zX;pMoK`$kI^=xwKo*I}Ria`Qk14at zOQfh|aTcqDV4@OS#M-~c((nw=0CHFdNxqZCIg%x84TiP=&weUs3P7IsS3!wUjQfzu zF`V;Q?UNo#P?Q&Udz?y8A8#l<+#^s6v;@cLJ^@c%WW3OXSDAFh>wEZz4^Q6w2(tSh zfBfm`4}SUh_}-_p{_HgT?z@lP{b9YFVWRGET_#EOMuUm#m}$b6U74%ZnlcsT3fPFS zX69EQKgAaW%Rs-Z%DiE7V%QBK#AeCuABa`xa@BXd;4WxU0fbJnirB}3l2r-{+YlbQ zZ3`dUE)(`SFx1PRVP6psRQW+c!ia0}K?lwVBVcA?_n6p5CO;SQrp%EmgJuwa{x%%8 zE8?R=C~}=L}g=mk6tpF}dbAgE2RO>LX4ir7&79kXHe-gBJ-rm3^72Y!L!xMBV-S4l*m{ncT2zKhi5x&=kWH8ItX6=%6Mr3R8o}znwUm_U|5N|-D__XItQR4N|MOqAXm_*# literal 0 HcmV?d00001 diff --git a/Tools/__pycache__/T3_SchoolCount.cpython-310.pyc b/Tools/__pycache__/T3_SchoolCount.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b9e1f3985aefb08c303783efe73f1c25058ca39 GIT binary patch literal 5095 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 literal 0 HcmV?d00001 diff --git a/Tools/__pycache__/T6_ZaiXiaoShengCount.cpython-310.pyc b/Tools/__pycache__/T6_ZaiXiaoShengCount.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3415c89af2d9ee2a6d50eb354cb3d256263d05ec GIT binary patch literal 5897 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 BeLMgF literal 0 HcmV?d00001 diff --git a/Tools/__pycache__/T8_SchoolMianJi.cpython-310.pyc b/Tools/__pycache__/T8_SchoolMianJi.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2737cc20f179a681a531e48b002b2236aad13728 GIT binary patch literal 7433 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 literal 0 HcmV?d00001