Openpyxl读取Excel多位数字时被逐字符拆分的问题排查
问题根因定位
- 核心触发逻辑错误:你写了多余的内层循环
for aoi in aoi_list。代码中先把A列的序号转成字符串赋值给aoi_list,之后直接遍历这个字符串——Python对字符串做遍历操作时,会逐个拆分出字符串里的单个字符,所以当序号为10(转成字符串是"10")时,循环会依次取出"1"、"0"两个独立字符,分别执行后续的路径生成、文件创建逻辑,直接导致多位数序号被拆分、生成大量无效冗余文件。 - 附带逻辑bug:
print(aoi, usaf, wban)语句写在了aoi变量赋值之前,运行时这里的aoi会引用上一轮循环残留的旧值,导致控制台打印的序号和实际处理的序号不匹配,干扰运行状态排查。 - 冗余代码问题:固定值
Great_Lake_Basin = 'Huron'写在了循环内部,每遍历一行数据就会重复给同一个变量赋相同值,属于无意义的性能损耗。
修复方案
直接删除多余的内层遍历循环,调整变量赋值和打印语句的位置即可,不需要修改其他文件处理逻辑:
- 把A列取出的序号值直接赋值给
aoi变量,不需要额外定义aoi_list再做遍历 - 把打印语句移到
aoi、usaf、wban三个变量都完成赋值之后,保证打印内容和实际处理值一致 - 把固定不变的流域名称变量提到循环外部赋值,减少冗余操作
修复后的可运行代码如下:
from openpyxl import load_workbook wb = load_workbook(filename='SG_Huron.xlsx', data_only=True) worksheet = wb['SG_Huron'] cells = worksheet['A2:C1202'] # 固定配置项提到循环外,避免重复赋值 Great_Lake_Basin = 'Huron' # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # 可修改配置: AOI编号 对应五大湖流域 [Erie, Huron, Michigan, Ontario, StClair, Superior] for i1, i2, i3 in cells: # 直接取三列值转字符串,删除多余的aoi_list定义和内层循环 aoi = str(i1.value) usaf = str(i2.value) wban = str(i3.value) # 打印语句移到变量赋值完成后 print(aoi, usaf, wban) # 所有路径生成、文件处理逻辑直接放在外层循环内即可,不需要嵌套遍历 # 最终输出路径 path_trunk = "C:/job/projects/Hydro/%s/%s/Inputs" % (Great_Lake_Basin, aoi) # AOI数据路径 path_aoi = "C:/job/a_prep_DEM_NLCD/%s/%s.shp" % (Great_Lake_Basin, aoi) # AOI数据文件名 file_aoi = "%s.shp" % (aoi) # DEM数据路径 path_dem = "C:/job/a_prep_DEM_NLCD/DEM/" # 原始DEM数据文件名 file_dem = "elev_cm_%s.tif" % (Great_Lake_Basin) # 此处接你原有的文件夹判断、文件生成逻辑即可
修复效果说明
- 序号10及以上的多位数会作为完整字符串传入路径拼接逻辑,不会被拆分为单个字符,从根源上避免错误路径和冗余文件生成
- 控制台打印的AOI序号、USAF、WBAN值和当前循环实际处理的数据完全对应,方便跟踪运行进度
- 移除冗余操作后代码运行效率有小幅提升
内容的提问来源于stack exchange,提问作者Jay Heppler
相关产品推荐
相关产品推荐

