Ekspresi dalam arcpy.CalculateField_management

Oct 05 2020

Saya sedang mengerjakan sebuah toolset, dan salah satu inputnya adalah field dari sebuah shapefile. Saya telah mendefinisikan bidang tersebut dan saya telah menggunakannya dalam banyak fungsi, dan ini berfungsi tanpa kesalahan apa pun.

Masalahnya adalah ketika saya ingin menggunakan bidang dalam ekspresi di CalculateField, ia tidak mengenali bidang yang ditentukan, tetapi ketika saya menggunakan nama bidang (nama dalam tabel atribut) berfungsi.

Saya pikir saya membuat kesalahan dalam menulis kode untuk bagian ekspresi.

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')

Juga, saya punya pertanyaan lain tentang menambahkan output dari perangkat saya ke konten setelah masing-masing berjalan.

Ketika saya menjalankan toolset saya setiap kali, output tidak muncul di konten, setiap kali saya harus mengimpor output dari folder output.

Jawaban

7 Hornbydd Oct 05 2020 at 00:33

Anda telah membuat kesalahan mendasar, Anda telah menyematkan variabel yang Anda panggil fieldlangsung di dalam ekspresi teks, yaitu di dalam "", sehingga ia melihatnya sebagai beberapa teks bukan sebagai variabel.

Lakukan sesuatu seperti ini:

expression = "!Classific!.replace(!Classific!,'" + field + "')"
shapes2=arcpy.CalculateField_management(shapes1,'Classific',expression, 'PYTHON3')

Sebagai catatan: shapes1, shapes2dan unionfieldbenda HASIL, hasil eksekusi alat. Saya akan merekomendasikan Anda memanggil mereka sesuatu seperti resObjkarena ini akan membantu Anda memahami kode Anda karena saat ini benar-benar menyesatkan tentang apa yang mereka wakili.

4 radouxju Oct 05 2020 at 03:17

untuk menggunakan nilai variabel dalam string teks, saya sarankan untuk menggunakan .format().

dalam praktiknya, tulis string Anda dengan parameter yang hilang di antaranya {}lalu daftarkan semua parameter dalam fungsi format (dipisahkan oleh ,)

arcpy.AddField_management(shapes,'Classific','TEXT')
arcpy.CalculateField_management(shapes,'Classific',"!Classific!.replace(!Classific!,!{0}!)".format(field), 'PYTHON3')

Melakukan itu, jangan lupa untuk menambahkan nama bidang di antara !!, jika tidak, bukan nilai yang dikandung oleh bidang yang akan digunakan, tetapi namanya (Saya rasa Anda tidak ingin menyalin nama bidang untuk semua baris) .

Karena itu, mengisi bidang baru dengan nilai bidang lain tidak memerlukan pernyataan ganti yang rumit. Anda bisa menggunakan:

arcpy.CalculateField_management(shapes,'Classific',"!{}!".format(field), 'PYTHON3')

Anda dapat menerapkan metode yang sama untuk contoh kedua Anda (perhatikan bahwa bidang harus berjenis sama).

arcpy.CalculateField_management(shapes,field,"!{}! + !First_class! ".format(field), 'PYTHON3')