修复属性值为空时使用UpdateCursor的If/Else循环问题
解决ArcPy UpdateCursor追加注释的错误及优化方案
错误原因分析
报错TypeError: list.append() takes exactly one argument (2 given)是因为**list.append()方法只能接收一个参数**,你在confcom.append(row[2], ", ")里传了两个参数,违反了语法规则。
修正后的代码(含效率优化)
下面的代码修复了语法错误,同时优化了游标使用逻辑(避免重复打开游标浪费资源),还兼容了None和空字符串两种常见的空值场景:
fc = DB fieldname = ["StationID", "StationStatus", "StatusComments_Source"] # 仅打开一次游标,提升批量处理效率 with arcpy.da.UpdateCursor(fc, fieldname) as cursor: for row in cursor: # 检查当前记录的StationID是否在目标列表中 if row[0] in confirm: row[1] = "Confirm" # 标记数据为已确认 # 处理注释字段:空值直接赋值,非空则追加内容 if not row[2]: # 同时匹配None和空字符串 row[2] = StatusComments_Source else: # 直接用字符串拼接替代列表操作,更简洁高效 row[2] = f"{row[2]}, {StatusComments_Source}" cursor.updateRow(row)
关键改进点
- 修复语法错误:移除错误的多参数
append写法,改用字符串格式化直接完成拼接,代码更简洁。 - 优化游标逻辑:将
UpdateCursor移至外层,避免为每个StationID重复打开/关闭游标,大幅提升处理速度。 - 兼容多种空值:用
if not row[2]替代if row[2] is None,同时覆盖None和空字符串两种空值情况。 - 简化层级结构:用
row[0] in confirm替代嵌套循环,减少代码冗余。
补充场景优化
如果StatusComments_Source是每个StationID对应的单独注释(而非全局统一值),可以将confirm转换为字典格式,进一步提升匹配效率:
# 假设confirm是(StationID, 对应注释)的列表,先转为字典 confirm_dict = dict(confirm) with arcpy.da.UpdateCursor(fc, fieldname) as cursor: for row in cursor: station_id = row[0] if station_id in confirm_dict: row[1] = "Confirm" target_comment = confirm_dict[station_id] if not row[2]: row[2] = target_comment else: row[2] = f"{row[2]}, {target_comment}" cursor.updateRow(row)
内容的提问来源于stack exchange,提问作者Nicki.s
相关产品推荐
相关产品推荐

