You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:03:27