当谈到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
答案 0 :(得分:0)
关于"我的脚本没有返回任何内容":
您已将命令放在try ... catch
块中,但catch
没有做任何事情。如果您打印了Exception消息,您可能会看到这些arcpy错误:
ExecuteError:无法执行。参数无效 ERROR 000725:输出文件:数据集C:\ tmp \ test.xml已存在 警告000725:输出文件:数据集C:\ tmp \ test.xml已存在。
要解决此问题,您必须删除xmlfile
中for
以及每次迭代的开始(或结束),如果我理解正确,它只能用作临时档案反正。
# 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"