在 Python 中验证表和字段名称

验证表名

地理数据库使用各种关系数据库管理系统 (RDBMS) 来保持构成地理数据库的表之间的关系。地理数据库中的所有表必须有一个有效名称,因此在地理数据库中创建数据时,设定一个检查表名是否有效的机制十分重要。通过调用 ValidateTableName() 函数,可以用脚本判定在指定工作空间中特定名称是否有效。

下面是将被验证的表名错误:

  • 表与数据源保留字的名称相同(例如,Table)。
  • 表包含无效字符。
  • 表包含无效起始字符(例如,将数字用作首字符)。
注:

ValidateTableName 函数本身不能确定在指定工作空间中指定名称是否唯一。Exists 函数可以查看表名在指定的工作空间中是否唯一。

功能说明

ValidateTableName(name, {workspace})

获取表名和工作空间路径并为该工作空间返回一个有效表名

ValidateTableName函数

将工作空间指定为参数允许 ArcPy 检查所有现有表名,并确定是否存在由输出工作空间施加的命名限制。如果输出工作空间是一个 RDBMS,则它可能有一些保留字,表名中不能使用这些字。还可能有一些不能用在表名或字段名中的无效字符。所有无效字符都用下划线 (_) 代替。ValidateTableName 返回一个表示有效表名的字符串,该表名在输入名称有效的情况下可以与输入名称相同。以下示例保证由复制要素工具创建的新的输出要素类在任何地理数据库中具有唯一有效名称:

"""Move all shapefiles from a folder into a geodatabase"""
import arcpy
# Set the workspace. List all of the shapefiles
arcpy.env.workspace = "d:/St_Johns"
fcs = arcpy.ListFeatureClasses("*")
# Set the workspace to SDE for ValidateTableName
arcpy.env.workspace = "Database Connections/Bluestar.sde"
# For each feature class name
for fc in fcs: 
    # Validate the output name so it is valid
    outfc = arcpy.ValidateTableName(fc)
    # Copy the features from the workspace to a geodatabase
    arcpy.CopyFeatures_management(fc, outfc)

验证字段名

每个数据库都可以对表中字段名的命名进行限制。诸如要素类或关系类这样的对象在 RDBMS 中作为表存储,因此这些限制不是仅仅影响独立表而已。这些限制在各种数据库系统中可能常见也可能不常见,因此脚本应该检查所有新字段名以确保在执行过程中工具不会失败。

下面是将被验证的字段名错误:

  • 字段与数据源保留字的名称相同(例如,Table)。
  • 字段名与先前定义的字段相同。
  • 字段包含无效字符(例如,*)。
  • 字段名的长度超过了数据源的最大字段名长度。

功能说明

ValidateFieldName(name, {workspace})

获取字符串(字段名)和工作空间路径,并基于输出地理数据库中的名称限制返回一个有效字段名。

ValidateFieldName函数

无论输入名称如何,以下示例都可确保使用 ValidateFieldName 函数添加一个字段:

"""
  Create a new numeric field containing the ratio of polygon area to
  polygon perimeter. Two arguments, a feature class and field name,
  are expected.
"""
# Define a pair of simple exceptions for error handling
class ShapeError(Exception):
    pass
class FieldError(Exception):
    pass
import arcpy
import os
try:
    # Get the input feature class and make sure it contains polygons
    input = arcpy.GetParameterAsText(0)
    desc = arcpy.Describe(input)
    if desc.shapeType.lower() != "polygon":
        raise ShapeError
    # Get the new field name and validate it
    fieldname = arcpy.GetParameterAsText(1)
    fieldname = arcpy.ValidateFieldName(fieldname, os.path.dirname(input))
    # Make sure shape_length and shape_area fields exist
    if len(arcpy.ListFields(input, "Shape_area")) > 0 and \
        len(arcpy.ListFields(input, "Shape_length")) > 0:
        # Add the new field and calculate the value
        #
        arcpy.AddField_management(input, fieldname, "double")
        arcpy.CalculateField_management(input, fieldname,
                                        "[Shape_area] / [Shape_length]")
    else:
        raise FieldError
except ShapeError:
    print("Input does not contain polygons")
except FieldError:
    print("Input does not contain shape area and length fields")
except arcpy.ExecuteError:
    print(arcpy.GetMessages(2))

在本主题中
  1. 验证表名
  2. 验证字段名