创建新 Python 脚本

要保存 Python 代码,可创建 Python 文件 (.py)。这些文件属于包含 Python 语句的 ASCII 文件。以下步骤假设您使用的是 PythonWin 应用程序,如编写 Python 脚本中所述。

步骤:
  1. 在 PythonWin 中,单击文件菜单,然后单击新建。接受 Python 脚本的默认选项,然后单击确定。
  2. 将打开 Script1 窗口。Script1 是脚本的默认名称。

  3. 在 Script1 窗口中单击最大化按钮。
  4. 单击文件菜单,然后单击另存为。将该脚本命名为 multi_clip.py,然后将其保存到所选文件夹中。
  5. 将以下各行代码添加到脚本顶部:
  6. # Import ArcPy site-package and os modules
    #
    import arcpy 
    import os
    

    这会将 ArcPy 站点包和操作系统模块 os 导入脚本中。os 模块可用于轻松访问操作系统的最基本工具。本脚本中使用了一些 os 模块的文件名操作方法。

    该脚本将采用以下四个参数,以便实现通用:

    • 用来定义待处理的那组要素类的输入工作空间
    • 通过“裁剪”工具对输入要素类进行裁剪的区域的要素类
    • 写入“裁剪”工具结果的输出工作空间
    • “裁剪”工具使用的 XY 容差

      有关“裁剪”工作原理的详细信息,请参阅“分析”工具箱中的“裁剪”工具。

  7. 将以下代码添加到脚本中,以便根据执行期间传递给脚本的用户定义值定义和设置变量:
  8. # 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)
    
  9. 将以下错误处理语句和 ArcPy 的 ListFeatureClasses() 函数添加到脚本窗口中:
  10. try:
        # Get a list of the featureclasses in the input folder
        #
        fcs = arcpy.ListFeatureClasses()
    

    Python 强制要求将某些语句后的代码缩进作为该语言的组成部分。try 语句定义代码块的开始,该代码块将由与其相关的异常处理程序或 except 语句处理。该块中的所有代码均须缩进。Python 使用 try/except 块来处理执行期间的意外错误。异常处理程序定义在系统或脚本本身引起异常时,该程序应执行哪些操作。最好在所有用到地理处理器的脚本中使用异常处理,以便脚本的错误消息能重新传递给用户。这样还可使脚本适当地退出,并且返回提供有益的信息的消息而不是只产生系统错误消息。

    ListFeatureClasses() 函数用于返回当前工作空间中要素类名称的 Python 列表。如果未指定完整路径,该工作空间会定义数据的位置以及创建所有新数据的位置。该工作空间已被设置为第一个参数的值。Python 列表属于通用对象。for 循环用于遍历列表中包含的各个要素类。

  11. 添加以下代码:
  12. 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.pathbasename 方法用于处理裁剪要素类的路径,因此在表达式中仅对要素类名称求值,而不是整个路径。通过使用各种字符串变量作为参数值,裁剪工具可作为 ArcPy 函数进行访问。

  13. 添加以下各行完成脚本:
  14. except:
        arcpy.AddMessage(arcpy.GetMessages(2))
        print arcpy.GetMessages(2)
    

    前面的 try 语句要求有 except 语句;否则将出现语法错误。如果执行期间出现错误,则会执行 except 块中的代码。通过脚本工具运行脚本时,会添加严重性值为 2 的任何消息,用以指示错误。另外,在工具范围外运行脚本时,还会将所有错误消息打印至标准输出中。

  15. 将以下注释添加到脚本顶部:
  16. # 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.
    
  17. 单击 PythonWin 工具条上的保存按钮保存脚本。
  18. 以上完成的脚本用于完成学习如何通过执行和调试 Python 来使用 Python,以及如何使用 Python 设置断点

    注注:

    命名变量时,请注意 Python 区分大小写,因此 clipFeaturesClipFeatures 同。

    注注:

    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)

相关主题

9/15/2013