Arcpy脚本批量添加矢量属性字段并赋值时遇到的字符串的坑


对二类调查矢量数据进行处理时出现一个问题,需要将一百多个矢量文件都添加一个“所属乡”字段,并对字段进行赋值,属性值为矢量文件的名称,即矢量所属于的乡镇。因为数据较多,处理起来比较麻烦,就利用arcgis里面内置的脚本工具进行处理。
这里面分为了两步,第一步是为所有的矢量添加一个属性字段,这个很容易就解决了,代码如下:

>>> import arcpy
>>> from arcpy import env
>>> env.workspace = r"G:\农业项目\topo.mdb\topology"#设置工作空间,用于后面遍历矢量文件
>>> fcl = arcpy.ListFeatureClasses()#遍历工作空间路径内的所有矢量,生成列表存放矢量文件名
>>> for fc in fcl :#遍历矢量文件,逐一增加属性字段“所属乡”,类型为text,长度为50
...     arcpy.AddField_management(fc,"所属乡","TEXT","","","50","所属乡","NULLABLE","NON_REQUIRED")

完成第一步的增加属性字段后,进行第二步,为属性字段赋值,赋值名称就是矢量文件的名称。因为初次接触,在这里出现踩了很多的坑。第一次编辑代码如下:

>>> import arcpy
>>> from arcpy import env
>>> env.workspace = r"G:\农业项目\topo.mdb\topology"#设置工作空间,用于后面遍历矢量文件
>>> fcl = arcpy.ListFeatureClasses()#遍历工作空间路径内的所有矢量,生成列表存放矢量文件名
>>> for fc in fcl :#调用字段计算器将fc矢量的"所属乡"字段赋值为"fc"(print(fc)可以发现,fc就是"文件名.shp")
...     arcpy.CalculateField_management(fc,"所属乡",fc)

这个时候运行会出现报错,错误如下:
第一次报错坑
出现这个问题是因为fcl是列表,fc为列表中的一个元素,数据类型为unicode,而CalculateField_management函数在fc位置要求的是字符串格式的赋值(如”123″即属性字段赋值为123,’“name”’(先单引号,内双引号)即属性字段赋值为”name”),或则使用双引号引起来的可执行的简单代码。这个时候需要将fc从unicode类型的数据转换为string型,代码如下:

import arcpy
>>> from arcpy import env
>>> env.workspace = r"G:\农业项目\topo.mdb\topology"#设置工作空间,用于后面遍历矢量文件
>>> fcl = arcpy.ListFeatureClasses()#遍历工作空间路径内的所有矢量,生成列表存放矢量文件名
>>> for fc in fcl :#调用字段计算器将fc矢量的"所属乡"字段赋值为"fc"(print(fc)可以发现,fc就是"文件名.shp")
...     str = fc.encode("utf-8")#将Unicode类型转化为string型数据
...     str = str.split('.')[0]#将str进行切割,将"文件名.shp"中的".shp"去掉
...     arcpy.CalculateField_management(fc,"所属乡",'str')#这个时候str已经是string型数据,只需加单引号

运行后发现自己脑残了,所有矢量文件的“所属乡”字段全部被赋值为“str”,并未想设想意向赋值为各个矢量文件的名称,即乡镇名,这里是因为系统将’str’看做一个固定的字符串,而非变量,需要进行转义,使系统能够识别变量str。这里参考了另一篇博文,链接如下:YoungHappyGIS的博文
代码修改如下:

import arcpy
>>> from arcpy import env
>>> env.workspace = r"G:\农业项目\topo.mdb\topology"#设置工作空间,用于后面遍历矢量文件
>>> fcl = arcpy.ListFeatureClasses()#遍历工作空间路径内的所有矢量,生成列表存放矢量文件名
>>> for fc in fcl :#调用字段计算器将fc矢量的"所属乡"字段赋值为"fc"(print(fc)可以发现,fc就是"文件名.shp")
...     str = fc.encode("utf-8")#将Unicode类型转化为string型数据
...     str = str.split('.')[0]#将str进行切割,将"文件名.shp"中的".shp"去掉
...     arcpy.CalculateField_management(fc,"所属乡","\""+str +"\"")#注意这三对用于转义的双引号

第一次使用arcpy进行批处理,也是第一次使用CSDN写博文,将出现的问题记录下来,希望能帮助到别人~

转载自:https://blog.csdn.net/NeverDir/article/details/88602700

You may also like...