2016-11-30 2 views
-1

Je suis novice quand il s'agit d'arcpy et j'essaie de développer un script qui utilisera arcpy.da.walk pour inventorier nos données SIG. Comme il traverse les dossiers/gdbs de données que nous avons, je veux exporter quelques éléments à un CSV pour chaque classe d'entités (pour l'instant je serais heureux avec le chemin de la classe d'entités, le nom de fichier, le nom de référence spatiale et le but des métadonnées). J'ai eu le script à travailler jusqu'à la partie de méta-données. Une fois que j'ajoute les lignes:en utilisant arcpy.da.walk pour inventorier les données et exporter les métadonnées vers csv

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

mon script ne renvoie rien. Sans ces lignes, je reçois un fichier csv avec le chemin de la classe d'entités, le nom du fichier et le nom de la référence spatiale, mais si j'inclue les lignes, mon fichier csv est vide. Pas d'erreurs, juste vide. Mon script (ci-dessous) est basé sur: https://arcpy.wordpress.com/tag/os-walk/ et https://gis.stackexchange.com/questions/34729/creating-table-containing-all-filenames-and-possibly-metadata-in-file-geodatab/34797#3479/.

Toute aide est grandement appréciée! EDITED: Certaines classes d'entités n'ont peut-être pas de référence spatiale définie et de nombreuses classes d'entités n'ont aucune métadonnée associée. Je les veux toujours dans le fichier csv, mais ces champs peuvent être vides ou indiquer quelque chose comme "Aucune référence spatiale définie" et "Aucun objectif de métadonnées défini".

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 

Répondre

0

En ce qui concerne « mon script ne retourne rien »:

Vous avez mis vos commandes dans un bloc try ... catch, mais votre catch ne fait rien. Si vous imprimez les messages d'exception que vous auriez probablement vu ces erreurs 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.

Pour résoudre ce problème, vous devez supprimer le xmlfile et le début (ou la fin) de chaque itération dans votre for, si je comprends bien il est seulement utilisé comme un fichier temporaire de toute façon.

# 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() 

En ce qui concerne l'écriture des données manquantes au format CSV:

Cela dépend du type d'opération que vous faites et les données qu'il donne. Pour votre variable spot, vous voulez vérifier si la sortie de tree.find est None.

De la documentation:

... Returns an element instance or None.

Utiliser une deuxième variable, par exemple spot_text, pour stocker la valeur de votre texte et écrire au lieu CSV:

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

Ou raccourci:

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

Merci pour l'aide! Je l'ai compris la semaine dernière par essais et erreurs, et j'ai aidé sur le forum Geonet d'Esri. Une réponse complète peut être vu ici: https://geonet.esri.com/thread/186717-using-arcpydawalk-to-inventory-data-and-export-metadata-to-csv – sgroff