2016-11-30 10 views
-1

私はarcpyに関しては初心者ですが、arcpy.da.walkを使用してGISデータのインベントリを作成するスクリプトを開発しようとしています。私たちが持っているデータのフォルダ/ gdbsを調べていくうちに、各フィーチャクラスのCSVにいくつかのアイテムをエクスポートしたいと思います(フィーチャクラスパス、ファイル名、空間参照名、メタデータ目的に満足しています)。私は、メタデータ目的の部分までスクリプトを手に入れました。一度私は行を追加します:arcpy.da.walkを使用してデータをインベントリし、メタデータをcsvにエクスポートします

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

私のスクリプトは何も返しません。これらの行がなければ、フィーチャクラスのパス、ファイル名、および空間参照名を含むCSVファイルを受け取っていますが、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は何もしません。あなたはおそらく、これらの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.

を私が正しく理解していれば、あなたは、あなたのforに各反復のxmlfileと開始(または終了)を削除する必要がありますとにかく一時ファイルとしてのみ使用されています。 CSVへのデータの欠落書き込みについて

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

それはあなたがやって、何のデータ、それがもたらしている操作の種類に依存します。 spot変数の場合、tree.findの出力がNoneであるかどうかを確認する必要があります。

... 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

感謝を!私は先週試行錯誤してこのことを理解し、EsriのGeonetフォーラムで助けました。完全な答えはこちらをご覧ください:https://geonet.esri.com/thread/186717-using-arcpydawalk-to-inventory-data-and-export-metadata-to-csv – sgroff

関連する問題