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

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

ListFields(набор_данных, групповой_символ, тип_поля)

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

ListIndexes(набор_данных, групповой_символ)

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

ListDatasets(групповой_символ, тип_пространственного_объекта)

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

ListFeatureClasses(групповой_символ, тип_пространственного_объекта)

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

ListFiles(групповой_символ)

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

ListRasters(групповой_символ, тип_растра)

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

ListTables(групповой_символ, тип_таблицы)

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

ListWorkspaces(групповой_символ, тип_рабочей_области)

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

ListVersions(рабочая_область_sde)

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

Списка функций

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

Более подробно об инструментах, наборах инструментов и параметрах среды для работы со списками

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

Параметры этих функций схожи. Некоторым, таким как 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 идеален для работы со списком Python, поскольку с его помощью можно перебирать список по одному элементу. Цикл 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)

Ниже приведен еще один пример использования функции для работы со списком. Скрипт используется для создания растровых пирамидных слоев для всех растров, представляющих собой изображения формата 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 дает возможность использовать результаты функции для работы со списком и управлять ими различными способами. Списки являются универсальным типом 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
ПодсказкаПодсказка:

Увидеть содержимое списка Python очень просто. Манипулировать списками Python можно с помощью различных методов, включая сортировку (sort), присоединение (append) и обращение (reverse).

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

>>> fcs.sort(reverse=True)
>>> print fcs
[u'water_stations', u'water_services', u'water_pipes']

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

>>> print fcs[0]
water_stations

>>> print fcs[1:]
[u'water_services', u'water_pipes']

Ключевые слова типа в функциях для работы со списками

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

Функция

Ключевые слова типа

ListDatasets

Все (All), Пространственный объект (Feature), Покрытие (Coverage), Каталог растров (RasterCatalog), CAD, VPF, TIN, Топология (Topology)

ListFeatureClasses

Все (All), Точка (Point), Подпись (Label), Узел (Node), Линия (Line), Дуга (Arc), Маршрут (Route), Полигон (Polygon), Регион (Region)

ListFields

Все (All), короткий целочисленный (SmallInteger), целочисленный (Integer), с одинарной точностью (Single), с двойной точностью (Double), строка (String), дата (Date), OID, геометрия (Geometry), BLOB

ListTables

Все (All), dBASE, INFO

ListRasters

Все (All), ADRG, BIL, BIP, BSQ, BMP, CADRG, CIB, ERS, GIF, GIS, GRID, STACK, IMG, JPEG, LAN, SID, SDE, TIFF, RAW, PNG, NITF

ListWorkspaces

Все (All), Покрытие (Coverage), Доступ (Access), SDE, Папка (Folder)

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

Поиск папок и подпапок

Функции создания списков 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
ПримечаниеПримечание:

В отличие от функции List, 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 (так же, как и функции List) обычно используется для обработки массивов данных. В следующем скрипте используются преимущества функции 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.

Связанные темы

9/11/2013