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 0000000..4ff68b8 Binary files /dev/null and b/Tools/__pycache__/T1_RenKou.cpython-310.pyc differ diff --git a/Tools/__pycache__/T2_MaoRuXueLv.cpython-310.pyc b/Tools/__pycache__/T2_MaoRuXueLv.cpython-310.pyc new file mode 100644 index 0000000..560929e Binary files /dev/null and b/Tools/__pycache__/T2_MaoRuXueLv.cpython-310.pyc differ diff --git a/Tools/__pycache__/T3_SchoolCount.cpython-310.pyc b/Tools/__pycache__/T3_SchoolCount.cpython-310.pyc new file mode 100644 index 0000000..3b9e1f3 Binary files /dev/null and b/Tools/__pycache__/T3_SchoolCount.cpython-310.pyc differ diff --git a/Tools/__pycache__/T4_ClassCount.cpython-310.pyc b/Tools/__pycache__/T4_ClassCount.cpython-310.pyc new file mode 100644 index 0000000..72b588e Binary files /dev/null and b/Tools/__pycache__/T4_ClassCount.cpython-310.pyc differ diff --git a/Tools/__pycache__/T5_ZhaoShengCount.cpython-310.pyc b/Tools/__pycache__/T5_ZhaoShengCount.cpython-310.pyc new file mode 100644 index 0000000..93c8c39 Binary files /dev/null and b/Tools/__pycache__/T5_ZhaoShengCount.cpython-310.pyc differ diff --git a/Tools/__pycache__/T6_ZaiXiaoShengCount.cpython-310.pyc b/Tools/__pycache__/T6_ZaiXiaoShengCount.cpython-310.pyc new file mode 100644 index 0000000..3415c89 Binary files /dev/null and b/Tools/__pycache__/T6_ZaiXiaoShengCount.cpython-310.pyc differ diff --git a/Tools/__pycache__/T7_TeacherCount.cpython-310.pyc b/Tools/__pycache__/T7_TeacherCount.cpython-310.pyc new file mode 100644 index 0000000..bb3e309 Binary files /dev/null and b/Tools/__pycache__/T7_TeacherCount.cpython-310.pyc differ diff --git a/Tools/__pycache__/T8_SchoolMianJi.cpython-310.pyc b/Tools/__pycache__/T8_SchoolMianJi.cpython-310.pyc new file mode 100644 index 0000000..2737cc2 Binary files /dev/null and b/Tools/__pycache__/T8_SchoolMianJi.cpython-310.pyc differ