【问题标题】:using arcpy.da.walk to inventory data and export metadata to csv使用 arcpy.da.walk 清点数据并将元数据导出到 csv
【发布时间】:2016-11-30 18:23:11
【问题描述】:

我是 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

【问题讨论】:

    标签: python csv arcgis arcpy


    【解决方案1】:

    关于“我的脚本没有返回任何东西”:

    您已将您的命令放在try ... catch 块中,但您的catch 没有执行任何操作。如果您打印异常消息,您可能会看到这些 arcpy 错误:

    ExecuteError:执行失败。参数无效。
    错误 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"
    

    【讨论】:

    • 感谢您的帮助!我上周通过反复试验发现了这一点,并在 Esri 的 Geonet 论坛上提供了帮助。完整答案可以在这里看到:geonet.esri.com/thread/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    相关资源
    最近更新 更多