本文介绍基于Python中的ArcPy
模块,批量导出多个栅格数据的属性表,并将结果保存为Excel表格的方法。
首先,我们来明确一下本文的需求。现在在一个文件夹内,有多个.tif
格式的栅格数据。其中,每一个栅格数据都有一张属性表,如下图所示。
我们现在希望,对于文件夹下的每一个栅格文件,都将其对应的属性表导出到本地,并保存为Excel表格。
明确了需求,即可开始撰写代码。本文所用代码如下。
# -*- coding: utf-8 -*-
import arcpy
import os
ws = r'E:/06_Extra/202503_SC/TIFF'
outPath = r'E:/06_Extra/202503_SC/Re/'
outExt = ".csv"
arcpy.env.workspace = ws
rasters = arcpy.ListRasters("*")
for raster in rasters:
rasloc = os.path.join(ws, raster)
print(rasloc)
fields = '*'
flds = arcpy.ListFields(rasloc)
header = ','.join([fld.name for fld in flds])
if len(flds) != 0:
outCSV = os.path.join(outPath, '{0}{1}'.format(raster, outExt))
with open(outCSV,'w') as f:
header += ',RasterName\n'
f.write(header)
curs = arcpy.SearchCursor(rasloc)
for row in curs:
lst = [row.getValue(fld.name) for fld in flds]
lst.append(raster)
line = ','.join(str(a) for a in lst)
f.write(line + '\n')
del row, curs
上述代码的含义也很简单。
首先,arcpy.env.workspace
用以设置工作空间路径,也就是栅格文件的存储路径,用于读取栅格文件;outPath
定义输出.csv
格式文件的路径。
随后,arcpy.ListRasters("\*")
用以获取工作空间内所有栅格文件的列表,这里的"\*"
表示匹配所有文件名。获取得到文件后,通过for raster in rasters
遍历每个栅格文件,并拼接完整路径rasloc
。
接下来,arcpy.ListFields(rasloc)
获取当前栅格文件的字段列表(即属性表的列名),并将字段名用逗号连接为字符串header
;额外添加RasterName
列,用于记录原始栅格文件名。
随后,arcpy.SearchCursor
用以遍历栅格属性表的每一行数据,逐行读取字段值。将每行的字段值转换为字符串列表lst
,并追加当前栅格文件名raster
,最后拼接为.csv
格式的行数据写入文件。
执行上述代码,即可在结果路径中,看到每一个栅格文件属性表的导出结果文件——每一个栅格文件对应一个.csv
格式文件,.csv
格式文件的名称就是原本栅格文件的名称。如下图所示。
我们就以本文最开头那张图所示的属性表为例,来查看一下其所对应.csv
格式文件。如下图所示,可以看到其就是原本属性表中的内容,且最后多加了一列,也就是原本栅格文件的名称。
至此,大功告成。
欢迎关注:疯狂学习GIS