修复在属性值为Null时的If/Else循环与UpdateCursor

0 投票
1 回答
33 浏览
提问于 2025-04-14 17:52

我有一个Python脚本,用来批量更新GIS中的数据库。

我使用更新游标(Update Cursors)来更新属性表中的值,这在我第一次更新记录时非常顺利,因为更新游标会覆盖数据(这是我作为一个还算新手的程序员所理解的)。

当我再次查看某条记录,需要在已有记录中添加(或附加)评论时,我可以用两段不同的代码来实现,但这样做有点笨拙,还需要额外的步骤。我想把这两段代码合并成一个带有嵌套if/else循环的脚本。

为了覆盖空白属性,这段代码运行得很好。

fc=DB
fieldname=["StationID","StationStatus","StatusComments_Source"]

for i in confirm: 
    with arcpy.da.UpdateCursor(fc,fieldname) as cursor:
        for row in cursor:
            if (row[0]== i):
                row[1]= "Confirm" #Data Confirmed
                row[2]= StatusComments_Source #Comments    
            cursor.updateRow(row)

如果我想在现有字段中附加评论,这段代码也能正常工作。不过,如果第二行的属性字段是空的,这段代码就会出错。

for i in confirm: 
    with arcpy.da.UpdateCursor(fc,fieldname) as cursor:
        for row in cursor:
            if (row[0]== i):
                row[1]= "Confirm" #Data Confirmed
                confcom=[]
                confcom.append(StatusComments_Source)
                row[2]=''.join(confcom)
            cursor.updateRow(row)

这是我尝试创建的循环:“如果第二行是空的,就覆盖数据,否则:附加评论”。

for i in confirm: 
    with arcpy.da.UpdateCursor(fc,fieldname) as cursor:
        for row in cursor:
            if (row[0]== i):
                row[1]= "Confirm" #Data Confirmed
                if row[2] is None:
                    row[2] = StatusComments_Source
                else:
                    confcom=[]
                    confcom.append(row[2],", ")
                    confcom.append(StatusComments_Source)
                    row[2]=''.join(confcom)
            cursor.updateRow(row)

但是我遇到了这个错误:

Traceback (most recent call last):

  File "C:\Users\CEI2\AppData\Local\Temp\ipykernel_19768\350652596.py", line 13, in <cell line: 4>
    confcom.append(row[2],", ")

TypeError: list.append() takes exactly one argument (2 given)

我会很感激任何帮助!!

1 个回答

0

如果你有一个已经用逗号分隔的字段,想要在里面添加一个新项目,可以先用 split() 把它分开成一个列表,然后把新项目加到这个列表里,最后再把列表合并成一个字符串,重新赋值回去。

if row[2] is None:
    row[2] = StatusComments_Source
else:
    confcom=row[2].split(', ')
    confcom.append(StatusComments_Source)
    row[2]=', '.join(confcom)

你也可以直接用字符串拼接的方法来做:

row[2] += f', {StatusComments_Source}'

撰写回答