前言
对属性表进行增删改查要用到插入游标、删除游标、更新游标、查询游标。
官方文档地址如下:https://resources.arcgis.com/zh-cn/help/main/10.2/
授人以鱼不如授人以渔!!
一、查询游标SearchCursor
SearchCursor
函数用于在要素类或表上建立只读游标。SearchCursor 可用于遍历行对象并提取字段值。可以使用 where 子句或字段限制搜索,并对结果排序。
前面第一个参数为必填参数,即需要查询的图层文件;{fields}一般也会用到,即想要查询的字段,若不填则默认包含所有字段。
1、示例一
属性表如图:
通过查询游标,查询 ['Id', 'BSM', 'WYBS']
三个字段:
import arcpy
# 设置工作空间
arcpy.env.workspace = r"E:\arcpy_study\Arcpy编程开发(从小白到大神)\测试文件"
# 设置操作的图层文件
shapeFile = '测试shap1.shp'
# 设置要查询的字段名
fieldName = ['Id', 'BSM', 'WYBS']
# 获取游标对象并且迭代
with arcpy.da.SearchCursor(shapeFile, fieldName) as cursor:
for row in cursor:
print row[0], row[1], row[2]
结果:
1 1 wybs_0
2 2 wybs_1
3 3 wybs_2
4 4 wybs_3
5 5 wybs_4
2、示例二
属性表如图:
查询代码如下:
import arcpy
# 设置工作空间
arcpy.env.workspace = r"E:\arcpy_study\Arcpy编程开发(从小白到大神)\测试文件"
# 设置操作的图层文件
shapeFile = '测试shap1.shp'
cursor = arcpy.SearchCursor(shapeFile)
for row in cursor:
print row.getValue('Id'), row.getValue('BSM'), row.getValue('WYBS')
结果如下:
1 1 wybs_0
2 2 wybs_1
3 3 wybs_2
4 4 wybs_3
5 5 wybs_4
3、示例三(联合where参数一起使用)
我们可以添加一个where_clause
参数一起使用,这个参数的值为一个字符串,相当于sql查询语句的where
后面跟着的查询条件。
属性表如图:
查询代码如图:
import arcpy
# 设置工作空间
arcpy.env.workspace = r"E:\arcpy_study\Arcpy编程开发(从小白到大神)\测试文件"
# 设置操作的图层文件
shapeFile = '测试shap1.shp'
sql_exe = "\"WYBS\" = 'wybs_2'"
fieldName = ['Id', 'BSM', 'WYBS']
with arcpy.da.SearchCursor(shapeFile, fieldName, where_clause=sql_exe) as cursor:
for row in cursor:
print row[0], row[1], row[2]
结果:
3 3 wybs_2
可以看到,我们只查询到了WYBS = wybs_2
的记录。
二、更新游标UpdateCursor
UpdateCursor
函数创建一个用于更新或删除指定要素类、shapefile 和表中的行的游标。该游标将数据锁定保留至脚本完成或更新游标对象被删除时。
UpdateCursor可用于读写数据,即:既可以查询也可以更新!更新包含覆盖和删除!!
前面第一个参数为必填参数,即需要更新的图层文件;{fields}一般也会用到,即想要更新的字段,若不填则默认包含所有字段。
1、查询示例一
用UpdateCursor
来查询数据和SearchCursor
类似的,我这里只演示一种,另外的几种可以照着SearchCursor
的自己写。代码如下:
import arcpy
# 覆盖更新一
def coverSearchOne(shapeFile):
# 要更新的字段(建议用元组,这样就不能更改了,也不能重复)
fieldNameList = ('Id', 'BSM', 'WYBS')
with arcpy.da.UpdateCursor(shapeFile, fieldNameList) as cursor:
for row in cursor:
print row[0], row[1], row[2]
if __name__ == '__main__':
# 设置工作空间
arcpy.env.workspace = r"E:\arcpy_study\Arcpy编程开发(从小白到大神)\测试文件"
# 设置操作的图层文件
shapeFile = '测试shap1.shp'
coverSearchOne(shapeFile=shapeFile)
结果如下:
1 1 wybs_0
2 2 wybs_1
3 3 wybs_2
4 4 wybs_3
5 5 wybs_4
2、更新示例一
原始数据:
更新代码:
def coverUpdateOne(shapeFile):
# 要更新的字段(建议用元组,这样就不能更改了,也不能重复)
fieldNameList = ('Id', 'BSM', 'WYBS')
with arcpy.da.UpdateCursor(shapeFile, fieldNameList) as cursor:
for row in cursor:
if row[2] == 'wybs_2':
row[2] = 'wybs100'
# 更新这一行
cursor.updateRow(row)
if __name__ == '__main__':
# 设置工作空间
arcpy.env.workspace = r"E:\arcpy_study\Arcpy编程开发(从小白到大神)\测试文件"
# 设置操作的图层文件
shapeFile = '测试shap1.shp'
coverUpdateOne(shapeFile=shapeFile)
更新后的数据:
3、更新示例二
原始数据:
更新代码:
def coverUpdateTwo(shapeFile):
# 要更新的字段(建议用元组,这样就不能更改了,也不能重复)
fieldNameList = ('Id', 'BSM', 'WYBS')
# 获取更新游标
cursor = arcpy.UpdateCursor(shapeFile, fieldNameList)
# 遍历每一行
for row in cursor:
if row.getValue('WYBS') == 'wybs100':
row.setValue('WYBS', 'wybs_1000')
cursor.updateRow(row)
if __name__ == '__main__':
# 设置工作空间
arcpy.env.workspace = r"E:\arcpy_study\Arcpy编程开发(从小白到大神)\测试文件"
# 设置操作的图层文件
shapeFile = '测试shap1.shp'
coverUpdateTwo(shapeFile=shapeFile)
更新后的数据:
4、更新示例三(和where联合在一起)
到这里,相信大家都明白, 更新实际上是将数据查询出来,接着判断数据是否满足更新条件,最后在更新。和where联合在一起的更新其实和where查询是一样的,这里就不过多演示了。
5、删除某一行示例一
原始数据:
删除代码:
def coverDeleteOne(shapeFile):
# 要更新的字段(建议用元组,这样就不能更改了,也不能重复)
fieldNameList = ('Id', 'BSM', 'WYBS')
with arcpy.da.UpdateCursor(shapeFile, fieldNameList) as cursor:
for row in cursor:
if row[2] == 'wybs_1000':
# 删除一行数据,注意deleteRow不加任何参数
cursor.deleteRow()
if __name__ == '__main__':
# 设置工作空间
arcpy.env.workspace = r"E:\arcpy_study\Arcpy编程开发(从小白到大神)\测试文件"
# 设置操作的图层文件
shapeFile = '测试shap1.shp'
coverDeleteOne(shapeFile=shapeFile)
删除后的数据:
6、删除示例二
原始数据:
删除代码:
def coverDeleteTwo(shapeFile):
# 要更新的字段(建议用元组,这样就不能更改了,也不能重复)
fieldNameList = ('Id', 'BSM', 'WYBS')
# 获取更新游标
cursor = arcpy.UpdateCursor(shapeFile, fieldNameList)
# 遍历每一行
for row in cursor:
if row.getValue('WYBS') == 'wybs_0':
# 删除一行,这种方式需要加参数
cursor.deleteRow(row)
if __name__ == '__main__':
# 设置工作空间
arcpy.env.workspace = r"E:\arcpy_study\Arcpy编程开发(从小白到大神)\测试文件"
# 设置操作的图层文件
shapeFile = '测试shap1.shp'
coverDeleteTwo(shapeFile=shapeFile)
7、删除示例三(联合where参数一起用)
依葫芦画瓢自己照着上面写。
三、插入游标InsertCursor
向要素类、shapefile 或表中插入行。InsertCursor 返回一个分发行对象的枚举对象。可使用 newRow 方法从插入行的枚举对象获取新的行对象。每次调用光标上 insertRow 都会在表中创建新行,该行的初始值设置为输入行中的值。
前面第一个参数为必填参数,即需要更新的图层文件。
1、插入示例一
原始数据:
插入代码:
def coverInsertOne(shapeFile):
# 要插入的字段
fieldNameList = ('Id', 'BSM', 'WYBS')
with arcpy.da.InsertCursor(shapeFile, fieldNameList) as cursor:
for i in range(1, 10):
# 插入一行
cursor.insertRow((i, i, 'wybs_' + str(i)))
# 删除游标对象和 row 对象解除对数据的锁定
del cursor
if __name__ == '__main__':
# 设置工作空间
arcpy.env.workspace = r"E:\arcpy_study\Arcpy编程开发(从小白到大神)\测试文件"
# 设置操作的图层文件
shapeFile = '测试shap1.shp'
coverInsertOne(shapeFile=shapeFile)
插入后的数据:
4、插入示例二
原始数据:
插入代码:
def coverInsertTwo(shapeFile):
# 要插入的字段
fieldNameList = ('Id', 'BSM', 'WYBS')
cursor = arcpy.InsertCursor(shapeFile, fieldNameList)
for i in range(10):
row = cursor.newRow()
row.setValue('Id', i)
row.setValue('BSM', i)
row.setValue('WYBS', 'wybs_' + str(i))
cursor.insertRow(row)
# 删除游标对象和 row 对象解除对数据的锁定
del cursor
if __name__ == '__main__':
# 设置工作空间
arcpy.env.workspace = r"E:\arcpy_study\Arcpy编程开发(从小白到大神)\测试文件"
# 设置操作的图层文件
shapeFile = '测试shap1.shp'
coverInsertTwo(shapeFile=shapeFile)
插入后的数据:
总结
这些内容,使用文档里面都用,我只不过是整理出来而已,授人以鱼不如授人以渔!!