在 Python 中验证表和字段名称
验证表名
地理数据库使用各种关系数据库管理系统 (RDBMS) 来保持构成地理数据库的表之间的关系。地理数据库中的所有表必须有一个有效名称,因此在地理数据库中创建数据时,设定一个检查表名是否有效的机制十分重要。通过调用 ValidateTableName() 函数,可以用脚本文件判定在指定工作空间中特定名称是否有效。
下面是将被验证的表名错误:
- 表与数据源保留字的名称相同(例如,Table)
- 表包含无效字符
- 表包含无效起始字符(例如,将数字用作首字符)
ValidateTableName 函数本身不能确定在指定工作空间中的指定名称是否唯一。Exists() 函数可以查看表名在指定的工作空间中是否唯一。
功能 |
说明 |
---|---|
ValidateTableName(name, {workspace}) |
获取表名和工作空间路径并为该工作空间返回一个有效表名 |
将工作空间指定为参数允许 ArcPy 检查所有现有表名,并确定是否存在由输出工作空间施加的命名限制。如果输出工作空间是一个 RDBMS,则它可能有一些保留字,表名中不能使用这些字。还可能有一些不能用在表名或字段名中的无效字符。所有无效字符都用下划线 (_) 代替。ValidateTableName() 返回一个表示有效表名的字符串,该表名在输入名称有效的情况下可以与输入名称相同。以下示例保证由复制要素工具创建的新的输出要素类在任何地理数据库中具有唯一有效名称:
# Move all shapefiles from a folder into a geodatabase
#
import arcpy
from arcpy import env
# Set the workspace. List all of the shapefiles
#
env.workspace = "d:/St_Johns"
fcs = arcpy.ListFeatureClasses("*")
# Set the workspace to SDE for ValidateTableName
#
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 函数添加一个字段:
# 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:
print arcpy.GetMessages(2)
无论何时脚本更新数据集(例如要素类或表),都要注意避免锁定数据集的情况。如果在 ArcCatalog 中打开了一个个人或文件地理数据库,则在取消选中该地理数据库且刷新该文件夹或者关闭 ArcCatalog 之前,脚本将不能更新地理数据库中的任何内容。这包括脚本工具。