使用arcpy.da.walk清点数据并将元数据导出到csv

时间:2016-11-30 18:23:12

标签: python csv arcgis arcpy

当谈到arcpy并且我正在尝试开发一个将使用arcpy.da.walk来清点我们的GIS数据的脚本时,我是一个新手。当它通过我们拥有的数据文件夹/ gdbs时,我希望它为每个要素类将一些项目导出到csv(现在我对要素类路径,文件名,空间参考名称和元数据目的感到满意)。我已经让脚本工作到元数据目的部分。一旦我添加了这些行:

arcpy.ExportMetadata_conversion(feature_class, translatorpath, xmlfile)  
tree = ElementTree()  
tree.parse(xmlfile)   
spot = tree.find("idinfo/descript/purpose")

我的脚本没有返回任何内容。如果没有这些行,我会收到一个带有要素类路径,文件名和空间引用名称的csv文件,但如果我包含这些行,则我的csv文件为空。没有错误,只是空的。我的脚本(包含在下面)基于:https://arcpy.wordpress.com/tag/os-walk/https://gis.stackexchange.com/questions/34729/creating-table-containing-all-filenames-and-possibly-metadata-in-file-geodatab/34797#3479/

非常感谢任何帮助!

已编辑:某些要素类可能未定义空间参考,并且许多要素类可能没有任何关联的元数据。我仍然希望在csv中使用这些字段,但这些字段可以是空白的,也可以说“无空间参考定义”和“无元数据目的定义”。

import os
import arcpy
import csv
from xml.etree.ElementTree import ElementTree
from arcpy import env

def inventory_data(workspace, datatypes):
    for path, path_names, data_names in arcpy.da.Walk(
            workspace, datatype=datatypes):
        for data_name in data_names:
            yield os.path.join(path, data_name)

AGSHOME = arcpy.GetInstallInfo("Desktop")["InstallDir"]  
translatorpath = AGSHOME + "Metadata\\Translator\\ARCGIS2FGDC.xml"
outfile = "C:\\GIS\\Records\\Data  Management\\Inventories\\GIS_Data_Inventory_daWalk_function_outputtocsv_descitems_try_sr_meta.csv"
 xmlfile = "C:\\GIS\\Records\\Data Management\\Inventories\\TempInventoryError\\daWalk_function_outputtocsv_descitems_try_sr_meta.xml"

with open (outfile, 'wb') as csvfile:
    csvwriter = csv.writer(csvfile)
    for feature_class in inventory_data(r"C:\GIS\Data\Natural_Environment\Species_and_Habitats\Habitat_Models", "FeatureClass"):
         try:
            desc = arcpy.Describe(feature_class)
            sr = desc.spatialReference
            arcpy.ExportMetadata_conversion(feature_class, translatorpath, xmlfile)  
            tree = ElementTree()  
            tree.parse(xmlfile)   
            spot = tree.find("idinfo/descript/purpose")
            csvwriter.writerow([desc.path.encode('utf-8'), desc.file.encode('utf-8'), desc.dataType.encode('utf-8'), sr.name.encode('utf-8'), spot.text.encode('utf-8')])
         except:
             pass

1 个答案:

答案 0 :(得分:0)

关于"我的脚本没有返回任何内容":

您已将命令放在try ... catch块中,但catch没有做任何事情。如果您打印了Exception消息,您可能会看到这些arcpy错误:

  

ExecuteError:无法执行。参数无效   ERROR 000725:输出文件:数据集C:\ tmp \ test.xml已存在   警告000725:输出文件:数据集C:\ tmp \ test.xml已存在。

要解决此问题,您必须删除xmlfilefor以及每次迭代的开始(或结束),如果我理解正确,它只能用作临时档案反正。

# your other imports here
import traceback

with open (outfile, 'wb') as csvfile:
    csvwriter = csv.writer(csvfile)
    for feature_class in inventory_data(r"C:\some directory", "FeatureClass"):
        try:
            if os.path.isfile(xmlfile):
                os.remove(xmlfile)

            # your other code here
        except Exception:
            print "Failed: ", feature_class
            print traceback.format_exc()

关于将缺失数据写入CSV:

这取决于您正在进行的操作类型以及它产生的数据。对于spot变量,您要检查tree.find的输出是否为None

来自文档:

  

...返回元素实例或无。

使用第二个变量,例如spot_text,用于存储文本值并将其写入CSV:

spot = tree.find("idinfo/descript/purpose")
if spot == None:
    spot_text = "No metadata purpose defined"
else:
    spot_text = spot.text.encode('utf-8')

或缩短:

spot = tree.find("idinfo/descript/purpose")
spot_text = spot.text.encode('utf-8') if spot != None else "No metadata purpose defined"