如何使用os.walk实现arcpy脚本批量处理文件夹内所有地理数据库
批量处理文件夹内所有地理数据库的解决方案
优化后的脚本
import arcpy import os def process_gdb(gdb_path, output_file): """处理单个地理数据库,提取要素类、表格、栅格等信息并写入输出文件""" arcpy.env.workspace = gdb_path # 处理根目录下的要素类 fcs = arcpy.ListFeatureClasses() for fc in fcs: fc_path = os.path.join(gdb_path, fc) desc = arcpy.Describe(fc_path) output_file.write(f"{gdb_path},NA,{desc.dataType},{fc},{desc.shapeType}\n") # 处理要素数据集内的要素类 fds = arcpy.ListDatasets("", "Feature") for fd in fds: fds_path = os.path.join(gdb_path, fd) arcpy.env.workspace = fds_path fcs_in_fd = arcpy.ListFeatureClasses() for fc in fcs_in_fd: fc_path = os.path.join(fds_path, fc) desc = arcpy.Describe(fc_path) output_file.write(f"{gdb_path},{fd},{desc.dataType},{fc},{desc.shapeType}\n") # 重置工作空间回当前GDB,避免影响后续操作 arcpy.env.workspace = gdb_path # 处理表格 tables = arcpy.ListTables() for table in tables: table_path = os.path.join(gdb_path, table) desc = arcpy.Describe(table_path) output_file.write(f"{gdb_path},NA,{desc.dataType},{table},\n") # 处理栅格 rasters = arcpy.ListRasters("","") for raster in rasters: raster_path = os.path.join(gdb_path, raster) desc = arcpy.Describe(raster_path) output_file.write(f"{gdb_path},NA,{desc.dataType},{raster},{desc.format}\n") if __name__ == "__main__": # 替换为你要批量处理的根文件夹路径 root_folder = r"\\hanford\data\sitedata\LTS_GIS\HGIS\Data" # 替换为你的输出文本文件路径 output_text_path = r"\\hanford\data\sitedata\LTS_GIS\HGIS\Data\test2.txt" # 打开输出文件,全程追加写入 with open(output_text_path, "a") as output_file: # 遍历根文件夹下所有子目录 for root, dirs, files in os.walk(root_folder): # 筛选出地理数据库(以.gdb结尾的目录) for dir_name in dirs: if dir_name.endswith(".gdb"): gdb_full_path = os.path.join(root, dir_name) print(f"正在处理: {gdb_full_path}") process_gdb(gdb_full_path, output_file)
关键说明
- 批量遍历逻辑:通过
os.walk遍历目标文件夹的所有子目录,筛选出.gdb结尾的目录(地理数据库本质是特殊结构的文件夹) - 代码复用:将单个GDB的处理逻辑封装为
process_gdb函数,避免原脚本中重复的代码块,提升可维护性 - 文件操作优化:使用
with语句管理输出文件,全程只打开一次,自动处理关闭,比原脚本多次打开/关闭更高效且安全 - 缩进修正:修复了原脚本中for循环代码块缺少缩进的语法错误
- 工作空间重置:处理完要素数据集后重置工作空间,避免后续表格、栅格的读取出现错误
内容的提问来源于stack exchange,提问作者Chase Freeman
相关产品推荐
相关产品推荐

