2016-11-30 9 views
-1

Я новичок, когда дело доходит до дуговой работы, и я пытаюсь разработать скрипт, который будет использовать arcpy.da.walk для инвентаризации наших данных ГИС. Поскольку он проходит через папки/gdbs данных, которые у нас есть, я хочу, чтобы он экспортировал несколько элементов в csv для каждого класса объектов (теперь я был бы доволен пути класса объектов, имени файла, имени пространственной ссылки и целей метаданных). Я получил скрипт для работы до части назначения метаданных. Как только я добавлю строки:using arcpy.da.walk для инвентаризации данных и экспорта метаданных в 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/.

Любая помощь очень ценится!

EDITED: Некоторые классы объектов могут не иметь пространственной привязки, и многие классы объектов могут не иметь связанных метаданных. Я все еще хочу их в 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

Что касается «мой сценарий не возвращает ничего»:

Вы поставили свои команды в try ... catch блоке, но ваш catch ничего не делает. Если вы напечатали Exception сообщения, которые вы, вероятно, увидели бы эту arcpy ошибки:

ExecuteError: Failed to execute. Parameters are not valid.
ERROR 000725: Output File: Dataset C:\tmp\test.xml already exists.
WARNING 000725: Output File: Dataset C:\tmp\test.xml already exists.

Чтобы решить эту проблему, вы должны удалить 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.findNone.

Из документации:

... Returns an element instance or 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" 
+0

Спасибо за помощь! Я понял это на прошлой неделе в ходе проб и ошибок и помог на форуме Geonet в Esri. Полный ответ можно посмотреть здесь: https://geonet.esri.com/thread/186717-using-arcpydawalk-to-inventory-data-and-export-metadata-to-csv – sgroff