Создание списков данных

Одной из важнейших задач в скрипте пакетной обработки является создание каталога доступных данных для обеспечения возможности их итерационного перебора во время обработки. ArcPy содержит ряд функций, специально предназначенных для создания таких списков.

ФункцияОписание

ListFields(dataset, wild_card, field_type)

Возвращает список полей, найденных во входном значении

ListIndexes(dataset, wild_card)

Возвращает список атрибутивных индексов, найденных во входном значении

ListDatasets(wild_card, feature_type)

Возвращает наборы данных из текущей рабочей области

ListFeatureClasses(wild_card, feature_type, feature_dataset)

Возвращает классы пространственных объектов из текущей рабочей области

ListFiles(wild_card)

Возвращает файлы из текущей рабочей области

ListRasters(wild_card, raster_type)

Возвращает список растров, найденных в текущей рабочей области

ListTables(wild_card, table_type)

Возвращает список таблиц, найденных в текущей рабочей области

ListWorkspaces(wild_card, workspace_type)

Возвращает список рабочих областей, найденных в текущей рабочей области

ListVersions(sde_workspace)

Возвращает список версий, использование которых разрешено подключенному пользователю

Функции создания списков

Результатом каждой из этих функций является список, представляющий собой список значений. Список в скрипте может содержать любой тип данных, например, строку, в которой может быть, в частности, путь к набору данных, полю или строке из таблицы. После создания списка с нужными значениями можно выполнить его циклический перебор в скрипте для работы с каждым отдельным значением.

Параметры функций для работы со списками

Параметры этих функций схожи. Некоторым параметрам, таким как ListFields, требуется входное значение набора данных, поскольку элементы, перечисляемые функциями, располагаются внутри некоторого объекта или набора данных. Для других функций не требуется входной набор данных, поскольку они выводят списки типов данных из текущей рабочей области, определенные в настройках среды. У всех функций есть параметр группового символа, который используется для ограничения имен объектов или наборов данных в списке. Групповой символ задает фильтр имени, которому должно соответствовать все содержимое нового созданного списка. Например, может быть необходимо перечислить все классы пространственных объектов рабочей области, которые начинаются с буквы G. Следующий пример показывает, как это сделать:

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*")

Список можно также ограничить соответствием определенных свойств данных, например, только классами полигональных объектов, целочисленными полями или наборами данных покрытия. Для этого во всех функциях применяется параметр типа. В следующем примере классы пространственных объектов рабочей области фильтруются по групповому символу и типу данных так, что в выходном списке оказываются только классы полигональных объектов, которые начинаются с буквы G:

# 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")

Использование списка

В ArcPy в качестве типа, возвращаемого всеми функциями для работы со списками, используется тип списка Python, поскольку списки поддерживают гибкость, необходимую для доступа к данным и использования нескольких типов данных. Цикл for идеально подходит для работы со списком, поскольку он может использоваться для работу с каждым элементом списка. Цикл for осуществляет итерационный перебор по каждому элементу списка. Ниже приведен пример цикла for для итерации по списку, созданному в предыдущем примере:

# 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)

Ниже приведен еще один пример использования функции в ArcPy для работы со списком. Скрипт используется для создания растровых пирамидных слоев для всех растров формата TIFF внутри папки.

# 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)

Список дает возможность использовать результаты функции для работы со списком и управлять ими различными способами. Списки являются универсальным типом Python и предоставляют ряд методов (append, count, extend, index, insert, pop, remove, reverse и sort), с помощью которых можно манипулировать информацией и извлекать ее.

Например, если необходимо узнать, сколько классов пространственных объектов имеется в рабочей области, можно использовать встроенную функцию Python len для получения этого числа.

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)
Подсказка:

Список может легко показать свое содержание. Манипулировать списками можно с помощью различных методов, включая сортировку (sort), присоединение (append) и инверсию (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']

Поскольку списки представляют собой упорядоченную коллекцию, они также поддерживают индексацию и разделение.

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

Поиск по каталогам и подкаталогам

Функции списка ArcPy могут быть использованы для перебора одного каталога или рабочего пространства, но в некоторых случаях, необходим перебор в других вложенных папках и рабочих областях. При работе с файлами это можно сделать с помощью функции Python os.walk, которая используется для перебора и перемещения по каталогам для поиска дополнительных подкаталогов и файлов. Тем не менее os.walk выполняется только в рамках файловой системы и не распознаёт ни базы данных, ни файловых типов данных, которые используются в ArcGIS. Например, os.walk не видит наборов растровых данных или другого содержания в рабочей области файловой базы геоданных или в наборе классов объектов.

В модуле arcpy.da имеется функция Walk, которая может быть использована для перебора содержания каталога, а также для просмотра базы данных и определения типов данных ArcGIS.

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

Создает имена данных в дереве Каталога, проходя дерево сверху вниз или снизу вверх. Каждая директория/рабочая область в дереве выдает кортеж из трех элементов (dirpath, dirnames и filenames).

Функция arcpy.da.Walk
Примечание:

В противоположность функциям списка, функция Walk не использует переменные среды рабочей области для идентификации её начальной рабочей области. Вместо этого, первая начальная рабочая область (или самый верхний уровень), которую пересекает Walk, задаётся в первом аргументе, top.

В следующем примере функция Walk используется для перебора дерева Каталога и определения всех содержащихся в нём классов полигональных объектов.

Используйте функцию Walk для создания каталога полигональных классов объектов.

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))

В некоторых случаях могут встретиться подкаталоги, которых следует избегать при перемещению по дереву каталога, например, каталоги резервных копий файлов. Если аргумент topdown установлен как True или не установлен, то рабочие области могут быть изменены на месте, чтобы избежать любых нежелательных рабочих областей или добавить дополнительные рабочие области по мере их создания.

Используйте функцию Walk для создания каталога растровых данных. Любые растры в папке с именем back_up будут проигнорированы.

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))

Пример: Использование arcpy.da.Walk для анализа данных

Функция Walk (также как и функции списка) обычно используется для пакетной обработки данных. Следующий скрипт использует функцию arcpy.da.Walk для анализа всех наборов данных в рабочей области 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")
Подсказка:

По умолчанию файлы подключений sde не участвуют в переборе, чтобы не открывать непреднамеренно удаленные базы данных. Чтобы преднамеренно включить файл подключения sde в создаваемый список, установите аргумент followlinks в значение True.