Liste des classes d'entités dans plusieurs géodatabases dans un dossier à l'aide d'ArcPy?

11

J'ai un dossier contenant de nombreuses géodatabases. Les géodatabases contiennent des classes d'entités. J'aimerais obtenir une liste des classes d'entités dans ces géodatabases à l'aide d'un script Python. Je suis seulement arrivé à lister les géodatabases. Quelqu'un a-t-il une suggestion sur la liste des classes d'entités dans les géodatabases?

La ligne d'article d'impression dans mon script me donne les résultats suivants:

C:\output\data.gdb 
C:\output\otherdata.gdb
C:\output\somethingelse.gdb

Je souhaite générer une liste des classes d'entités dans les géodatabases ci-dessus. Voici mon script jusqu'à présent.

    import arcpy, os, sys
    from arcpy import env

    arcpy.env.workspace = "D:\\output"
    inWorkspace = arcpy.env.workspace

    workspaces = arcpy.ListWorkspaces("*", "FileGDB")
    for item in workspaces:
         print item #This part gives me the print statements I shared above
    # fcList = arcpy.ListFeatureClasses() #I haven't figured this part out
    #I want to list the feature classes in the geodatabases
Patty Jula
la source
1
Existe-t-il également des jeux de données d'entités dans les géodatabases?
blah238
Non, aucun jeu de données d'entité.
Patty Jula

Réponses:

14

L'astuce qui vous manque est de faire de chaque gdb l'espace de travail actif avant de lister le contenu:

for item in workspaces:
    print item
    env.workspace = item
    fcs = arcpy.ListFeatureClasses()
    for fc in fcs:
        print '\t', fc

Notez également qu'il manquera une classe d'entités dans les jeux de données d'entités, voir Liste de toutes les classes d'entités dans la géodatabase fichier, y compris dans les jeux de données d'entités? pour résoudre ça.

Plus généralement, si vous utilisez, rvous n'avez pas besoin de tout doubler la barre oblique inverse (facilite le copier-coller depuis la barre d'adresse de l'explorateur Windows, etc.): par exempler'D:\output'

Matt Wilkie
la source
1
Cool, ça a marché! J'ai également pris quelques autres outils de ce que vous avez partagé - je ne savais pas que je pouvais utiliser env.workspace comme ça. Je vous remercie!
Patty Jula
1
@PattyJula Vous êtes la bienvenue Patty. De plus, il est généralement préférable d'éviter les mots génériques comme «élément» car cela pourrait s'appliquer à n'importe quoi et dans les scripts plus volumineux, cela prête à confusion. Il est plus facile de garder à l'esprit la distinction singulier -> pluriel - bien que vous ayez besoin de vous entraîner à surveiller les s finaux . J'utilise des abréviations pour aider avec ce dernier. Par exemple for wspace in workspaces:et for fc in featureclasses:.
matt wilkie
8

Ce script traitera de tous les jeux de données d'entités existants (au moins en théorie - je ne l'ai pas testé). Même idée générale cependant, s'il existe des ensembles de données d'entités, vous devez définir votre répertoire de travail sur cet ensemble de données avant de répertorier les entités.

import arcpy

dir = r'D:\output'
arcpy.env.workspace = dir

gdbList = arcpy.ListWorkspaces('*','FileGDB')

for gdb in gdbList:
    arcpy.env.workspace = gdb               #--change working directory to each GDB in list
    datasetList = arcpy.ListDatasets('*','Feature')     #--make a list of all (if any) feature datasets that exist in current GDB
    fcList = arcpy.ListFeatureClasses()         #--make a list of all feature in current GDB (root)
    for fc in fcList:
        print arcpy.env.workspace,fc            #--print directory,fc name
    for dataset in datasetList:
        arcpy.env.workspace = dataset   #--change working directory to each dataset (if any) in list
        fcList = arcpy.ListFeatureClasses()     #--make a list of all feature in current GDB (current dataset)
        for fc in fcList:
            print arcpy.env.workspace,fc        #--print directory,fc name
        arcpy.env.workspace = gdb
Jason
la source
1
+1 pour les commentaires et l'intégration des FD. Personnellement, je n'utiliserais pas 'temp' comme nom de variable en raison de la signification associée de "jeter" et "libre de supprimer". La variable est jetable, mais son contenu, les bases de données, ne le sont probablement pas. Dans tous les cas, dans ce cas, c'est inutile, il suffit de l'utiliser arcpy.env.workspace = gdbcar ListWorkspaces renvoie le chemin complet. ;-)
matt wilkie
Tu as tout à fait raison, Matt. Je mettrai à jour l'exemple pour référence future. De plus, j'ai oublié une ligne à la fin qui réinitialise l'espace de travail à la base de données parent avant d'essayer d'accéder au jeu de données d'entité suivant (même si ce n'est pas nécessaire dans ce cas).
Jason