2009-10-29 5 views
1

J'ai une boucle python assez simple qui appelle quelques fonctions et écrit la sortie dans un fichier. Pour ce faire, crée un dossier et enregistre le fichier dans ce dossier.Problème lors de la réexécution du programme

Lorsque je lance le programme pour la première fois avec un nom de fichier unique, il fonctionne correctement. Cependant, si j'essaie de le relancer, ça ne marchera pas et je ne comprends pas pourquoi. Je suis tout à fait certain que ce n'est pas un problème d'écraser le fichier, car je supprime le dossier avant de le réexécuter, et c'est le seul endroit où le fichier est stocké. Y a-t-il un concept que je comprends mal?

Le fichier problématique est 'buff1.shp'. J'utilise Python 2.5 pour effectuer des analyses dans ArcGIS

Merci pour tout conseil (y compris des suggestions sur la façon d'améliorer mon style de codage). Une autre remarque est que mes boucles n'utilisent actuellement qu'une seule valeur car je suis en train de tester cela pour le moment.

# Import system modules 
import sys, string, os, arcgisscripting, shutil 

# Create the Geoprocessor object 
gp = arcgisscripting.create() 

# Load required toolboxes... 
gp.AddToolbox("C:/Program Files/ArcGIS/ArcToolbox/Toolboxes/Spatial Statistics Tools.tbx") 
gp.AddToolbox("C:/Program Files/ArcGIS/ArcToolbox/Toolboxes/Analysis Tools.tbx") 

# specify workspace 
gp.Workspace = "C:/LEED/Cities_20_Oct/services" 
path = "C:\\LEED\\Cities_20_Oct\\services\\" 

results = 'results\\' 
os.mkdir(path + results)  
newpath = path + results 

# Loop through each file (0 -> 20) 
for j in range(0,1): 
    in_file = "ser" + str(j) + ".shp" 
    in_file_2 = "ser" + str(j) + "_c.shp" 
    print "Analyzing " + str(in_file) + " and " + str(in_file_2)  

    #Loop through a range of buffers - in this case, 1,2 
    for i in range(1,2): 
     print "Buffering....." 

     # Local variables... 
     center_services = in_file_2 
     buffer_shp = newpath + "buff" + str(i) + ".shp" 
     points = in_file_2 
     buffered_analysis_count_shp = newpath + "buffered_analysis_count.shp" 
     count_txt = newpath + "count.txt" 

     # Buffer size 
     b_size = 1000 + 1000 * i 
     b_size_input = str(b_size) + ' METERS' 

     print "Buffer:" + b_size_input + "\n" 

     # Process: Buffer... 
     gp.Buffer_analysis(center_services, buffer_shp, b_size_input, "FULL", "ROUND", "ALL", "") 
     print "over" 

(Pour clarifier cette question, j'edited quelques pièces qui n'a pas de sens sans le reste du code L'erreur reste dans le programme..)

Message d'erreur:

ExecuteError: ERROR 000210: Cannot create output C:\LEED\Cities_20_Oct\services\results\buff1.shp Failed to execute (Buffer). 
+0

Que signifie «ça ne marchera pas»? –

+0

Plutôt que de commenter, veuillez éditer votre question originale. –

Répondre

2

Je ne vois pas comment le nom de fichier dans le message d'erreur blahblah \ buff1.shp peut provenir de votre code.

for i in range(0,1): 
    buffer_shp = newpath + "buff" + str(i) + ".shp" 
    gp.Buffer_analysis(center_services, buffer_shp, etc etc) 

devrait produire blahblah\buff0.shp pas blahblah\buff1.shp ... Je suggère fortement que le code devrait être afficher le code que vous avez réellement exécuté. Ajoutez une instruction print juste avant l'appel gp.Buffer_analysis() pour afficher la valeur de i et repr (buffer_shp). Afficher tous les résultats d'impression

Également le commentaire #Loop through a range of buffers (1 ->100) indique que vous voulez commencer à 1, pas à 0. Il aide (vous) grandement si les commentaires correspondent au code.

Ne vous répétez pas; au lieu de

os.mkdir(path + results)  
    newpath = path + results 

faire:

newpath = path + results # using os.path.join() is even better 
    os.mkdir(newpath)  

que vous aimeriez prendre l'habitude de construire tous les chemins en utilisant os.path.join().

Vous devez passer l'appel à os.mkdir() en dehors des boucles, c'est-à-dire une fois par cycle, pas une fois à chaque fois dans la boucle interne.

Les résultats de ces déclarations ne sont pas utilisés:

buffered_analysis_count_shp = newpath + "buffered_analysis_count.shp" 
    count_txt = newpath + "count.txt" 

Mise à jour

recherche sur Google avec les premiers mots dans votre message d'erreur (toujours une bonne idée!) amène à ceci: troubleshooting geoprocessing errors qui fournit les informations suivantes:

erreurs de géotraitement qui se produisent lorsque la lecture ou l'écriture de données ArcSDE/SGBD reçoivent un message d'erreur générique « fourre-tout » , comme erreur 00210 lorsque écriture sortie

Ceci suggère plusieurs façons de déterminer votre problème exact. Si cela ne vous aide pas, vous pouvez essayer de demander dans le forum ESRI pertinent ou sur GIS StackExchange.

+0

Un problème que j'ai remarqué est qu'ArcMap modifie parfois l'emplacement du script même si vous spécifiez une source différente. Je n'étais pas au courant de cela, et je pense que si vous ouvrez et fermez le programme en vérifiant qu'il utilise le script que vous avez spécifié, ça devrait aller. – womble

0

Je serais tenté de regarder à nouveau

chemin

= "C: \ LEED \ Cities_20_Oct \ Services \"

vous voulez sûrement doubles barres obliques avant, pas de double barre oblique inverse?

1

Je vois cela est un ancien affichage de 3 ans, mais pour d'autres ajoutera:

Comme je produis script python pour travailler avec Arc, je comprend toujours juste après mon importation:

arcpy.env.overwriteOutput=True # This allows the script to overwrite files. 

également vous avez mentionné que vous supprimez votre "dossier" ?. Cela ferait partie de votre répertoire, et je ne vois pas où vous créez un répertoire dans le script. Vous voudriez effacer le dossier, pas le supprimer (peut-être que vous vouliez dire que vous supprimiez le fichier cependant).

JJH

Questions connexes