ArcGIS 10でのPythonスクリプトによるエラー処理


10

Projectsフォルダーにすべてのmxdファイル(完全パス付き)のリストを作成するために使用しているpythonスクリプトがあります。スクリプトはそれを使用してリストを反復処理し、ESRIの方法ごとに各mxdでfindandreplaceworkspacepathsを実行します。破損したmxdファイルにアクセスすると、問題が発生します。試してみましたが、動作しませんでした。破損したファイル名をファイルに書き込んで次に進むことが理想的な状況です。そうすれば、最後にそれらに戻ることができます。私はpythonスクリプトを使用するのが初めてなので、どんな助けでもいただければ幸いです。

import arcpy, os, sys, traceback, time

oldpath = 'W:'
newpath = 'W:\\GIS'

def find(path,pattern):
    matches = []
    for r,d,f in os.walk(path):
        for files in f:
            if files.endswith(pattern):
                fpath = os.path.join(r,files)
                matches.append(fpath)
                print (fpath)
    return matches


print ("Go: ")
mxdlist = (find('C:\\gis','.mxd'))
print (mxdlist)


print ("Starting Path Conversion")
try:
        for mxdold in mxdlist:
            mxd = arcpy.mapping.MapDocument(mxdold)
            mxd.findAndReplaceWorkspacePaths(oldpath, newpath)
            time.sleep(6)
            mxd.save()
            time.sleep(6)
            print (mxdold)
            del mxd
    except arcpy.ExecuteError:    
        arcpy.AddError(arcpy.GetMessages(2))    

    except:    
        arcpy.AddError("Non-tool error occurred")

回答:


7

最初に行うことは、forループの先頭をtryステートメントの外に出すことです。tryステートメントに操作を強制終了する機会を与える前に、繰り返しに入る必要があります。次に、数行を追加してエラーログを開き、破損したファイルのファイル名を書き込みます。

import arcpy, os, sys, traceback, time

oldpath = 'W:\\'
newpath = 'W:\\GIS'
cgis_dir = 'C:\\gis'

mxdlist = []

print 'Go: '
files = os.listdir(cgis_dir)
for file in files:
    try:
        if file.split('.')[1] == 'mxd':
            mxdlist.append(file)
            print cgis_dir,file
    except:
        pass


print ("Starting Path Conversion")

for mxdold in mxdlist:
    try:
        mxd = arcpy.mapping.MapDocument(mxdold)
        mxd.findAndReplaceWorkspacePaths(oldpath, newpath)
        time.sleep(6)
        mxd.save()
        time.sleep(6)
        print (mxdold)
        del mxd
    except arcpy.ExecuteError:    
        arcpy.AddError(arcpy.GetMessages(2))
        f=open(r'W:\GIS\error.log','a')
        f.write(mxdold,'\n')
        f.close()

    except:    
        arcpy.AddError("Non-tool error occurred")

2
+1いいね、私を倒して!ただし、(rite)でログファイルを開かないでください。毎回上書きする破損したmxdが1つ以上あるかのように、代わりに(ppend)を'w'使用して'a'ください。また、やり過ぎloggingかもしれませんが、Python モジュールはエラーを記録するために一見の価値があります。
om_henners 2012

ナイスキャッチ...ファイルを開くため'a'に追加するコードを修正しました。
Jason

変更されたコードでまだ失敗しています。ファイルが破損していないことを確認しましたが、Windows 7がハングしてスクリプトを強制終了したと主張している場所でファイルを取得しました。何か案は?
bworthington 2012

発生しているエラーは何ですか?残りのコードを投稿できますか?
ジェイソン

1
私には2つの提案があります。1.ロギングとログファイルを再発明しないでください。他の良いリンクがあるsgillies.net/blog/832/python-loggingに小さなPythonロギングhowtoがあります。2.独自のハンドラーアクションを作成しているため、arcpy.AddErrorの呼び出しを破棄することを検討してください。
sgillies 2012

3

これは、破損したMXDでのエラーとは関係ありませんが、ログに記録したいので、logging(@ om_hennersによって提案されているように)モジュールを使用した、最小限の基本的なナゲット(Pythonのドキュメントからかなり直接)があります。上記の@sgilliesコメントも素晴らしいようです。

import logging
import datetime
import os

date_tag = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
log_file = os.path.join(os.path.dirname(os.curdir), "LogFileTest_%s.log" % date_tag)

# Setup logger
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)-8s %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    filename=log_file,
                    filemode='w')
logging.info(': START LOGGING')

try:
    logging.info(": Do something here")
except Exception, err:
    logging.error(": %s" % str(err))

そのまま実行すると、次のようになります。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.