То, что вы хотите сделать, - это использовать цикл for, который выполняет итерацию по каждому классу пространственных объектов, чтобы избежать нечетного процесса индексации, который происходит внутри вашего вызова arcpy.SymDiff.Например, использование i для индексации E_PointFeatures_ActiveOnly (пустой список) в качестве пути вывода не будет работать.Чтобы сделать это так, как вы хотите, вам нужно динамически генерировать имена файлов.При этом убедитесь, что выходная папка пуста, чтобы избежать конфликтов имен.Код, который у вас есть, также дублирует все для каждой папки, поэтому мы можем определить функции для его устранения, чтобы вы могли легко использовать его повторно.Наконец, вы действительно хотите избежать многократного изменения глобальных переменных, таких как arcpy.env.workspace - приведенная ниже функция для этого действительно многословна, но, поскольку это функция, вам нужно сделать это только один раз!Я предполагаю, что у вас есть доступ к версии arcgis> = 10.1. Следующий код является длинным и непроверенным, но я думаю, что он должен сработать:
import arcpy
arcpy.env.workspace = "T:\eALP_Update.gdb\Point_ActiveExisting"
def getFCs(folderOne, folderTwo):
"""Get feature classes from two folders"""
from os.path import join
x = []
y = []
folders = [folderOne, folderTwo]
for folder in folders:
for paths, directory, filenames in arcpy.da.Walk(
folder,
topdown=True,
followlinks=False,
datatype='FeatureClass',
type='ALL'):
for file in filenames:
if folder == folder[0]:
x.append(join(directory, file))
else:
y.append(join(directory, file))
return x, y
def batchSymDiff(inFolder, updateFolder, joinAttr, clusterTolerance):
"""Performs SymDiff analysis for every feature in a set of folders"""
inFeatures, updateFeatures = getFCs(inFolder, updateFolder)
for fc1, fc2 in zip(inFeatures, updateFeatures):
output = fc2.replace(".shp", "_sym.shp") # this naming pattern assumes ".shp" ending
arcpy.SymDiff_analysis(fc1, fc2, output, joinAttr, clusterTolerance)
# set variables for batch process
inFolder = "T:\eALP_Update.gdb\Point_DemoNew"
updateFolder = "T:\eALP_Update.gdb\Point_InputExisting"
joinAttr = "ALL"
clusterTolerance = "0.01"
# execute batchSymDiff
batchSymDiff(inFolder, updateFolder, joinAttr, clusterTolerance)
Этот код, вероятно, более многословен, чем должен иметь значение , но, делая это таким образом, вы можете избежать многократного изменения глобальных переменных - рискованный бизнес, так как ошибки, которые он вызывает, иногда очень трудно диагностировать - и это делает ваш код многократно используемым.Также обратите внимание, что это устраняет необходимость использования «ручного» счетчика (i).Надеюсь, поможет!Я предлагаю сначала протестировать код на тестовых данных.