Créer des listes de données

L'une des principales tâches effectuées dans le cadre d'un script de traitement par lots consiste à cataloguer les données disponibles afin de les explorer lors du traitement. ArcPy dispose de plusieurs fonctions créées spécifiquement pour la création de ces listes.

FonctionDescription

ListFields(dataset, wild_card, field_type)

Retourne la liste des champs trouvés dans la valeur en entrée

ListIndexes(dataset, wild_card)

Retourne la liste des index attributaires trouvés dans la valeur en entrée

ListDatasets(wild_card, feature_type)

Retourne les jeux de données de l'espace de travail actuel

ListFeatureClasses(wild_card, feature_type, feature_dataset)

Retourne les classes d'entités de l'espace de travail actuel

ListFiles(wild_card)

Retourne les fichiers de l'espace de travail actuel

ListRasters(wild_card, raster_type)

Retourne la liste des rasters trouvés dans l'espace de travail actuel

ListTables(wild_card, table_type)

Retourne la liste des tables trouvées dans l'espace de travail actuel

ListWorkspaces(wild_card, workspace_type)

Retourne la liste des espaces de travail trouvés dans l'espace de travail actuel

ListVersions(sde_workspace)

Retourne la liste des versions que l'utilisateur connecté est autorisé à utiliser

Fonctions de liste

Le résultat de chacune de ces méthodes est une liste, c'est-à-dire une liste de valeurs. Une liste peut contenir tout type de données, tel qu'une chaîne, pouvant représenter, par exemple, un chemin d'accès à un jeu de données, un champ ou une ligne dans une table. Lorsque la liste est créée avec les valeurs de votre choix, vous pouvez l'itérer dans votre script pour utiliser chaque valeur individuelle.

Paramètres des fonctions de liste

Les paramètres de ces fonctions sont semblables. Certaines, comme la fonction ListFields, nécessitent une valeur de jeu de données en entrée car les éléments que ces fonctions répertorient figurent dans un certain objet ou jeu de données. D'autres fonctions ne nécessitent aucun jeu de données en entrée, car elles répertorient les données présentes dans l'espace de travail courant et définies dans les paramètres d'environnement. Toutes les fonctions comportent un paramètre de caractère générique utilisé pour trier les objets ou jeux de données répertoriés par nom. Un caractère générique définit un filtre de nom, et tout le contenu de la liste qui vient d'être créée doit passer par ce filtre. Par exemple, vous pouvez répertorier toutes les classes d'entités d'un espace de travail commençant par la lettre G. L'exemple suivant montre comment effectuer cette opération :

import arcpy
# Set the workspace. List all of the feature classes that start with 'G'
arcpy.env.workspace = "D:/St_Johns/data.gdb"
fcs = arcpy.ListFeatureClasses("G*")

La liste peut être également limitée à certaines propriétés de données telles que des classes d'entités surfaciques, des champs d'entiers ou des jeux de données de couverture. Le paramètre de type est utilisé pour cette opération dans toutes les fonctions. Dans l'exemple suivant, les classes d'entités d'un espace de travail sont filtrées à l'aide d'un caractère générique et d'un type de données de sorte que seules les classes d'entités surfaciques commençant par la lettre G figurent dans la liste de résultats :

# Set the workspace. List all of the polygon feature classes that 
# start with 'G'
arcpy.env.workspace = "D:/St_Johns/data.gdb"
fcs = arcpy.ListFeatureClasses("G*", "polygon")

Utilisation de votre liste

ArcPy utilise un type de liste Python comme type en retour pour tous les résultats des fonctions de liste, car les listes offrent la flexibilité nécessaire à un accès aux données et à plusieurs types de données. Une boucle for s'avère idéale si vous utilisez une liste, car elle peut être utilisée pour parcourir un à un les éléments de la liste. Une boucle for parcourt chaque élément de la liste. Voici un exemple de boucle for utilisée pour explorer la liste créée dans l'exemple précédent :

# For each feature class in the list of feature classes
for fc in fcs: 
    # Copy the features from the workspace to a folder
    arcpy.CopyFeatures_management(fc, "D:/St_Johns/Shapefiles/" + fc)

Voici un autre exemple d'utilisation d'une fonction de liste ArcPy. Ce script sert à créer des pyramides de rasters pour tous les rasters représentant des images TIFF (Tagged Image File Format) dans un dossier.

# Set the workspace. List all of the TIFF files
arcpy.env.workspace = "D:/St_Johns/images"
# For each raster in the list of rasters
for tiff in arcpy.ListRasters("*", "TIF"): 
    # Create pyramids
    arcpy.BuildPyramids_management(tiff)

Une liste permet d'utiliser et de gérer les résultats d'une fonction de liste de plusieurs manières. Les listes constituent un type Python polyvalent et fournissent plusieurs méthodes (append, count, extend, index, insert, pop, remove, reverse et sort) pouvant être utilisées pour manipuler et extraire les informations.

Par exemple, si vous voulez savoir combien vous avez de classes d'entités dans un espace de travail, vous pouvez utiliser la fonction len intégrée de Python pour connaître ce nombre.

import arcpy
arcpy.env.workspace = "c:/St_Johns/Shapefiles"
fcs = arcpy.ListFeatureClasses()
# Use Python's built-in function len to reveal the number of feature classes
# in the workspace
fcCount = len(fcs)
print(fcCount)
Astuce :

