My problem is the following:
I have a table with an unknown number of columns (n)
Use arcpy.ListFields create a list of columns and generates Field name list
Then, using arcpy.da.InsertCursor create a new row at the end of the table ...
for example
fieldNameList = []
fields = arcpy.ListFields(fc, "*")
for field in fields:
if field.type in ("Double", "Integer", "Single"):
fieldNameList.append(field.name)
cur = arcpy.da.InsertCursor(fc, fieldNameList)
for x in xrange(-1, 0):
cur.insertRow((SUM_FIELD1, SUM_FIELD2...SUM_FIELD n )) ?????????!!!!
del cur
I do not know how to calculate the sum for each column and then the result to update in the created row. The sum should be separately calculated for each column ...
1 Answer 1
I don't use Dictionaries (I don't fully understand them), however the new row can also be a list. Start by compiling a list of the sums and then insert that.
fieldNameList = []
values = [] # store the sum values here.
fields = arcpy.ListFields(fc, "*")
# get the OID/FID field name to skip
desc = arcpy.Describe(fc)
if desc.hasOID:
OIDname = desc.OIDFieldName.upper()
else:
OIDname = ""
for field in fields:
if field.name.upper() != OIDname: # skip the OID/FID field.
if field.type in ("Double", "Integer", "Single"):
# sum each suitable field, but not the NULL ones - they would be bad
with arcpy.da.SearchCursor(fc,field.name,field.name + " is not NULL") as sCur:
thisValue = 0
for row in sCur:
thisValue += row[0]
values.append(thisValue) # this will be the inserted row
fieldNameList.append(field.name)
with arcpy.da.InsertCursor(fc, fieldNameList) as cur:
cur.insertRow(values)
This does of course mean that you'll read through the rows for each numeric field.. but that also includes OID/FID - that's bad! the values for OID/FID can't be modified so best to skip that one. Also shape_area, shape_length are read-only but this looks like tabular data so I wont worry about that (this time).
-
That's it! Thank you very much @Michael Miles-Stimsonkamfulebu– kamfulebu2015年03月11日 00:35:15 +00:00Commented Mar 11, 2015 at 0:35
-
2For followup questions I think you should ask a new question.2015年03月11日 02:19:58 +00:00Commented Mar 11, 2015 at 2:19
-
2I think this has left the realm of GIS and entered Spreadsheets 101.Vince– Vince2015年03月11日 02:39:09 +00:00Commented Mar 11, 2015 at 2:39
-
1That's always an option @Vince, export table to an Excel format (csv, Excel, txt) and do the calc there. I'd be the first to admit to doing that - after all isn't why I have Excel installed? I'm with PolyGeo, I think that a different calc, especially one that is so fundamentally different, deserves a fresh question. Refer to this post in the new question for background information.Michael Stimson– Michael Stimson2015年03月11日 02:42:21 +00:00Commented Mar 11, 2015 at 2:42
-
1Thank you guys. Of course, this problem is easily solved in Excel but I'm learning the basics of programming in arcpy and python, trying to understand some of the basics.kamfulebu– kamfulebu2015年03月11日 08:09:30 +00:00Commented Mar 11, 2015 at 8:09
arcpy.da.SearchCursor
query, then once you have the sums bundled in a dictionary by column name, insert a row with the sums.