在ArcGIS 10中使用python脚本进行错误处理


10

我有一个python脚本,可用来在Projects文件夹中创建所有mxd文件(具有完整路径)的列表。然后,脚本使用该脚本遍历列表,并按照ESRI的操作在每个mxd上执行findandreplaceworkspacepaths。当我击中损坏的mxd文件时遇到问题。尝试过try / except,但还没有开始工作。理想的情况是将损坏的文件名写入文件并继续前进,这样我可以在最后返回到它们。我是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")

Answers:


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好人,击败我!但是,请勿使用'w'(rite)打开日志文件- 'a'而是使用(ppend),好像每次都会覆盖多个损坏的mxd。同样,这可能是矫kill过正,但是Python logging模块可能值得一看以记录错误。
om_henners 2012年

不错,...修复了打开'a'附加文件的代码。
杰森

修改后的代码仍然失败。我已经验证文件没有损坏,但是我在Windows 7声称已挂起并杀死脚本的地方得到了文件。有任何想法吗?
bworthington

您遇到的错误是什么?您可以张贴其余代码吗?
杰森

1
我有2条建议:1.不要重新发明日志记录和日志文件。我在sgillies.net/blog/832/python-logging上有一些Python日志记录操作方法,它还有其他很好的链接。2.考虑放弃对arcpy.AddError的调用,因为您正在编写自己的处理程序操作。
sgillies'2

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

按原样运行时,它给出:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.