3

我目前正在尝试填充 2 个字段。它们都已经在我想用现有要素类中的数据填充的表中创建。这个想法是从与特定项目#匹配的所需要素类中复制所有数据。与项目 # 匹配的行将复制到具有匹配字段的空白模板。到目前为止,一切都很好,除了我需要将来自 OBJECT ID 字段和要素类名称的数据推送到表中的 2 个字段中。

**def featureClassName(table_path):
    arcpy.AddMessage("Calculating Feature Class Name...")
    print "Calculating Feature Class Name..."
    featureClass = "FeatureClass"
    SDE_ID = "SDE_ID"
    fc_desc = arcpy.Describe(table_path)
    lists = arcpy.ListFields(table_path)
    print lists
   with arcpy.da.SearchCursor(table_path, featureClass = "\"NAME\"" + " Is NULL") as  cursor:
        for row in cursor:
            print row
            if row.FEATURECLASS = str.replace(row.FEATURECLASS, "*", fc):
                cursor.updateRow(row)
                    print row
        del cursor, row
            else:
                pass**

上面的代码是我尝试使用要素类的名称填充字段的众多方法。我试图对 OID 做同样的事情。

**for fc in fcs:
print fc
if fc:
    print "Making Layer..."
    lyr = arcpy.MakeFeatureLayer_management (fc, r"in_memory\temp", whereClause)
    fcCount = int(arcpy.GetCount_management(lyr).getOutput(0))
    print fcCount
    if fcCount > 0:
        tbl = arcpy.CopyRows_management(lyr, r"in_memory\temp2")
        arcpy.AddMessage("Checking for Feature Class Name...")
        arcpy.AddMessage("Appending...")
        print "Appending..."
        arcpy.Append_management(tbl, table_path, "NO_TEST")
        print "Checking for Feature Class Name..."
        featureClassName(table_path)
        del fc, tbl, lyr, fcCount
        arcpy.Delete_management(r"in_memory\temp")
        arcpy.Delete_management(r"in_memory\temp2")
    else:
        arcpy.AddMessage("Pass... " + fc)
        print ("Pass... " + fc)
        del fc, lyr, fcCount
        arcpy.Delete_management(r"in_memory\temp")
        pass**

此代码是数据集中要素类的主循环,我创建了一个新图层/表以用于将数据复制到表中。要素类名称和 OID 的数据没有要推送的数据,所以这就是我卡住的地方。

谢谢大家

4

1 回答 1

2

你有很多问题。首先,您没有正确设置光标。如果您要更新,它必须是一个 updateCursor,并且您调用了一个 searchCursor,顺便说一下,您调用不正确。其次,您在“if row.FEATURECLASS ...”行中使用 = (赋值)而不是 == (相等比较)......然后在下面的 2 行中,您的缩进在几行上都搞砸了。而且完全不清楚您的函数知道 fc 的值。将其作为 arg 传递以确保。存在许多其他问题,但让我们举一个可行的示例,您可以研究它:

def featureClassName(table_path, fc):
    '''Will update the FEATURECLASS FIELD in table_path rows with 
      value of fc (string) where FEATURECLASS field is currently null '''

    arcpy.AddMessage("Calculating Feature Class Name...")
    print "Calculating Feature Class Name..."

    #delimit field correctly for the query expression
    df = arcpy.AddFieldDelimiters(fc, 'FEATURECLASS')
    ex = df + " is NULL"
    flds = ['FEATURECLASS']
    #in case we don't get rows, del will bomb below unless we put in a ref 
    #to row 
    row = None
    #do the work
    with arcpy.da.UpdateCursor(table_path, flds, ex) as cursor:
        for row in cursor:
            row[0] = fc #or basename, don't know which you want
            cursor.updateRow(row)
    del cursor, row

请注意,我们现在将 fc 的名称作为 arg 传递,因此您必须在其余代码中处理它。另外最好使用 AddFieldDelimiter,因为不同的 fc 需要不同的分隔符,并且文档对此根本不清楚(有时它们是错误的)。

祝你好运,迈克

于 2012-11-18T17:08:28.587 回答