创建新 Python 脚本
要保存 Python 代码,可创建 Python 文件 (.py)。这些文件属于包含 Python 语句的 ASCII 文件。以下步骤假设您使用的是 PythonWin 应用程序,如编写 Python 脚本中所述。
- 在 PythonWin 中,单击文件菜单,然后单击新建。接受 Python 脚本的默认选项,然后单击确定。
- 在 Script1 窗口中单击最大化按钮。
- 单击文件菜单,然后单击另存为。将该脚本命名为 multi_clip.py,然后将其保存到所选文件夹中。
- 将以下各行添加到脚本顶部:
- 用来定义待处理的那组要素类的输入工作空间
- 通过“裁剪”工具用作要从输入要素类裁剪的区域的要素类
- 写入“裁剪”工具结果的输出工作空间
- “裁剪”工具使用的 XY 容差
有关“裁剪”工作原理的详细信息,请参阅“分析”工具箱中的“裁剪”工具。
- 将以下代码添加到脚本中,以便根据执行期间传递给脚本的用户定义值定义和设置变量:
- 将以下错误处理语句和 ArcPy 的 ListFeatureClasses() 函数添加到脚本窗口中:
- 添加以下代码:
- 添加以下各行完成脚本:
- 将以下注释添加到脚本顶部:
- 单击 PythonWin 工具条上的保存按钮保存脚本。
将打开 Script1 窗口。Script1 是脚本的默认名称。
# Import ArcPy site-package and os modules # import arcpy import os
这会将 ArcPy 站点包和操作系统模块 os 导入脚本中。os 模块可用于轻松访问操作系统的最基本工具。本脚本中使用了一些 os 模块的文件名操作方法。
该脚本将采用以下四个参数,以便实现通用:
# Set the input workspace # arcpy.env.workspace = arcpy.GetParameterAsText(0) # Set the clip featureclass # clipFeatures = arcpy.GetParameterAsText(1) # Set the output workspace # outWorkspace = arcpy.GetParameterAsText(2) # Set the XY tolerance # clusterTolerance = arcpy.GetParameterAsText(3)
try: # Get a list of the featureclasses in the input folder # fcs = arcpy.ListFeatureClasses()
Python 强制要求将某些语句后的代码缩进作为该语言的组成部分。try 语句定义代码块的开始,该代码块将由与其相关的异常处理程序或 except 语句处理。该块中的所有代码均须缩进。Python 使用 try/except 块来处理执行期间的意外错误。异常处理程序定义在系统或脚本本身引起异常时,该程序应执行哪些操作。最好在所有用到地理处理器的脚本中使用异常处理,以便脚本的错误消息能重新传递给用户。这样还可使脚本适当地退出,并且返回信息性消息而不是只产生系统错误。
ListFeatureClasses() 函数用于返回当前工作空间中要素类名称的 Python 列表。如果未指定完整路径,该工作空间会定义数据的位置以及创建所有新数据的位置。该工作空间已被设置为第一个参数的值。Python 列表属于通用对象。for 循环用于遍历列表中包含的各个要素类。
for fc in fcs: # Validate the new feature class name for the output workspace. # featureClassName = arcpy.ValidateTableName(fc, outWorkspace) outFeatureClass = os.path.join(outWorkspace, featureClassName) # Clip each feature class in the list with the clip feature class. # Do not clip the clipFeatures, it may be in the same workspace. # if fc <> os.path.basename(clipFeatures): arcpy.Clip_analysis(fc, clipFeatures, outFeatureClass, clusterTolerance)
当列表中不再有名称时,for 循环结束。ValidateTableName() 函数用于确保输出名称对输出空间有效。某些字符(如句点或虚线)在地理数据库中是不允许的,因此该方法返回的是用有效字符取代无效字符后的名称。此外,它返回的是唯一名称,因此不会覆盖任何现有数据。
os.path 的 basename 方法用于处理裁剪要素类的路径,因此在表达式中仅对要素类名称求值,而不是整个路径。通过使用各种字符串变量作为参数值,裁剪工具可作为 ArcPy 函数进行访问。
except: arcpy.AddMessage(arcpy.GetMessages(2)) print arcpy.GetMessages(2)
前面的 try 语句要求有 except 语句;否则将出现语法错误。如果执行期间出现错误,则会执行 except 块中的代码。通过脚本工具运行脚本时,会添加严重性值为 2 的任何消息,用以指示错误。另外,在工具范围外运行脚本时,还会将所有错误消息打印至标准输出中。
# Script Name: Clip Multiple Feature Classes # Description: Clips one or more shapefiles # from a folder and places the clipped # feature classes into a geodatabase. # Created By: Insert name here. # Date: Insert date here.
以上完成的脚本用于了解如何通过执行和调试 Python 来使用 Python,以及如何使用 Python 设置断点。
命名变量时,请注意 Python 区分大小写,因此 clipFeatures 与 ClipFeatures 不同。
GetParameterAsText() 用于接收参数。如果脚本使用已定义的数据集名称和参数值,则可能不需要使用 GetParameterAsText() 函数。
以冒号结尾的语句指示缩进代码的开始。Python 不使用大括号、括号或分号指示代码块的开始或结束。而是使用块缩进定义其边界。这样便使代码易于读写。
完整代码:
# Script Name: Clip Multiple Feature Classes # Description: Clips one or more shapefiles # from a folder and places the clipped # feature classes into a geodatabase. # Created By: Insert name here. # Date: Insert date here. # Import ArcPy site-package and os modules # import arcpy import os # Set the input workspace # arcpy.env.workspace = arcpy.GetParameterAsText(0) # Set the clip featureclass # clipFeatures = arcpy.GetParameterAsText(1) # Set the output workspace # outWorkspace = arcpy.GetParameterAsText(2) # Set the XY tolerance # clusterTolerance = arcpy.GetParameterAsText(3) try: # Get a list of the featureclasses in the input folder # fcs = arcpy.ListFeatureClasses() for fc in fcs: # Validate the new feature class name for the output workspace. # featureClassName = arcpy.ValidateTableName(fc, outWorkspace) outFeatureClass = os.path.join(outWorkspace, featureClassName) # Clip each feature class in the list with the clip feature class. # Do not clip the clipFeatures, it may be in the same workspace. # if fc <> os.path.basename(clipFeatures): arcpy.Clip_analysis(fc, clipFeatures, outFeatureClass, clusterTolerance) except: arcpy.AddMessage(arcpy.GetMessages(2)) print arcpy.GetMessages(2)