Я только начинаю изучать скрипты Python для работы.
В настоящее время я создаю сценарий для автоматизации процесса.
По сути, он запрашивает у пользователя имя клиента, получает проекцию, если она доступна, создает каталог на диске C: для клиента, создает файловую базу геоданных, специфичную для клиента, создает необходимый набор данных и создает классы пространственных объектов, специфичные для данных клиентов. В конце концов, он также добавит обязательные поля в каждый класс пространственных объектов и, возможно, некоторые другие вещи.
Я начал это, на самом деле не зная правильного этикета сценариев Python для ArcMap. Но то, что я создал, будет работать только вне ArcMap.
Это приемлемо?
Вместо того, чтобы получать пользовательский ввод через arcpy.getparamaterastext (), о котором я только что узнал, я использую raw_input ().
Это нормально?
Это работает, я просто не уверен, что это правильный способ создания сценариев.
Вот код, который у меня есть.
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.")
У меня еще есть работа, например, добавление необходимых полей.
В дополнение к замечательным предложениям @ egdetti вы можете значительно упростить свой сценарий, сделав некоторые предположения вместо написания логики if / else для каждого небольшого условия.
Например:
Вместо того, чтобы проверять, существует ли каждый элемент заранее, просто предположите, что он существует, и перезапишите его, установив
arcpy.env.overwriteOutput = True
. Теперь у вас может быть какая-то причина, по которой вам нужно проверять заранее, но чаще всего перезапись подходит.Вместо того, чтобы проверять, была ли установлена опция пространственной привязки, и вызывать одну и ту же команду двумя различными способами, просто передайте переменную пространственной привязки в команду один раз и дайте ей обработать пустые или пустые строки (что будет хорошо).
Используйте
os.path.join
для объединения элементов пути к файлу вместо использования конкатенации строк, что чревато опасностями.Например, вместо:
Использование:
источник