我可以用一种更简单、更流畅的方式来完成吗?(以ArcPy表示)

2024-10-04 07:36:14 发布

您现在位置:Python中文网/ 问答频道 /正文

对于一个项目,我添加字段,然后用表中已经包含的数据填充这些字段。添加字段很容易

arcpy.AddField_management("PLSSFirstDivision","TRS","TEXT","","",20) 
arcpy.AddField_management("PLSSFirstDivision","TWN","TEXT","","",20)
arcpy.AddField_management("PLSSFirstDivision","SEC","TEXT","","",20)
arcpy.AddField_management("PLSSFirstDivision","RNG","TEXT","","",20) 
arcpy.AddField_management("PLSSFirstDivision","TWN_D","TEXT","","",20)
arcpy.AddField_management("PLSSFirstDivision","RNG_D","TEXT","","",20) 

然后我需要从字段(字符串)中获取特定的数字,我只能在ArcMaps计算器中使用它,而不能在Python窗口中使用它。数据如下:(需要加粗)

LA180230N0120E0SN100

TWN = MID([FRSTDIVID],6,2)
RNG = MID([FRSTDIVID],11,2)
SEC = MID([FRSTDIVID],18,2)

然后我需要去掉这3个字段的初始“0”:

TWN = !TWN!.lstrip('0')
RNG = !RNG!.lstrip('0')
SEC = !SEC!.lstrip('0')

而不是将其全部添加到最后一个字段中:

TRS = "T"+ [TWN]+ [TWN_D]+"R" + [RNG]+ [RNG_D]+"-" + "SEC" + [SEC]

谢谢你的帮助,只是想了解更多


Tags: 数据项目字符串textsecmanagementrngarcpy
2条回答

实际上我还没有运行这些函数,所以我的语法可能有点不正确,但是您需要找到一个python表达式来生成所需的字符串,然后使用arcpy的CalculateField方法来更新您的表。如果在“字段计算器”窗口中测试表达式,您应该能够将最终表达式复制/粘贴到下面的语句中

arcpy.CalculateField_management("PLSSFirstDivision", "TWN", "!FRSTDIVID![6:2].lstrip('0')", "PYTHON3")
arcpy.CalculateField_management("PLSSFirstDivision", "TRS", "'T' + !TWN!+ !TWN_D!+'R' + !RNG!+ !RNG_D!+'-SEC' + !SEC!", "PYTHON3")

这些是我喜欢使用^{}进行的那种复杂属性操作。您可以在一次迭代中操作多个字段的内容,然后一次写出每行的更新

with arcpy.da.UpdateCursor("PLSSFirstDivision", ["FRSTDIVID","TRS","TWN","SEC","RNG","TWN_D","RNG_D"])  as cursor:
    for row in cursor:
        frstdivid = row[0]
        # try string slicing for this instead of the `MID` function
        # and you can strip leading zeroes in the same line
        twn = frstdivid[5:7].lstrip('0')
        rng = frstdivid[10:12].lstrip('0')
        sec = frstdivid[17:19].lstrip('0')
        # was not sure how twn_d and rng_d are calculated based on your provided code, but...
        twn_d = foo
        rng_d = bar
        # use all these to calculate trs
        trs = 'T{}{}R{}{}-{}SEC'.format(twn, twn_d, rng, rng_d, sec)
        # assign the calculated values back to row positions
        row[1] = trs
        row[2] = twn
        row[3] = sec
        row[4] = rng
        row[5] = twn_d
        row[6] = rng_d
        # write the new row with complete values from memory to your table
        cursor.updateRow(row)

相关问题 更多 >