'commit'
This commit is contained in:
565
Log/1.log
565
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
|
C:\Users\Administrator\.conda\envs\yunnan\python.exe D:\dsWork\YunNanProject\Tools\Full_Original.py
|
||||||
Connected to: <socket.socket fd=676, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 51896), raddr=('127.0.0.1', 51895)>.
|
开始执行全部数据处理工具 (T1-T8)
|
||||||
已连接到 pydev 调试器(内部版本号 252.23892.515)行 3: 云南省 -> 全称: 云南省, 行政区划码: 530000000
|
当前工作目录: D:\dsWork\YunNanProject\Tools
|
||||||
行 4: 昆明市 -> 全称: 昆明市, 行政区划码: 530100000
|
切换到工具目录: D:\dsWork\YunNanProject\Tools
|
||||||
行 5: 五华区 -> 全称: 五华区, 行政区划码: 530102000
|
|
||||||
行 6: 盘龙区 -> 全称: 盘龙区, 行政区划码: 530103000
|
==================================================
|
||||||
行 7: 官渡区 -> 全称: 官渡区, 行政区划码: 530111000
|
开始执行 T1_RenKou
|
||||||
行 8: 西山区 -> 全称: 西山区, 行政区划码: 530112000
|
==================================================
|
||||||
行 9: 东川区 -> 全称: 东川区, 行政区划码: 530113000
|
开始时间: 2025-09-10 14:23:24
|
||||||
行 10: 呈贡区 -> 全称: 呈贡区, 行政区划码: 530114000
|
|
||||||
行 11: 晋宁区 -> 全称: 晋宁区, 行政区划码: 530115000
|
=== 名称转换记录 ===
|
||||||
行 12: 富民县 -> 全称: 富民县, 行政区划码: 530124000
|
🔄 行 14: 石林县 → 石林彝族自治县
|
||||||
行 13: 宜良县 -> 全称: 宜良县, 行政区划码: 530125000
|
🔄 行 16: 禄劝县 → 禄劝彝族苗族自治县
|
||||||
行 14: 石林县 -> 全称: 石林彝族自治县, 行政区划码: 530126000
|
🔄 行 17: 寻甸县 → 寻甸回族彝族自治县
|
||||||
行 15: 嵩明县 -> 全称: 嵩明县, 行政区划码: 530127000
|
🔄 行 32: 澄江县 → 澄江市
|
||||||
行 16: 禄劝县 -> 全称: 禄劝彝族苗族自治县, 行政区划码: 530128000
|
🔄 行 36: 峨山县 → 峨山彝族自治县
|
||||||
行 17: 寻甸县 -> 全称: 寻甸回族彝族自治县, 行政区划码: 530129000
|
🔄 行 37: 新平县 → 新平彝族傣族自治县
|
||||||
行 18: 安宁市 -> 全称: 安宁市, 行政区划码: 530181000
|
🔄 行 38: 元江县 → 元江哈尼族彝族傣族自治县
|
||||||
行 19: 曲靖市 -> 全称: 曲靖市, 行政区划码: 530300000
|
🔄 行 59: 玉龙县 → 玉龙纳西族自治县
|
||||||
行 20: 麒麟区 -> 全称: 麒麟区, 行政区划码: 530302000
|
🔄 行 62: 宁蒗县 → 宁蒗彝族自治县
|
||||||
行 21: 沾益区 -> 全称: 沾益区, 行政区划码: 530303000
|
🔄 行 65: 宁洱县 → 宁洱哈尼族彝族自治县
|
||||||
行 22: 马龙区 -> 全称: 马龙区, 行政区划码: 530304000
|
🔄 行 66: 墨江县 → 墨江哈尼族自治县
|
||||||
行 23: 陆良县 -> 全称: 陆良县, 行政区划码: 530322000
|
🔄 行 67: 景东县 → 景东彝族自治县
|
||||||
行 24: 师宗县 -> 全称: 师宗县, 行政区划码: 530323000
|
🔄 行 68: 景谷县 → 景谷傣族彝族自治县
|
||||||
行 25: 罗平县 -> 全称: 罗平县, 行政区划码: 530324000
|
🔄 行 69: 镇沅县 → 镇沅彝族哈尼族拉祜族自治县
|
||||||
行 26: 富源县 -> 全称: 富源县, 行政区划码: 530325000
|
🔄 行 70: 江城县 → 江城哈尼族彝族自治县
|
||||||
行 27: 会泽县 -> 全称: 会泽县, 行政区划码: 530326000
|
🔄 行 71: 孟连县 → 孟连傣族拉祜族佤族自治县
|
||||||
行 28: 宣威市 -> 全称: 宣威市, 行政区划码: 530381000
|
🔄 行 72: 澜沧县 → 澜沧拉祜族自治县
|
||||||
行 29: 玉溪市 -> 全称: 玉溪市, 行政区划码: 530400000
|
🔄 行 73: 西盟县 → 西盟佤族自治县
|
||||||
行 30: 红塔区 -> 全称: 红塔区, 行政区划码: 530402000
|
🔄 行 80: 双江县 → 双江拉祜族佤族布朗族傣族自治县
|
||||||
行 31: 江川区 -> 全称: 江川区, 行政区划码: 530403000
|
🔄 行 81: 耿马县 → 耿马傣族佤族自治县
|
||||||
行 32: 澄江县 -> 全称: 澄江市, 行政区划码: 530481000
|
🔄 行 82: 沧源县 → 沧源佤族自治县
|
||||||
行 33: 通海县 -> 全称: 通海县, 行政区划码: 530423000
|
🔄 行 83: 楚雄州 → 楚雄彝族自治州
|
||||||
行 34: 华宁县 -> 全称: 华宁县, 行政区划码: 530424000
|
🔄 行 85: 禄丰市 → 禄丰县
|
||||||
行 35: 易门县 -> 全称: 易门县, 行政区划码: 530425000
|
🔄 行 94: 红河州 → 红河哈尼族彝族自治州
|
||||||
行 36: 峨山县 -> 全称: 峨山彝族自治县, 行政区划码: 530426000
|
🔄 行 99: 屏边县 → 屏边苗族自治县
|
||||||
行 37: 新平县 -> 全称: 新平彝族傣族自治县, 行政区划码: 530427000
|
🔄 行 105: 金平县 → 金平苗族瑶族傣族自治县
|
||||||
行 38: 元江县 -> 全称: 元江哈尼族彝族傣族自治县, 行政区划码: 530428000
|
🔄 行 107: 河口县 → 河口瑶族自治县
|
||||||
行 39: 保山市 -> 全称: 保山市, 行政区划码: 530500000
|
🔄 行 108: 文山州 → 文山壮族苗族自治州
|
||||||
行 40: 隆阳区 -> 全称: 隆阳区, 行政区划码: 530502000
|
🔄 行 117: 西双版纳州 → 西双版纳傣族自治州
|
||||||
行 41: 施甸县 -> 全称: 施甸县, 行政区划码: 530521000
|
🔄 行 121: 大理州 → 大理白族自治州
|
||||||
行 42: 龙陵县 -> 全称: 龙陵县, 行政区划码: 530523000
|
🔄 行 123: 漾濞县 → 漾濞彝族自治县
|
||||||
行 43: 昌宁县 -> 全称: 昌宁县, 行政区划码: 530524000
|
🔄 行 127: 南涧县 → 南涧彝族自治县
|
||||||
行 44: 腾冲市 -> 全称: 腾冲市, 行政区划码: 530581000
|
🔄 行 128: 巍山县 → 巍山彝族回族自治县
|
||||||
行 45: 昭通市 -> 全称: 昭通市, 行政区划码: 530600000
|
🔄 行 134: 德宏州 → 德宏傣族景颇族自治州
|
||||||
行 46: 昭阳区 -> 全称: 昭阳区, 行政区划码: 530602000
|
🔄 行 140: 怒江州 → 怒江傈僳族自治州
|
||||||
行 47: 鲁甸县 -> 全称: 鲁甸县, 行政区划码: 530621000
|
🔄 行 143: 贡山县 → 贡山独龙族怒族自治县
|
||||||
行 48: 巧家县 -> 全称: 巧家县, 行政区划码: 530622000
|
🔄 行 144: 兰坪县 → 兰坪白族普米族自治县
|
||||||
行 49: 盐津县 -> 全称: 盐津县, 行政区划码: 530623000
|
🔄 行 145: 迪庆州 → 迪庆藏族自治州
|
||||||
行 50: 大关县 -> 全称: 大关县, 行政区划码: 530624000
|
🔄 行 148: 维西县 → 维西傈僳族自治县
|
||||||
行 51: 永善县 -> 全称: 永善县, 行政区划码: 530625000
|
📊 共检测到 39 项名称转换
|
||||||
行 52: 绥江县 -> 全称: 绥江县, 行政区划码: 530626000
|
✅ 所有区域名称均成功转换为全称
|
||||||
行 53: 镇雄县 -> 全称: 镇雄县, 行政区划码: 530627000
|
✅ 数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\RenKou.json
|
||||||
行 54: 彝良县 -> 全称: 彝良县, 行政区划码: 530628000
|
📊 共处理 146 条地区数据
|
||||||
行 55: 威信县 -> 全称: 威信县, 行政区划码: 530629000
|
|
||||||
行 56: 水富市 -> 全称: 水富市, 行政区划码: 530681000
|
✅ T1_RenKou 执行成功
|
||||||
行 57: 丽江市 -> 全称: 丽江市, 行政区划码: 530700000
|
结束时间: 2025-09-10 14:23:26
|
||||||
行 58: 古城区 -> 全称: 古城区, 行政区划码: 530702000
|
耗时: 2.31 秒
|
||||||
行 59: 玉龙县 -> 全称: 玉龙纳西族自治县, 行政区划码: 530721000
|
|
||||||
行 60: 永胜县 -> 全称: 永胜县, 行政区划码: 530722000
|
==================================================
|
||||||
行 61: 华坪县 -> 全称: 华坪县, 行政区划码: 530723000
|
开始执行 T2_MaoRuXueLv
|
||||||
行 62: 宁蒗县 -> 全称: 宁蒗彝族自治县, 行政区划码: 530724000
|
==================================================
|
||||||
行 63: 普洱市 -> 全称: 普洱市, 行政区划码: 530800000
|
开始时间: 2025-09-10 14:23:26
|
||||||
行 64: 思茅区 -> 全称: 思茅区, 行政区划码: 530802000
|
✅ 数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\MaoRuXueLv.json
|
||||||
行 65: 宁洱县 -> 全称: 宁洱哈尼族彝族自治县, 行政区划码: 530821000
|
📊 共处理 146 条地区数据
|
||||||
行 66: 墨江县 -> 全称: 墨江哈尼族自治县, 行政区划码: 530822000
|
|
||||||
行 67: 景东县 -> 全称: 景东彝族自治县, 行政区划码: 530823000
|
=== 名称转换记录 ===
|
||||||
行 68: 景谷县 -> 全称: 景谷傣族彝族自治县, 行政区划码: 530824000
|
🔄 行 13: 晋宁县 → 晋宁区
|
||||||
行 69: 镇沅县 -> 全称: 镇沅彝族哈尼族拉祜族自治县, 行政区划码: 530825000
|
🔄 行 23: 马龙县 → 马龙区
|
||||||
行 70: 江城县 -> 全称: 江城哈尼族彝族自治县, 行政区划码: 530826000
|
🔄 行 29: 沾益县 → 沾益区
|
||||||
行 71: 孟连县 -> 全称: 孟连傣族拉祜族佤族自治县, 行政区划码: 530827000
|
🔄 行 33: 江川县 → 江川区
|
||||||
行 72: 澜沧县 -> 全称: 澜沧拉祜族自治县, 行政区划码: 530828000
|
🔄 行 34: 澄江县 → 澄江市
|
||||||
行 73: 西盟县 -> 全称: 西盟佤族自治县, 行政区划码: 530829000
|
🔄 行 44: 腾冲县 → 腾冲市
|
||||||
行 74: 临沧市 -> 全称: 临沧市, 行政区划码: 530900000
|
🔄 行 58: 水富县 → 水富市
|
||||||
行 75: 临翔区 -> 全称: 临翔区, 行政区划码: 530902000
|
🔄 行 143: 泸水县 → 泸水市
|
||||||
行 76: 凤庆县 -> 全称: 凤庆县, 行政区划码: 530921000
|
🔄 行 148: 香格里拉县 → 香格里拉市
|
||||||
行 77: 云县 -> 全称: 云县, 行政区划码: 530922000
|
📊 共检测到 9 项名称转换
|
||||||
行 78: 永德县 -> 全称: 永德县, 行政区划码: 530923000
|
✅ 所有区域名称均成功转换为全称
|
||||||
行 79: 镇康县 -> 全称: 镇康县, 行政区划码: 530924000
|
|
||||||
行 80: 双江县 -> 全称: 双江拉祜族佤族布朗族傣族自治县, 行政区划码: 530925000
|
✅ T2_MaoRuXueLv 执行成功
|
||||||
行 81: 耿马县 -> 全称: 耿马傣族佤族自治县, 行政区划码: 530926000
|
结束时间: 2025-09-10 14:23:26
|
||||||
行 82: 沧源县 -> 全称: 沧源佤族自治县, 行政区划码: 530927000
|
耗时: 0.15 秒
|
||||||
行 83: 楚雄州 -> 全称: 楚雄彝族自治州, 行政区划码: 532300000
|
|
||||||
行 84: 楚雄市 -> 全称: 楚雄市, 行政区划码: 532301000
|
==================================================
|
||||||
行 85: 禄丰市 -> 全称: 禄丰县, 行政区划码: 532331000
|
开始执行 T3_SchoolCount
|
||||||
行 86: 双柏县 -> 全称: 双柏县, 行政区划码: 532322000
|
==================================================
|
||||||
行 87: 牟定县 -> 全称: 牟定县, 行政区划码: 532323000
|
开始时间: 2025-09-10 14:23:26
|
||||||
行 88: 南华县 -> 全称: 南华县, 行政区划码: 532324000
|
✅ 学校数数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\SchoolCount.json
|
||||||
行 89: 姚安县 -> 全称: 姚安县, 行政区划码: 532325000
|
📊 共处理 146 条地区数据
|
||||||
行 90: 大姚县 -> 全称: 大姚县, 行政区划码: 532326000
|
|
||||||
行 91: 永仁县 -> 全称: 永仁县, 行政区划码: 532327000
|
=== 名称转换记录 ===
|
||||||
行 92: 元谋县 -> 全称: 元谋县, 行政区划码: 532328000
|
🔄 行 12: 晋宁县 → 晋宁区
|
||||||
行 93: 武定县 -> 全称: 武定县, 行政区划码: 532329000
|
🔄 行 22: 马龙县 → 马龙区
|
||||||
行 94: 红河州 -> 全称: 红河哈尼族彝族自治州, 行政区划码: 532500000
|
🔄 行 28: 沾益县 → 沾益区
|
||||||
行 95: 个旧市 -> 全称: 个旧市, 行政区划码: 532501000
|
🔄 行 32: 江川县 → 江川区
|
||||||
行 96: 开远市 -> 全称: 开远市, 行政区划码: 532502000
|
🔄 行 33: 澄江县 → 澄江市
|
||||||
行 97: 蒙自市 -> 全称: 蒙自市, 行政区划码: 532503000
|
🔄 行 43: 腾冲县 → 腾冲市
|
||||||
行 98: 弥勒市 -> 全称: 弥勒市, 行政区划码: 532504000
|
🔄 行 57: 水富县 → 水富市
|
||||||
行 99: 屏边县 -> 全称: 屏边苗族自治县, 行政区划码: 532523000
|
🔄 行 142: 泸水县 → 泸水市
|
||||||
行 100: 建水县 -> 全称: 建水县, 行政区划码: 532524000
|
🔄 行 147: 香格里拉县 → 香格里拉市
|
||||||
行 101: 石屏县 -> 全称: 石屏县, 行政区划码: 532525000
|
📊 共检测到 9 项名称转换
|
||||||
行 102: 泸西县 -> 全称: 泸西县, 行政区划码: 532527000
|
|
||||||
行 103: 元阳县 -> 全称: 元阳县, 行政区划码: 532528000
|
❌ T3_SchoolCount 没有找到main函数
|
||||||
行 104: 红河县 -> 全称: 红河县, 行政区划码: 532529000
|
|
||||||
行 105: 金平县 -> 全称: 金平苗族瑶族傣族自治县, 行政区划码: 532530000
|
⚠️ T3_SchoolCount 执行失败,但继续执行后续工具...
|
||||||
行 106: 绿春县 -> 全称: 绿春县, 行政区划码: 532531000
|
|
||||||
行 107: 河口县 -> 全称: 河口瑶族自治县, 行政区划码: 532532000
|
==================================================
|
||||||
行 108: 文山州 -> 全称: 文山壮族苗族自治州, 行政区划码: 532600000
|
开始执行 T4_ClassCount
|
||||||
行 109: 文山市 -> 全称: 文山市, 行政区划码: 532601000
|
==================================================
|
||||||
行 110: 砚山县 -> 全称: 砚山县, 行政区划码: 532622000
|
开始时间: 2025-09-10 14:23:27
|
||||||
行 111: 西畴县 -> 全称: 西畴县, 行政区划码: 532623000
|
|
||||||
行 112: 麻栗坡县 -> 全称: 麻栗坡县, 行政区划码: 532624000
|
=== 名称转换记录 ===
|
||||||
行 113: 马关县 -> 全称: 马关县, 行政区划码: 532625000
|
🔄 行 12: 晋宁县 → 晋宁区
|
||||||
行 114: 丘北县 -> 全称: 丘北县, 行政区划码: 532626000
|
🔄 行 22: 马龙县 → 马龙区
|
||||||
行 115: 广南县 -> 全称: 广南县, 行政区划码: 532627000
|
🔄 行 28: 沾益县 → 沾益区
|
||||||
行 116: 富宁县 -> 全称: 富宁县, 行政区划码: 532628000
|
🔄 行 32: 江川县 → 江川区
|
||||||
行 117: 西双版纳州 -> 全称: 西双版纳傣族自治州, 行政区划码: 532800000
|
🔄 行 33: 澄江县 → 澄江市
|
||||||
行 118: 景洪市 -> 全称: 景洪市, 行政区划码: 532801000
|
🔄 行 43: 腾冲县 → 腾冲市
|
||||||
行 119: 勐海县 -> 全称: 勐海县, 行政区划码: 532822000
|
🔄 行 57: 水富县 → 水富市
|
||||||
行 120: 勐腊县 -> 全称: 勐腊县, 行政区划码: 532823000
|
🔄 行 142: 泸水县 → 泸水市
|
||||||
行 121: 大理州 -> 全称: 大理白族自治州, 行政区划码: 532900000
|
🔄 行 147: 香格里拉县 → 香格里拉市
|
||||||
行 122: 大理市 -> 全称: 大理市, 行政区划码: 532901000
|
📊 共检测到 9 项名称转换
|
||||||
行 123: 漾濞县 -> 全称: 漾濞彝族自治县, 行政区划码: 532922000
|
✅ 所有区域名称均成功转换为全称
|
||||||
行 124: 祥云县 -> 全称: 祥云县, 行政区划码: 532923000
|
✅ 数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\ClassCount.json
|
||||||
行 125: 宾川县 -> 全称: 宾川县, 行政区划码: 532924000
|
📊 共处理 146 条地区数据
|
||||||
行 126: 弥渡县 -> 全称: 弥渡县, 行政区划码: 532925000
|
|
||||||
行 127: 南涧县 -> 全称: 南涧彝族自治县, 行政区划码: 532926000
|
✅ T4_ClassCount 执行成功
|
||||||
行 128: 巍山县 -> 全称: 巍山彝族回族自治县, 行政区划码: 532927000
|
结束时间: 2025-09-10 14:23:27
|
||||||
行 129: 永平县 -> 全称: 永平县, 行政区划码: 532928000
|
耗时: 0.24 秒
|
||||||
行 130: 云龙县 -> 全称: 云龙县, 行政区划码: 532929000
|
|
||||||
行 131: 洱源县 -> 全称: 洱源县, 行政区划码: 532930000
|
==================================================
|
||||||
行 132: 剑川县 -> 全称: 剑川县, 行政区划码: 532931000
|
开始执行 T5_ZhaoShengCount
|
||||||
行 133: 鹤庆县 -> 全称: 鹤庆县, 行政区划码: 532932000
|
==================================================
|
||||||
行 134: 德宏州 -> 全称: 德宏傣族景颇族自治州, 行政区划码: 533100000
|
开始时间: 2025-09-10 14:23:27
|
||||||
行 135: 瑞丽市 -> 全称: 瑞丽市, 行政区划码: 533102000
|
✅ 成功加载Excel文件:D:\dsWork\YunNanProject\Doc\数据库-2015-2024-v2.xlsx
|
||||||
行 136: 芒市 -> 全称: 芒市, 行政区划码: 533103000
|
✅ 开始处理招生数数据,共149行数据
|
||||||
行 137: 梁河县 -> 全称: 梁河县, 行政区划码: 533122000
|
🔄 已处理 10 条数据...
|
||||||
行 138: 盈江县 -> 全称: 盈江县, 行政区划码: 533123000
|
🔄 已处理 20 条数据...
|
||||||
行 139: 陇川县 -> 全称: 陇川县, 行政区划码: 533124000
|
🔄 已处理 30 条数据...
|
||||||
行 140: 怒江州 -> 全称: 怒江傈僳族自治州, 行政区划码: 533300000
|
🔄 已处理 40 条数据...
|
||||||
行 141: 泸水市 -> 全称: 泸水市, 行政区划码: 533301000
|
🔄 已处理 50 条数据...
|
||||||
行 142: 福贡县 -> 全称: 福贡县, 行政区划码: 533323000
|
🔄 已处理 60 条数据...
|
||||||
行 143: 贡山县 -> 全称: 贡山独龙族怒族自治县, 行政区划码: 533324000
|
🔄 已处理 70 条数据...
|
||||||
行 144: 兰坪县 -> 全称: 兰坪白族普米族自治县, 行政区划码: 533325000
|
🔄 已处理 80 条数据...
|
||||||
行 145: 迪庆州 -> 全称: 迪庆藏族自治州, 行政区划码: 533400000
|
🔄 已处理 90 条数据...
|
||||||
行 146: 香格里拉市 -> 全称: 香格里拉市, 行政区划码: 533401000
|
🔄 已处理 100 条数据...
|
||||||
行 147: 德钦县 -> 全称: 德钦县, 行政区划码: 533422000
|
🔄 已处理 110 条数据...
|
||||||
行 148: 维西县 -> 全称: 维西傈僳族自治县, 行政区划码: 533423000
|
🔄 已处理 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
|
进程已结束,退出代码为 0
|
||||||
|
103
Tools/Full_Original.py
Normal file
103
Tools/Full_Original.py
Normal file
@@ -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()
|
@@ -12,209 +12,220 @@ from Util.DataUtil import (
|
|||||||
convert_area_name, save_to_json, load_workbook_sheet
|
convert_area_name, save_to_json, load_workbook_sheet
|
||||||
)
|
)
|
||||||
|
|
||||||
# 创建数据保存目录
|
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路径
|
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
|
file_name = EXCEL_PATH
|
||||||
school_data = []
|
school_data = []
|
||||||
name_conversion_errors = [] # 记录转换失败的名称
|
name_conversion_errors = [] # 记录转换失败的名称
|
||||||
conversion_records = [] # 定义转换记录变量
|
conversion_records = [] # 定义转换记录变量
|
||||||
|
|
||||||
|
workbook = None # 初始化workbook变量,确保在finally块中可以访问
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 加载工作簿并选择学校数Sheet
|
# 加载工作簿并选择学校数Sheet
|
||||||
workbook = openpyxl.load_workbook(file_name, read_only=True)
|
workbook = openpyxl.load_workbook(file_name, read_only=True)
|
||||||
if '学校数' not in workbook.sheetnames:
|
if '学校数' not in workbook.sheetnames:
|
||||||
print("❌ 错误:未找到'学校数'Sheet")
|
print("❌ 错误:未找到'学校数'Sheet")
|
||||||
exit(1)
|
return
|
||||||
sheet = workbook['学校数']
|
sheet = workbook['学校数']
|
||||||
|
|
||||||
# 定义数据列范围与英文属性映射
|
# 定义数据列范围与英文属性映射
|
||||||
# 每个教育阶段包含:年份列表、列配置(年份→列名映射)、数据类别
|
# 每个教育阶段包含:年份列表、列配置(年份→列名映射)、数据类别
|
||||||
data_columns = {
|
data_columns = {
|
||||||
# 学前教育(每年份4列:城区/镇区/乡村/总计,取前3列)
|
# 学前教育(每年份4列:城区/镇区/乡村/总计,取前3列)
|
||||||
'preschool_schools': {
|
'preschool_schools': {
|
||||||
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
||||||
'columns': [
|
'columns': [
|
||||||
{'year': 2015, 'urban': 'D', 'town': 'E', 'rural': 'F'},
|
{'year': 2015, 'urban': 'D', 'town': 'E', 'rural': 'F'},
|
||||||
{'year': 2016, 'urban': 'H', 'town': 'I', 'rural': 'J'},
|
{'year': 2016, 'urban': 'H', 'town': 'I', 'rural': 'J'},
|
||||||
{'year': 2017, 'urban': 'L', 'town': 'M', 'rural': 'N'},
|
{'year': 2017, 'urban': 'L', 'town': 'M', 'rural': 'N'},
|
||||||
{'year': 2018, 'urban': 'P', 'town': 'Q', 'rural': 'R'},
|
{'year': 2018, 'urban': 'P', 'town': 'Q', 'rural': 'R'},
|
||||||
{'year': 2019, 'urban': 'T', 'town': 'U', 'rural': 'V'},
|
{'year': 2019, 'urban': 'T', 'town': 'U', 'rural': 'V'},
|
||||||
{'year': 2020, 'urban': 'X', 'town': 'Y', 'rural': 'Z'},
|
{'year': 2020, 'urban': 'X', 'town': 'Y', 'rural': 'Z'},
|
||||||
{'year': 2021, 'urban': 'AB', 'town': 'AC', 'rural': 'AD'},
|
{'year': 2021, 'urban': 'AB', 'town': 'AC', 'rural': 'AD'},
|
||||||
{'year': 2022, 'urban': 'AF', 'town': 'AG', 'rural': 'AH'},
|
{'year': 2022, 'urban': 'AF', 'town': 'AG', 'rural': 'AH'},
|
||||||
{'year': 2023, 'urban': 'AJ', 'town': 'AK', 'rural': 'AL'},
|
{'year': 2023, 'urban': 'AJ', 'town': 'AK', 'rural': 'AL'},
|
||||||
{'year': 2024, 'urban': 'AN', 'town': 'AO', 'rural': 'AP'}
|
{'year': 2024, 'urban': 'AN', 'town': 'AO', 'rural': 'AP'}
|
||||||
],
|
],
|
||||||
'categories': ['urban', 'town', 'rural']
|
'categories': ['urban', 'town', 'rural']
|
||||||
},
|
},
|
||||||
|
|
||||||
# 小学教育(每年份4列,取前3列)
|
# 小学教育(每年份4列,取前3列)
|
||||||
'primary_schools': {
|
'primary_schools': {
|
||||||
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
||||||
'columns': [
|
'columns': [
|
||||||
{'year': 2015, 'urban': 'AR', 'town': 'AS', 'rural': 'AT'},
|
{'year': 2015, 'urban': 'AR', 'town': 'AS', 'rural': 'AT'},
|
||||||
{'year': 2016, 'urban': 'AV', 'town': 'AW', 'rural': 'AX'},
|
{'year': 2016, 'urban': 'AV', 'town': 'AW', 'rural': 'AX'},
|
||||||
{'year': 2017, 'urban': 'AZ', 'town': 'BA', 'rural': 'BB'},
|
{'year': 2017, 'urban': 'AZ', 'town': 'BA', 'rural': 'BB'},
|
||||||
{'year': 2018, 'urban': 'BD', 'town': 'BE', 'rural': 'BF'},
|
{'year': 2018, 'urban': 'BD', 'town': 'BE', 'rural': 'BF'},
|
||||||
{'year': 2019, 'urban': 'BH', 'town': 'BI', 'rural': 'BJ'},
|
{'year': 2019, 'urban': 'BH', 'town': 'BI', 'rural': 'BJ'},
|
||||||
{'year': 2020, 'urban': 'BL', 'town': 'BM', 'rural': 'BN'},
|
{'year': 2020, 'urban': 'BL', 'town': 'BM', 'rural': 'BN'},
|
||||||
{'year': 2021, 'urban': 'BP', 'town': 'BQ', 'rural': 'BR'},
|
{'year': 2021, 'urban': 'BP', 'town': 'BQ', 'rural': 'BR'},
|
||||||
{'year': 2022, 'urban': 'BT', 'town': 'BU', 'rural': 'BV'},
|
{'year': 2022, 'urban': 'BT', 'town': 'BU', 'rural': 'BV'},
|
||||||
{'year': 2023, 'urban': 'BX', 'town': 'BY', 'rural': 'BZ'},
|
{'year': 2023, 'urban': 'BX', 'town': 'BY', 'rural': 'BZ'},
|
||||||
{'year': 2024, 'urban': 'CB', 'town': 'CC', 'rural': 'CD'}
|
{'year': 2024, 'urban': 'CB', 'town': 'CC', 'rural': 'CD'}
|
||||||
],
|
],
|
||||||
'categories': ['urban', 'town', 'rural']
|
'categories': ['urban', 'town', 'rural']
|
||||||
},
|
},
|
||||||
|
|
||||||
# 初中教育
|
# 初中教育
|
||||||
'junior_high_schools': {
|
'junior_high_schools': {
|
||||||
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
||||||
'columns': [
|
'columns': [
|
||||||
{'year': 2015, 'urban': 'CF', 'town': 'CG', 'rural': 'CH'},
|
{'year': 2015, 'urban': 'CF', 'town': 'CG', 'rural': 'CH'},
|
||||||
{'year': 2016, 'urban': 'CJ', 'town': 'CK', 'rural': 'CL'},
|
{'year': 2016, 'urban': 'CJ', 'town': 'CK', 'rural': 'CL'},
|
||||||
{'year': 2017, 'urban': 'CN', 'town': 'CO', 'rural': 'CP'},
|
{'year': 2017, 'urban': 'CN', 'town': 'CO', 'rural': 'CP'},
|
||||||
{'year': 2018, 'urban': 'CR', 'town': 'CS', 'rural': 'CT'},
|
{'year': 2018, 'urban': 'CR', 'town': 'CS', 'rural': 'CT'},
|
||||||
{'year': 2019, 'urban': 'CV', 'town': 'CW', 'rural': 'CX'},
|
{'year': 2019, 'urban': 'CV', 'town': 'CW', 'rural': 'CX'},
|
||||||
{'year': 2020, 'urban': 'CZ', 'town': 'DA', 'rural': 'DB'},
|
{'year': 2020, 'urban': 'CZ', 'town': 'DA', 'rural': 'DB'},
|
||||||
{'year': 2021, 'urban': 'DD', 'town': 'DE', 'rural': 'DF'},
|
{'year': 2021, 'urban': 'DD', 'town': 'DE', 'rural': 'DF'},
|
||||||
{'year': 2022, 'urban': 'DH', 'town': 'DI', 'rural': 'DJ'},
|
{'year': 2022, 'urban': 'DH', 'town': 'DI', 'rural': 'DJ'},
|
||||||
{'year': 2023, 'urban': 'DL', 'town': 'DM', 'rural': 'DN'},
|
{'year': 2023, 'urban': 'DL', 'town': 'DM', 'rural': 'DN'},
|
||||||
{'year': 2024, 'urban': 'DP', 'town': 'DQ', 'rural': 'DR'}
|
{'year': 2024, 'urban': 'DP', 'town': 'DQ', 'rural': 'DR'}
|
||||||
],
|
],
|
||||||
'categories': ['urban', 'town', 'rural']
|
'categories': ['urban', 'town', 'rural']
|
||||||
},
|
},
|
||||||
|
|
||||||
# 普通高中教育
|
# 普通高中教育
|
||||||
'senior_high_schools': {
|
'senior_high_schools': {
|
||||||
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
||||||
'columns': [
|
'columns': [
|
||||||
{'year': 2015, 'urban': 'DT', 'town': 'DU', 'rural': 'DV'},
|
{'year': 2015, 'urban': 'DT', 'town': 'DU', 'rural': 'DV'},
|
||||||
{'year': 2016, 'urban': 'DX', 'town': 'DY', 'rural': 'DZ'},
|
{'year': 2016, 'urban': 'DX', 'town': 'DY', 'rural': 'DZ'},
|
||||||
{'year': 2017, 'urban': 'EB', 'town': 'EC', 'rural': 'ED'},
|
{'year': 2017, 'urban': 'EB', 'town': 'EC', 'rural': 'ED'},
|
||||||
{'year': 2018, 'urban': 'EF', 'town': 'EG', 'rural': 'EH'},
|
{'year': 2018, 'urban': 'EF', 'town': 'EG', 'rural': 'EH'},
|
||||||
{'year': 2019, 'urban': 'EJ', 'town': 'EK', 'rural': 'EL'},
|
{'year': 2019, 'urban': 'EJ', 'town': 'EK', 'rural': 'EL'},
|
||||||
{'year': 2020, 'urban': 'EN', 'town': 'EO', 'rural': 'EP'},
|
{'year': 2020, 'urban': 'EN', 'town': 'EO', 'rural': 'EP'},
|
||||||
{'year': 2021, 'urban': 'ER', 'town': 'ES', 'rural': 'ET'},
|
{'year': 2021, 'urban': 'ER', 'town': 'ES', 'rural': 'ET'},
|
||||||
{'year': 2022, 'urban': 'EV', 'town': 'EW', 'rural': 'EX'},
|
{'year': 2022, 'urban': 'EV', 'town': 'EW', 'rural': 'EX'},
|
||||||
{'year': 2023, 'urban': 'EZ', 'town': 'FA', 'rural': 'FB'},
|
{'year': 2023, 'urban': 'EZ', 'town': 'FA', 'rural': 'FB'},
|
||||||
{'year': 2024, 'urban': 'FD', 'town': 'FE', 'rural': 'FF'}
|
{'year': 2024, 'urban': 'FD', 'town': 'FE', 'rural': 'FF'}
|
||||||
],
|
],
|
||||||
'categories': ['urban', 'town', 'rural']
|
'categories': ['urban', 'town', 'rural']
|
||||||
},
|
},
|
||||||
|
|
||||||
# 中职教育(特殊:每年份1列)
|
# 中职教育(特殊:每年份1列)
|
||||||
'vocational_schools': {
|
'vocational_schools': {
|
||||||
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
||||||
'columns': [
|
'columns': [
|
||||||
{'year': 2015, 'column': 'FH'},
|
{'year': 2015, 'column': 'FH'},
|
||||||
{'year': 2016, 'column': 'FI'},
|
{'year': 2016, 'column': 'FI'},
|
||||||
{'year': 2017, 'column': 'FJ'},
|
{'year': 2017, 'column': 'FJ'},
|
||||||
{'year': 2018, 'column': 'FK'},
|
{'year': 2018, 'column': 'FK'},
|
||||||
{'year': 2019, 'column': 'FL'},
|
{'year': 2019, 'column': 'FL'},
|
||||||
{'year': 2020, 'column': 'FM'},
|
{'year': 2020, 'column': 'FM'},
|
||||||
{'year': 2021, 'column': 'FN'},
|
{'year': 2021, 'column': 'FN'},
|
||||||
{'year': 2022, 'column': 'FO'},
|
{'year': 2022, 'column': 'FO'},
|
||||||
{'year': 2023, 'column': 'FP'},
|
{'year': 2023, 'column': 'FP'},
|
||||||
{'year': 2024, 'column': 'FQ'}
|
{'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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# 提取各教育阶段数据
|
# 遍历数据行(跳过前4行表头,与T4_2保持一致)
|
||||||
for stage, config in data_columns.items():
|
for row_num, row in enumerate(sheet.iter_rows(min_row=4, values_only=True), start=4):
|
||||||
stage_data = {}
|
# 区域名称从B列获取(索引1)
|
||||||
# 处理学前/小学/初中/高中(多类别)
|
raw_name = row[1] if (len(row) > 1 and row[1] is not None) else '未知地区'
|
||||||
if 'categories' in config:
|
if not raw_name: # 跳过空行
|
||||||
for year_config in config['columns']:
|
continue
|
||||||
year = year_config['year']
|
|
||||||
year_data = {}
|
# 区域名称转换
|
||||||
for category in config['categories']:
|
str_raw_name = str(raw_name).strip() if raw_name is not None else '未知地区'
|
||||||
col_name = year_config[category]
|
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
|
col_idx = openpyxl.utils.column_index_from_string(col_name) - 1
|
||||||
if col_idx < len(row):
|
if col_idx < len(row):
|
||||||
value = row[col_idx]
|
value = row[col_idx]
|
||||||
# 数据清洗
|
|
||||||
if value is None:
|
if value is None:
|
||||||
year_data[category] = 0
|
stage_data[str(year)] = 0
|
||||||
else:
|
else:
|
||||||
str_value = str(value).strip()
|
str_value = str(value).strip()
|
||||||
if str_value in ['', '####']:
|
stage_data[str(year)] = int(str_value) if str_value.isdigit() else 0
|
||||||
year_data[category] = 0
|
area_data[stage] = stage_data
|
||||||
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
|
|
||||||
|
|
||||||
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:
|
print(f"✅ 学校数数据提取完成,已保存至:{JSON_PATH}")
|
||||||
json.dump(school_data, f, ensure_ascii=False, indent=2)
|
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"✅ 学校数数据提取完成,已保存至:{JSON_PATH}")
|
print(f"🔴 错误:Excel文件 '{file_name}' 不存在")
|
||||||
print(f"📊 共处理 {len(school_data)} 条地区数据")
|
except Exception as e:
|
||||||
print("\n=== 名称转换记录 ===")
|
print(f"🔴 处理数据时发生错误:{str(e)}{traceback.format_exc()}") # 修复:添加闭合引号
|
||||||
if conversion_records:
|
finally:
|
||||||
for record in conversion_records:
|
try:
|
||||||
print(f"🔄 行 {record['row']}: {record['raw_name']} → {record['converted_name']}")
|
if workbook:
|
||||||
print(f"📊 共检测到 {len(conversion_records)} 项名称转换")
|
workbook.close()
|
||||||
else:
|
except:
|
||||||
print("📝 不存在名称转换的情况")
|
pass
|
||||||
if name_conversion_errors:
|
|
||||||
print(f"⚠️ 发现 {len(name_conversion_errors)} 个区域名称转换失败:")
|
|
||||||
for error in name_conversion_errors:
|
|
||||||
print(f" - {error}")
|
|
||||||
|
|
||||||
except FileNotFoundError:
|
if __name__ == "__main__":
|
||||||
print(f"🔴 错误:Excel文件 '{file_name}' 不存在")
|
main()
|
||||||
except Exception as e:
|
|
||||||
print(f"🔴 处理数据时发生错误:{str(e)}{traceback.format_exc()}") # 修复:添加闭合引号
|
|
@@ -6,266 +6,272 @@ import traceback
|
|||||||
from Config.Config import EXCEL_PATH
|
from Config.Config import EXCEL_PATH
|
||||||
from Util.AreaUtil import query_area_info
|
from Util.AreaUtil import query_area_info
|
||||||
|
|
||||||
# 创建数据保存目录
|
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路径
|
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
|
file_name = EXCEL_PATH
|
||||||
area_data = []
|
area_data = []
|
||||||
name_conversion_errors = [] # 记录转换失败的名称
|
name_conversion_errors = [] # 记录转换失败的名称
|
||||||
conversion_records = [] # 定义转换记录变量
|
conversion_records = [] # 定义转换记录变量
|
||||||
|
|
||||||
|
workbook = None # 初始化workbook变量,确保在finally块中可以访问
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 加载工作簿并选择学校面积、教学辅助房面积Sheet
|
# 加载工作簿并选择学校面积、教学辅助房面积Sheet
|
||||||
workbook = openpyxl.load_workbook(file_name, data_only=True)
|
workbook = openpyxl.load_workbook(file_name, data_only=True)
|
||||||
if '学校面积、教学辅助房面积' not in workbook.sheetnames:
|
if '学校面积、教学辅助房面积' not in workbook.sheetnames:
|
||||||
print("❌ 错误:未找到'学校面积、教学辅助房面积'Sheet")
|
print("❌ 错误:未找到'学校面积、教学辅助房面积'Sheet")
|
||||||
exit(1)
|
return
|
||||||
sheet = workbook['学校面积、教学辅助房面积']
|
sheet = workbook['学校面积、教学辅助房面积']
|
||||||
|
|
||||||
# 定义数据列范围与英文属性映射
|
# 定义数据列范围与英文属性映射
|
||||||
data_columns = {
|
data_columns = {
|
||||||
# 学前教育(每年份8列:学校占地面积[总计/城区/镇区/乡村],教学及辅助用房[总计/城区/镇区/乡村])
|
# 学前教育(每年份8列:学校占地面积[总计/城区/镇区/乡村],教学及辅助用房[总计/城区/镇区/乡村])
|
||||||
'preschool_area': {
|
'preschool_area': {
|
||||||
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
||||||
'columns': [
|
'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': 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': 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': 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': 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': 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': 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': 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': 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': 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'}
|
{'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': {
|
'primary_area': {
|
||||||
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
||||||
'columns': [
|
'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': 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': 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': 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': 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': 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': 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': 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': 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': 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'}
|
{'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': {
|
'junior_high_area': {
|
||||||
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
||||||
'columns': [
|
'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': 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': 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': 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': 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': 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': 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': 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': 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': 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'}
|
{'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': {
|
'senior_high_area': {
|
||||||
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
||||||
'columns': [
|
'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': 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': 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': 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': 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': 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': 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': 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': 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': 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'}
|
{'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列)
|
# 中职教育(特殊:每年2列)
|
||||||
'vocational_area': {
|
'vocational_area': {
|
||||||
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
'years': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
|
||||||
'columns': [
|
'columns': [
|
||||||
{'year': 2015, 'school_total': 'LL', 'teaching_total': 'LM'},
|
{'year': 2015, 'school_total': 'LL', 'teaching_total': 'LM'},
|
||||||
{'year': 2016, 'school_total': 'LN', 'teaching_total': 'LO'},
|
{'year': 2016, 'school_total': 'LN', 'teaching_total': 'LO'},
|
||||||
{'year': 2017, 'school_total': 'LP', 'teaching_total': 'LQ'},
|
{'year': 2017, 'school_total': 'LP', 'teaching_total': 'LQ'},
|
||||||
{'year': 2018, 'school_total': 'LR', 'teaching_total': 'LS'},
|
{'year': 2018, 'school_total': 'LR', 'teaching_total': 'LS'},
|
||||||
{'year': 2019, 'school_total': 'LT', 'teaching_total': 'LU'},
|
{'year': 2019, 'school_total': 'LT', 'teaching_total': 'LU'},
|
||||||
{'year': 2020, 'school_total': 'LV', 'teaching_total': 'LW'},
|
{'year': 2020, 'school_total': 'LV', 'teaching_total': 'LW'},
|
||||||
{'year': 2021, 'school_total': 'LX', 'teaching_total': 'LY'},
|
{'year': 2021, 'school_total': 'LX', 'teaching_total': 'LY'},
|
||||||
{'year': 2022, 'school_total': 'LZ', 'teaching_total': 'MA'},
|
{'year': 2022, 'school_total': 'LZ', 'teaching_total': 'MA'},
|
||||||
{'year': 2023, 'school_total': 'MB', 'teaching_total': 'MC'},
|
{'year': 2023, 'school_total': 'MB', 'teaching_total': 'MC'},
|
||||||
{'year': 2024, 'school_total': 'MD', 'teaching_total': 'ME'}
|
{'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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# 提取各教育阶段面积数据
|
# 遍历数据行(跳过前4行表头,从第5行开始)
|
||||||
for stage, config in data_columns.items():
|
for row_num, row in enumerate(sheet.iter_rows(min_row=5, values_only=True), start=5):
|
||||||
stage_data = {}
|
# 区域名称从B列获取(索引1)
|
||||||
for year_config in config['columns']:
|
raw_name = row[1] if (len(row) > 1 and row[1] is not None) else '未知地区'
|
||||||
year = year_config['year']
|
if not raw_name: # 跳过空行
|
||||||
year_data = {}
|
continue
|
||||||
# 处理学校占地面积数据
|
|
||||||
school_cols = ['school_total', 'school_urban', 'school_town', 'school_rural']
|
# 区域名称转换
|
||||||
has_school_categories = all(col in year_config for col in school_cols)
|
str_raw_name = str(raw_name).strip() if raw_name is not None else '未知地区'
|
||||||
|
area_info = query_area_info(str_raw_name)
|
||||||
if has_school_categories:
|
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']
|
||||||
for col in school_cols:
|
area_code = area_info['area_code']
|
||||||
col_name = year_config[col]
|
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
|
col_idx = openpyxl.utils.column_index_from_string(col_name) - 1
|
||||||
if col_idx < len(row):
|
if col_idx < len(row):
|
||||||
value = row[col_idx]
|
value = row[col_idx]
|
||||||
# 数据清洗与转换
|
|
||||||
if value is None:
|
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
|
year_data['school_total'] = 0
|
||||||
else:
|
else:
|
||||||
try:
|
str_value = str(value).strip()
|
||||||
year_data['school_total'] = float(str_value)
|
if str_value in ['', '####']:
|
||||||
except ValueError:
|
|
||||||
year_data['school_total'] = 0
|
year_data['school_total'] = 0
|
||||||
|
else:
|
||||||
# 处理教学辅助用房面积数据
|
try:
|
||||||
teaching_cols = ['teaching_total', 'teaching_urban', 'teaching_town', 'teaching_rural']
|
year_data['school_total'] = float(str_value)
|
||||||
has_teaching_categories = all(col in year_config for col in teaching_cols)
|
except ValueError:
|
||||||
|
year_data['school_total'] = 0
|
||||||
if has_teaching_categories:
|
|
||||||
# 处理分类教学辅助用房面积数据
|
# 处理教学辅助用房面积数据
|
||||||
for col in teaching_cols:
|
teaching_cols = ['teaching_total', 'teaching_urban', 'teaching_town', 'teaching_rural']
|
||||||
col_name = year_config[col]
|
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
|
col_idx = openpyxl.utils.column_index_from_string(col_name) - 1
|
||||||
if col_idx < len(row):
|
if col_idx < len(row):
|
||||||
value = row[col_idx]
|
value = row[col_idx]
|
||||||
# 数据清洗与转换
|
|
||||||
if value is None:
|
if value is None:
|
||||||
year_data[col] = 0
|
year_data['teaching_total'] = 0
|
||||||
else:
|
else:
|
||||||
str_value = str(value).strip()
|
str_value = str(value).strip()
|
||||||
if str_value in ['', '####']:
|
if str_value in ['', '####']:
|
||||||
year_data[col] = 0
|
year_data['teaching_total'] = 0
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
year_data[col] = float(str_value)
|
year_data['teaching_total'] = float(str_value)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
year_data[col] = 0
|
year_data['teaching_total'] = 0
|
||||||
else:
|
|
||||||
# 处理中职教学辅助用房总面积
|
stage_data[str(year)] = year_data
|
||||||
col_name = year_config['teaching_total']
|
# 修复:将阶段数据添加到当前区域字典,而非区域列表
|
||||||
col_idx = openpyxl.utils.column_index_from_string(col_name) - 1
|
current_area_data[stage] = stage_data
|
||||||
if col_idx < len(row):
|
|
||||||
value = row[col_idx]
|
# 将当前区域数据添加到列表
|
||||||
if value is None:
|
area_data.append(current_area_data)
|
||||||
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)
|
|
||||||
|
|
||||||
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:
|
print(f"✅ 学校面积数据提取完成,已保存至:{JSON_PATH}")
|
||||||
json.dump(area_data, f, ensure_ascii=False, indent=2)
|
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"✅ 学校面积数据提取完成,已保存至:{JSON_PATH}")
|
print(f"🔴 错误:Excel文件 '{file_name}' 不存在")
|
||||||
print(f"📊 共处理 {len(area_data)} 条地区数据")
|
except Exception as e:
|
||||||
print("\n=== 名称转换记录 ===")
|
print(f"🔴 处理数据时发生错误:{str(e)}{traceback.format_exc()}")
|
||||||
if conversion_records:
|
finally:
|
||||||
for record in conversion_records:
|
try:
|
||||||
print(f"🔄 行 {record['row']}: {record['raw_name']} → {record['converted_name']}")
|
if workbook:
|
||||||
print(f"📊 共检测到 {len(conversion_records)} 项名称转换")
|
workbook.close()
|
||||||
else:
|
except:
|
||||||
print("📝 不存在名称转换的情况")
|
pass
|
||||||
if name_conversion_errors:
|
|
||||||
print(f"⚠️ 发现 {len(name_conversion_errors)} 个区域名称转换失败:")
|
|
||||||
for error in name_conversion_errors:
|
|
||||||
print(f" - {error}")
|
|
||||||
|
|
||||||
except FileNotFoundError:
|
if __name__ == "__main__":
|
||||||
print(f"🔴 错误:Excel文件 '{file_name}' 不存在")
|
main()
|
||||||
except Exception as e:
|
|
||||||
print(f"🔴 处理数据时发生错误:{str(e)}{traceback.format_exc()}")
|
|
||||||
finally:
|
|
||||||
try:
|
|
||||||
workbook.close()
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
BIN
Tools/__pycache__/T1_RenKou.cpython-310.pyc
Normal file
BIN
Tools/__pycache__/T1_RenKou.cpython-310.pyc
Normal file
Binary file not shown.
BIN
Tools/__pycache__/T2_MaoRuXueLv.cpython-310.pyc
Normal file
BIN
Tools/__pycache__/T2_MaoRuXueLv.cpython-310.pyc
Normal file
Binary file not shown.
BIN
Tools/__pycache__/T3_SchoolCount.cpython-310.pyc
Normal file
BIN
Tools/__pycache__/T3_SchoolCount.cpython-310.pyc
Normal file
Binary file not shown.
BIN
Tools/__pycache__/T4_ClassCount.cpython-310.pyc
Normal file
BIN
Tools/__pycache__/T4_ClassCount.cpython-310.pyc
Normal file
Binary file not shown.
BIN
Tools/__pycache__/T5_ZhaoShengCount.cpython-310.pyc
Normal file
BIN
Tools/__pycache__/T5_ZhaoShengCount.cpython-310.pyc
Normal file
Binary file not shown.
BIN
Tools/__pycache__/T6_ZaiXiaoShengCount.cpython-310.pyc
Normal file
BIN
Tools/__pycache__/T6_ZaiXiaoShengCount.cpython-310.pyc
Normal file
Binary file not shown.
BIN
Tools/__pycache__/T7_TeacherCount.cpython-310.pyc
Normal file
BIN
Tools/__pycache__/T7_TeacherCount.cpython-310.pyc
Normal file
Binary file not shown.
BIN
Tools/__pycache__/T8_SchoolMianJi.cpython-310.pyc
Normal file
BIN
Tools/__pycache__/T8_SchoolMianJi.cpython-310.pyc
Normal file
Binary file not shown.
Reference in New Issue
Block a user