如何用Python从Esri导出图层?地址与列表拼接脚本故障求助
Esri图层导出与脚本问题解决方案
一、Python从Esri导出图层的方法
根据导出格式不同,使用ArcPy工具实现,以下是常见场景:
1. 导出为Shapefile/FGDB要素类
使用arcpy.FeatureClassToFeatureClass_conversion工具,支持单个或批量导出:
import arcpy # 设置工作空间(SDE、FGDB或文件夹均可) arcpy.env.workspace = r"C:\Your\Workspace\Path" # 单个图层导出 input_layer = "your_feature_class" output_path = r"C:\Output\Folder" output_name = "exported_feature.shp" arcpy.FeatureClassToFeatureClass_conversion(input_layer, output_path, output_name) # 批量导出匹配前缀的图层 fcs = arcpy.ListFeatureClasses("AEP*") for fc in fcs: arcpy.FeatureClassToFeatureClass_conversion(fc, output_path, f"exported_{fc}")
2. 导出属性表为CSV
使用arcpy.TableToTable_conversion工具:
arcpy.TableToTable_conversion(input_layer, output_path, "address_list.csv")
3. 导出为图层文件(.lyrx)
使用arcpy.SaveToLayerFile_management工具:
arcpy.SaveToLayerFile_management(input_layer, r"C:\Output\exported_layer.lyrx")
二、脚本错误排查与修正
你的脚本存在多处语法与逻辑错误,以下是问题点及修正后的代码:
错误点梳理
- 未定义变量
Rezo:joiend = [target, Rezo]触发NameError,需删除或定义该变量 - glob返回列表处理错误:
glob.glob()返回列表,直接''.join(target)会乱拼元素,应取第一个匹配路径target[0] - 无效循环:
for ready in joiend未使用循环变量,直接覆盖ready,完全冗余 - 错误的列表操作:
List.insert()是错误语法,Python无全局List类 - 字符串join方法误用:
fcs.join(ready)错误,join是字符串方法,需用os.path.join()拼接路径 - 缺失必要模块导入:未导入
glob、os模块
修正后的代码(匹配生成完整SDE路径+要素类的需求)
如果你的目标是生成每个要素类的完整SDE路径,修正代码如下:
import arcpy import glob import os # 匹配目标目录 targetPattern = r"C:\Users\**\AppData\Roaming\Esri\ArcGISPro\Favorites" target_list = glob.glob(targetPattern) if not target_list: print("未找到目标目录") exit() target = target_list[0] # 拼接SDE连接路径 sde_path = os.path.join(target, r"Rezo_h@geom06.sde\rezo_h.geom04.REGIE_EAU_POTABLE") arcpy.env.workspace = sde_path # 获取匹配的要素类 fcs = arcpy.ListFeatureClasses("rezo_h.geom04.AEP*") print("找到的要素类:", fcs) # 生成地址前缀+序号的列表(匹配你的需求示例) address_list = [f"paris street {i+1}" for i, fc in enumerate(fcs)] print("地址列表:", address_list) # 生成要素类完整SDE路径(如果需要) full_fc_paths = [os.path.join(sde_path, fc) for fc in fcs] print("完整要素类路径:", full_fc_paths)
针对“地址文本与列表拼接”需求的补充
如果你的需求是从要素类的地址字段提取内容,再与列表拼接,可添加字段读取逻辑:
# 读取要素类地址字段(假设字段名为"ADDRESS") for fc in fcs: with arcpy.da.SearchCursor(fc, ["ADDRESS"]) as cursor: for row in cursor: address = row[0] # 与数字列表拼接 for num in [1,2,3]: result = f"{address} {num}" print(result)
内容的提问来源于stack exchange,提问作者Daniel Pochoclin Rouffart
相关产品推荐
相关产品推荐

