arcpy通过变量与循环批量读取多文件实现波段合成
ArcPy批量合成多波段栅格脚本报错修复方案
问题说明
- 需求:通过变量结合循环的方式批量读取按规则命名的单波段栅格文件,调用
CompositeBands工具完成多波段合成 - 文件命名规则:所有栅格已统一重命名为
位置编码_年份_波段号.TIF格式,例:042024_2017_B2.TIF,前6位为位置编码,中间4位为年份,末尾为波段编号;每年份约80景影像,每景包含6个波段,提取的6位位置编码列表输出正常 - 初始代码运行报错:触发
ERROR 000732(输入栅格不存在/不支持)、ERROR 000354(名称含非法字符),脚本无法识别路径中的变量占位符,合成流程执行失败
初始错误代码
import os import arcpy.geoprocessing path = r"F:\Earth\2018\Bands\\" files = os.listdir(path) RowColumn = [] for TIF in files: firstsix = TIF[0:6] RowColumn.append(firstsix) RowColumn = list(dict.fromkeys(RowColumn)) year= ['2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020'] for code in RowColumn: with arcpy.EnvManager(scratchWorkspace=r"F:\Earth\'year'\project_'year'\project_'year'.gdb", workspace=r"F:\Earth\'year'\project_'year'\project_'year'.gdb"): arcpy.management.CompositeBands( r"F:\Earth\'year'\Bands\'code'_'year'_B2.TIF;" r"F:\Earth\'year'\Bands\'code'_'year'_B3.TIF;" r"F:\Earth\'year'\Bands\'code'_'year'_B4.TIF;" r"F:\Earth\'year'\Bands\'code'_'year'_B5.TIF;" r"F:\Earth\'year'\Bands\'code'_'year'_B6.TIF;" r"F:\Earth\'year'\Bands\'code'_'year'_B7.TIF", r"F:\Earth\'year'\project_'year'\project_'year'.gdb\a'code'_'year'")
报错核心原因:Python原生字符串不会自动解析字符串内书写的
'year'/'code'为变量,这类写法会被直接识别为路径的一部分,最终生成的路径包含单引号非法字符,也和实际文件路径不匹配。
可正常运行的修正代码
核心修正逻辑:
- 使用
fr前缀的格式化字符串,同时支持Windows路径转义和变量插值,直接将变量嵌入路径,替换原有无效占位符 - 补全年份外层循环,按年份逐批次处理对应目录下的栅格文件
- 增加前置文件批量重命名逻辑,统一所有输入文件的命名格式
- 增加合成后栅格的空值拷贝处理、原始单波段文件清理逻辑,适配后续镶嵌流程
import os import arcpy.geoprocessing years = ['2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020'] print(years) # 批量重命名文件,统一命名格式 for year in years: path = fr"F:\Earth\{year}\Bands\\" files = os.listdir(path) for file in files: src = path + file code = file[10:21] band = file[40:] dst = path + code + band os.renames(src, dst) for year in years: path = fr"F:\Earth\{year}\Bands\\" files = os.listdir(path) # 提取当前年份下所有不重复的位置编码 RowColumn = [] for TIF in files: firstsix = TIF[0:6] RowColumn.append(firstsix) RowColumn = list(dict.fromkeys(RowColumn)) print(RowColumn) # 逐景执行波段合成 for code in RowColumn: # 调用CompositeBands合成6个波段为单个多波段栅格 with arcpy.EnvManager(scratchWorkspace=fr"F:\Earth\{year}\project_{year}\project_{year}.gdb", workspace=fr"F:\Earth\{year}\project_{year}\project_{year}.gdb"): arcpy.management.CompositeBands( fr"F:\Earth\{year}\Bands\{code}_{year}_B2.TIF;" fr"F:\Earth\{year}\Bands\{code}_{year}_B3.TIF;" fr"F:\Earth\{year}\Bands\{code}_{year}_B4.TIF;" fr"F:\Earth\{year}\Bands\{code}_{year}_B5.TIF;" fr"F:\Earth\{year}\Bands\{code}_{year}_B6.TIF;" fr"F:\Earth\{year}\Bands\{code}_{year}_B7.TIF", fr"F:\Earth\{year}\project_{year}\project_{year}.gdb\a{code}_{year}") # 拷贝合成结果,清除空值,为后续镶嵌做准备 with arcpy.EnvManager(scratchWorkspace=fr"F:\Earth\{year}\project_{year}\project_{year}.gdb", workspace=fr"F:\Earth\{year}\project_{year}\project_{year}.gdb"): arcpy.management.CopyRaster(fr"a{code}_{year}", fr"F:\Earth\{year}\project_{year}\project_{year}.gdb\c{code}_{year}", '', 0, "0", "NONE", "NONE", "16_BIT_UNSIGNED", "NONE", "NONE", "TIFF", "NONE", "CURRENT_SLICE", "NO_TRANSPOSE") # 清理已处理完成的原始单波段文件 for fname in files: if fname.startswith(code): os.remove(os.path.join(path, fname)) print(f"位置编码{code}处理完成")
内容的提问来源于stack exchange,提问作者LostCoderKeith
相关产品推荐
相关产品推荐

