Arcpy'de İfade.CalculateField_management
Bir araç seti üzerinde çalışıyorum ve girdilerden biri bir şekil dosyası alanı. Alanı tanımladım ve birden fazla fonksiyonda kullandım ve hatasız çalışıyor.
Sorun şu ki, alanı CalculateField'daki bir ifadede kullanmak istediğimde, tanımlı alanı tanımıyor, ancak alanın adını (öznitelik tablosundaki ad) kullandığımda çalışıyor.
İfade kısmının kodunu yazarken hata yaptığımı düşünüyorum.
import os, sys
import arcpy
from arcpy import env
from arcpy.sa import *
arcpy.CheckOutExtension("Spatial")
###### Define variables
shapes = sys.argv[1]
outputfolder = sys.argv[2]
outputname = sys.argv[3]
field = sys.argv[4]
output = os.path.join(outputfolder,outputname)
arcpy.AddMessage(shapes)
arcpy.AddMessage(field)
arcpy.AddMessage(output)
shapes1=arcpy.AddField_management(shapes,'Classific','TEXT')
shapes2=arcpy.CalculateField_management(shapes1,'Classific',"!Classific!.replace(!Classific!,field)", 'PYTHON3')
Unionfield = arcpy.CalculateField_management(Unionfield, field, "field+ !FIRST_Clas!", 'PYTHON3')
Unionfield = arcpy.CalculateField_management(Unionfield, field, "!Class!+ !FIRST_Clas!", 'PYTHON3')
Ayrıca, her çalışmadan sonra araç setimin çıktısını içeriğe eklemekle ilgili başka bir sorum var.
Araç setimi her çalıştırdığımda, çıktıyı çıktı klasöründen içe aktarmak zorunda olduğum her seferinde çıktı içerikte görünmüyor.
Yanıtlar
Eğer aradığınız değişkeni gömmek var, temel bir hata yapmış fielddoğrudan içinde değil bir değişken olarak bazı metin olarak görür, böylece "" içinde bir metin ifadesi, yani.
Bunun gibi bir şey yapın:
expression = "!Classific!.replace(!Classific!,'" + field + "')"
shapes2=arcpy.CalculateField_management(shapes1,'Classific',expression, 'PYTHON3')
Bir yan not: shapes1, shapes2ve unionfieldsonuç nesneleri, araç, yürütme sonucudur. Onlara resObj, kodunuzu anlamanıza yardımcı olacağı için, şu anda neyi temsil ettikleri konusunda tamamen yanıltıcı olduğu için onlara böyle bir isim vermenizi tavsiye ederim .
Bir metin dizesinde bir değişkenin değerini kullanmak için kullanmanızı tavsiye ederim .format().
pratikte, dizenizi arasına eksik parametre ile yazın ve {}ardından tüm parametreleri format işlevinde listeleyin (ile ayırarak ,)
arcpy.AddField_management(shapes,'Classific','TEXT')
arcpy.CalculateField_management(shapes,'Classific',"!Classific!.replace(!Classific!,!{0}!)".format(field), 'PYTHON3')
Bunu yaparak, alan adını eklemeyi unutmayın !!, aksi takdirde kullanılacak alanın içerdiği değer değil, adıdır (Alan adını tüm satırlar için kopyalamak isteyeceğinizi sanmıyorum) .
Bununla birlikte, yeni bir alanı başka bir alanın değerleriyle doldurmak, karmaşık bir değiştirme ifadesine ihtiyaç duymaz. Kullanabilirsin:
arcpy.CalculateField_management(shapes,'Classific',"!{}!".format(field), 'PYTHON3')
Aynı yöntemi ikinci örneğinize de uygulayabilirsiniz (alanların aynı türde olması gerektiğini unutmayın).
arcpy.CalculateField_management(shapes,field,"!{}! + !First_class! ".format(field), 'PYTHON3')