Le contenu des listes peut facilement être affiché. Les listes peuvent être manipulées avec plusieurs méthodes, y compris sort, append et reverse.

>>> import arcpy
>>> arcpy.env.workspace  = "c:/data/water.gdb"
>>> fcs = arcpy.ListFeatureClasses()
>>> print(fcs)
['water_pipes', 'water_services', 'water_stations']
>>> fcs.sort(reverse=True)
>>> print(fcs)
['water_stations', 'water_services', 'water_pipes']

Puisque les listes correspondent à une collection ordonnée, elles permettent également l'indexation et le découpage.

>>> print(fcs[0])
water_stations
>>> print(fcs[1:])
['water_services', 'water_pipes']

Recherche de répertoires et de sous-répertoires

Les fonctions de liste ArcPy peuvent être utilisées pour itérer sur un seul répertoire ou espace de travail, mais dans certains cas, l'itération dans d'autres sous-dossiers et espaces de travail est nécessaire. Concernant les fichiers, cette opération peut s'effectuer avec la fonction os.walk de Python, qui permet d'itérer ou de parcourir des dossiers pour trouver d'autres sous-dossiers et fichiers. La fonction os.walk est toutefois strictement basée sur des fichiers et ne reconnaît pas les bases de données et les types de données qui ne sont pas basés sur des fichiers, qui sont importants dans ArcGIS. Par exemple, os.walk ne verra pas les jeux de données raster ou d'autres contenus dans un espace de travail de la géodatabase fichier ou un jeu de classe d'entités.

Dans le module arcpy.da, la fonction Walk peut être utilisée pour effectuer une itération dans un répertoire. Elle peut également rechercher dans des bases de données et identifier des types de données ArcGIS.

Walk(top, topdown, onerror, followlinks, datatype, type)

Génère des noms de données dans une arborescence du Catalogue en parcourant l'arborescence de haut en bas ou de bas en haut. Chaque répertoire/espace de travail de l'arborescence donne un tuple de trois (dirpath, dirnames, filenames).

Fonction arcpy.da.Walk
Remarque :

Contrairement aux fonctions de liste, Walk n'utilise pas l'environnement de l'espace de travail pour identifier son espace de travail de départ. En revanche, le premier espace de travail de départ (ou top) que la fonction Walk parcourt est indiqué dans son premier argument top.

Dans l'exemple suivant, la fonction Walk est utilisée pour effectuer une itération dans une arborescence du Catalogue et pour identifier toutes les classes d'entités surfaciques qu'elle contient.

Utilisez la fonction Walk pour cataloguer les classes d’entités surfaciques.

import arcpy
import os
workspace = "c:/data"
feature_classes = []
for dirpath, dirnames, datatypes in arcpy.da.Walk(workspace,
                                                  datatype="FeatureClass",
                                                  type="Polygon"):
    # Append all Polygon feature classes to a list for further processing
    for datatype in datatypes:
        feature_classes.append(os.path.join(dirpath, filename))

Il convient dans certains cas d'éviter des sous-répertoires lors du parcours de l'arborescence du Catalogue, par exemple les répertoires des fichiers de sauvegarde. Si l'argument topdown est défini sur True ou non spécifié, les espaces de travail peuvent être modifiés sur place pour éviter les espaces de travail non souhaités ou pour ajouter d'autres espaces de travail lorsqu'ils sont créés.

Utilisez la fonction Walk pour cataloguer les données raster. Les rasters qui se trouvent dans le dossier back_up seront ignorés.

import arcpy
import os
workspace = "c:/data"
rasters = []
for dirpath, dirnames, filenames in arcpy.da.Walk(
        workspace, topdown=True, datatype="RasterDataset"):
    # Disregard any folder named 'back_up' in creating list 
    #  of rasters
    if "back_up" in dirnames:
        dirnames.remove('back_up')
    for filename in filenames:
        rasters.append(os.path.join(dirpath, filename))

Exemple : analyse des données à l'aide de la fonction arcpy.da.Walk

La fonction Walk (tout comme les fonctions de liste) est fréquemment utilisée pour traiter un ensemble de données. Le script suivant tire parti de la fonction arcpy.da.Walk pour analyser tous les jeux de données dans un espace de travail SDE.

import arcpy
import os
# SDE workspace to be used
admin_workspace = "Database Connections/tenone@sde.sde"
analyze_contents = []
for dirpath, workspaces, datatypes in arcpy.da.Walk(
        admin_workspace,
        followlinks=True,
        datatype=['Table', 'FeatureClass', 'RasterDataset']):
    # Create full path, and add tables, feature classes, raster datasets
    analyze_contents += [
        os.path.join(dirpath, datatype) for datatype in datatypes]
    # create full path, add the feature datasets of the .sde file
    analyze_contents += [
        os.path.join(dirpath, workspace) for workspace in workspaces]
# Execute Analyze Datasets on the complete list
arcpy.AnalyzeDatasets_management(admin_workspace,
                                 "SYSTEM",
                                 analyze_contents,
                                 "ANALYZE_BASE",
                                 "ANALYZE_DELTA",
                                 "ANALYZE_ARCHIVE")
Astuce :

Par défaut, les fichiers de connexion sde ne sont pas itérés pour éviter l'ouverture accidentelle des bases de données distantes. Si vous souhaitez qu'un fichier de connexion sde fasse l'objet d'une itération, définissez l'argument followlinks sur True.