批处理脚本的首要任务之一是为可用数据编写目录,以便在处理过程中可以遍历数据。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*")
还可将列表限制为匹配特定的数据属性,例如仅匹配面要素类、整型字段或 coverage 数据集。这就是所有函数中类型参数所起的作用。在下一示例中,使用一个通配符和一个数据类型对工作空间中的要素类进行过滤,这样只有以字母 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)
搜索目录和子目录
ArcPy 列表函数可用于迭代单个目录或工作空间,但是在某些情况下,需要遍历其他子文件夹和工作空间。对于文件,通过使用 Python 的 os.walk 函数可以实现这一点,该函数用于递归迭代或遍历文件夹,以找到其他子文件夹和文件。但是,os.walk 严格基于文件并且无法识别数据库和不基于文件的数据类型,这些对 ArcGIS 很重要。例如,os.walk 将无法看到文件地理数据库工作空间或要素数据集中的栅格数据集或其他内容。
在 arcpy.da 模块中,Walk 函数也可用于遍历目录,还可浏览数据库并标识 ArcGIS 数据类型。
Walk(top, topdown, onerror, followlinks, datatype, type) | 通过从上至下或从下至上遍历树,在目录树中生成数据名称。树中的每个目录/工作空间都会生成一个三元组(dirpath、dirnames、filenames)。 |
在以下示例中,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")