Kesalahan penanganan dengan skrip python di ArcGIS 10

10

Saya memiliki skrip python yang saya gunakan untuk membuat daftar semua file mxd (dengan pathing lengkap) di folder Projects kami. Script kemudian menggunakannya untuk beralih melalui daftar dan melakukan pencarian dan membuat laporan pada setiap mxd sesuai ESRI. Saya mengalami masalah ketika saya menabrak file mxd yang rusak. Mereka telah mencoba / kecuali dan belum berhasil. Situasi yang ideal adalah menulis nama file yang rusak ke file dan melanjutkan sehingga saya bisa kembali kepada mereka di akhir. Saya sangat baru dengan skrip python, bantuan apa pun akan sangat dihargai.

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")
bworthington
sumber

Jawaban:

7

Hal pertama yang harus dilakukan adalah membawa bagian atas forloop Anda di luar trypernyataan. Anda ingin masuk ke iterasi Anda sebelum Anda memberikan trypernyataan kesempatan untuk membunuh operasi Anda. Selanjutnya Anda akan ingin menambahkan beberapa baris untuk membuka log kesalahan dan menulis nama file file yang rusak.

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")
Jason
sumber
2
+1 Bagus, kalahkan saya! Namun, jangan membuka file log dengan 'w'(ritus) - gunakan 'a'(ppend) sebagai gantinya seolah-olah ada lebih dari satu mxd yang rusak Anda akan menimpa setiap kali. Juga, itu mungkin berlebihan, tetapi loggingmodul Python mungkin layak dilihat untuk merekam kesalahan.
om_henners
Tangkapan yang bagus ... memperbaiki kode untuk membuka file dengan 'a'untuk menambahkan.
Jason
Masih gagal dengan kode yang dimodifikasi. Saya telah memverifikasi bahwa file tidak rusak tetapi saya mendapatkannya di mana Windows 7 mengklaim telah menggantung dan membunuh skrip. Ada ide?
bworthington
Apa kesalahan yang Anda dapatkan? Bisakah Anda memposting sisa kode?
Jason
1
Saya punya 2 saran: 1. Jangan menemukan kembali logging dan mencatat file. Saya punya sedikit Python untuk login di sgillies.net/blog/832/python-logging yang memiliki tautan bagus lainnya. 2. Pertimbangkan untuk membatalkan panggilan ke arcpy.AddError karena Anda sedang menulis tindakan handler Anda sendiri.
sgillies
3

Ini tidak ada hubungannya dengan kesalahan Anda pada MXDs yang korup, tetapi karena Anda ingin login, ini adalah nugget bertelanjangi (cukup banyak langsung dari dokumen Python) menggunakan loggingmodul (seperti yang disarankan oleh @om_henners). Komentar @sgillies di atas terlihat sangat baik juga.

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

Ketika dijalankan apa adanya, ia memberikan:

masukkan deskripsi gambar di sini

Chad Cooper
sumber