Suite

Coupez un dossier de fichiers de formes par un autre avec les mêmes terminaisons de nom

Coupez un dossier de fichiers de formes par un autre avec les mêmes terminaisons de nom


J'ai deux dossiers avec des shapefiles : r'E:SOPolygons' et r'E:SODistricts'

Dans chaque dossier, j'ai 215 fichiers de formes nommés avec des conventions de dénomination similaires : poly_100 ou dist_100. Je dois découper les polygones par districts si leurs chiffres de fin sont égaux. Je suis nouveau sur python et je suis perdu :

#dossier pour les polygones Voronoi découpés Voronoi_file = str(maindir) + "/" + "Voronoi_polygons" sinon os.path.exists(Voronio_file): os.makedirs(Voronoi_file) env.workspace = r'E:SOPolygons' outputworkspace= Voronoi_file count=0 pour fc dans arcpy.ListFeatureClasses() : end1 = str(fc[4:]) env.workspace = r'E:SODistrics' pour fc dans arcpy.ListFeatureClasses() : end2 = str (fc[4:]) if end1==end2: out_name = str((outputworkspace) + "/" + "dis_poly" + str(count)) # Assemblez le nom et le chemin du point de sortie arcpy.Clip_analysis(end1, end2, out_name) nombre = nombre + 1

Cela devrait le faire. Il tire parti de votre convention de nommage et suppose qu'il existe un "dist_xxx.shp" correspondant pour chaque "poly_xxx.shp".

import arcpy import os def getShapefiles(aDir): # Obtenir tous les fichiers du répertoire allfiles = os.listdir(aDir) # Isoler uniquement les fichiers *.shp shpOnly = [f pour f dans tous les fichiers if (os.path.splitext( f)[1] == ".shp")] return shpOnly def makeDictionary(aFCList): aDict = {} pour fc dans aFCList: idNumber = fc.split("_")[1] aDict[idNumber] = fc return aDict # Fichiers d'entrée polysDir = r'E:SOPolygons' districtsDir = r'E:SODistricts' # Notez la correction orthographique # Isolez les fichiers .shp dans les listes polys = getShapefiles(polysDir) districts = getShapefiles(districtsDir) # Créer un dictionnaire de fichiers de districts indexés par leurs numéros districtsDictionary = makeDictionary(districts) # Itérer à travers les tâches de découpage pour p dans polys : pFileName = os.path.split(p)[1] # S'il y a des traits de soulignement dans le contenant noms de répertoire idNumber = pFileName.split("_")[1] # Récupère les chiffres après le "_". clippingFeatures = districtsDictionary[idNumber] # Trouvez le district correspondant. outName = os.path.splitext(p)[0] + "_clp.shp" # Ajouter "_clp" ; suppose des shapfiles, pas des fc de gdb. arcpy.Clip_analysis(p, clippingFeatures, outName) # Clip.

Vous créez une liste dans lepourligne:

pour fc dans arcpy.ListFeatureClasses() :

arcpyutilise l'environnement de l'espace de travail lors du retour de la liste que vous avez modifiée. Vous avez également utilisé la même variablefcdans les deux boucles !

Essaye ça:

arcpy.env.workspace = r'E:SOPolygons' myList = arcpy.ListFeatureClasses() pour fc dans MyList : end1 = str(fc[4:]) arcpy.env.workspace = r'E:SO myList2 de Districs = arcpy.ListFeatureClasses() pour fc2 dans MyList2 : # do clip

C'est comme ça que je ferais. Ce n'est pas testé mais devrait fonctionner. Le code parcourt la liste des classes d'entités de vos deux répertoires et recherche les fichiers trouvés dans les deux répertoires qui ont les mêmes chiffres après le trait de soulignement :

import arcpy, os clippeeDir = r'E:SOPolygons' clipperDir = r'E:SODistrics' outDir = r'E:SOVoronio_file' arcpy.env.worksapce = clippeeDir pour c1 dans arcpy.ListFeatureClasses (): print c1 clippeeFile,clippeecCode = c1.split('_') arcpy.env.workspace = clipperDir pour c2 dans arcpy.ListFeatureClasses(): clipperFile,clipperCode = c2.split('_') if clippeecCode == clipperCode : clippee = os.path.join(clippeeDir,clippeeFile) clipper = os.path.join(clipperDir,clipperFile) outFile = os.path.join(outDir,file+code+'_clip') arcpy.Clip_analysis(clippee,clipper, outFile)