Ich fange gerade an, mich mit Python-Skripten für die Arbeit zu beschäftigen.
Ich erstelle gerade ein Skript, um einen Prozess zu automatisieren.
Grundsätzlich wird der Benutzer nach dem Client-Namen gefragt, eine Projektion abgerufen, falls verfügbar, ein Verzeichnis auf Laufwerk C: für Client erstellt, eine für den Client spezifische Geodatabase für Dateien erstellt, das erforderliche Dataset erstellt und für Client-Daten spezifische Feature-Classes erstellt. Schließlich werden auch die erforderlichen Felder zu jeder Feature-Class und wahrscheinlich einige andere Dinge hinzugefügt.
Ich habe damit begonnen, die richtige Etikette für Python-Skripte für ArcMap nicht wirklich zu kennen. Aber was ich bisher erstellt habe, läuft meiner Meinung nach nur außerhalb von ArcMap.
Ist das akzeptabel?
Anstatt Benutzereingaben über arcpy.getparamaterastext () zu erhalten, von denen ich gerade erfahren habe, verwende ich raw_input ().
Ist das okay?
Es funktioniert, ich bin mir nur nicht sicher, ob dies der richtige Weg ist, um Skripte zu erstellen.
Hier ist der Code, den ich bisher habe.
import sys
import arcpy
import os
#Records name of the client
client = raw_input("Enter the name of the client: (letters and underscores only) \n")
#Records filepath of client to be created
clientpath = "C:/" + client
#Inquires if projection file exists
projection = raw_input("Is there a .prj or .shp available with correct projection? Y or N \n")
#Records the projection location if available
if projection.upper() == "Y":
spatialr = raw_input("Drag the .prj or .shp here to record the filepath \n")
nspatialr = spatialr.replace('"', "")
elif projection.upper() == "N":
alert = raw_input("You must add the spatial reference manually, hit enter to continue. \n")
elif projection.upper() != "N" or "Y":
exit = raw_input("That is not a valid response. Try again. \n")
sys.exit()
#Checks if client folder exists; if not, creates one
if not os.path.exists(clientpath):
os.makedirs(clientpath)
#Variable for file geodatabase location
FGBpath = clientpath + "/" + client + ".gdb"
#Checks if client file geodatabase exists; if not, creates one
if not arcpy.Exists(FGBpath):
arcpy.CreateFileGDB_management(clientpath, client)
#Variable for dataset location
FDatasetpath = clientpath + "/" + client + ".gdb" + "/Network"
#Checks if dataset exists; if not, creates one
if not arcpy.Exists(FDatasetpath):
if projection.upper() == "Y":
arcpy.CreateFeatureDataset_management(FGBpath, "Network", nspatialr)
elif projection.upper() == "N":
arcpy.CreateFeatureDataset_management(FGBpath, "Network")
#Variable for cable feature class location
FCcablepath = clientpath + "/" + client + ".gdb" + "/Network" + "/cable"
#Checks if cable feature class exists; if not, creates one
if not arcpy.Exists(FCcablepath):
if projection.upper() == "Y":
arcpy.CreateFeatureclass_management (FDatasetpath, "cable", "POLYLINE", "", "", "", nspatialr)
elif projection.upper() == "N":
arcpy.CreateFeatureclass_management (FDatasetpath, "cable", "POLYLINE")
#Variable for splice point feature class location
FCsplicepath = clientpath + "/" + client + ".gdb" + "/Network" + "/splice_point"
#Checks if splice point feature class exists; if not, creates one
if not arcpy.Exists(FCsplicepath):
if projection == 'Y' or projection == 'y':
arcpy.CreateFeatureclass_management (FDatasetpath, "splice_point", "POINT", "", "", "", nspatialr)
elif projection == 'N' or projection == 'n':
arcpy.CreateFeatureclass_management (FDatasetpath, "splice_point", "POINT")
exit = raw_input("\n\n File geodatabase, dataset, and the cable \n and splice point feature classes successfully created. \n\n Hit enter to exit.")
Ich habe noch einige Arbeiten zu erledigen, beispielsweise das Hinzufügen der erforderlichen Felder.
Zusätzlich zu den großartigen Vorschlägen von @ egdetti können Sie Ihr Skript erheblich vereinfachen, indem Sie einige Annahmen treffen , anstatt für jede kleine Bedingung eine if / else-Logik zu schreiben.
Zum Beispiel:
Anstatt vorher zu prüfen, ob jedes Element vorhanden ist, nehmen Sie einfach an, dass dies der Fall ist, und überschreiben Sie es durch Festlegen
arcpy.env.overwriteOutput = True
. Jetzt haben Sie vielleicht einen Grund, warum Sie vorher prüfen müssen, aber meistens ist das Überschreiben in Ordnung.Anstatt zu überprüfen, ob die räumliche Referenzoption festgelegt wurde, und denselben Befehl auf zwei verschiedene Arten aufzurufen, übergeben Sie die räumliche Referenzvariable einfach einmal an den Befehl und lassen Sie ihn null oder leere Zeichenfolgen verarbeiten (was in Ordnung ist).
Verwenden Sie
os.path.join
diese Option , um Dateipfadelemente zu verknüpfen, anstatt die mit Gefahren behaftete Zeichenfolgenverkettung zu verwenden.ZB statt:
Benutzen:
quelle