Arcpy Script Looping - Как мне перебирать таблицы в папке и выполнять функцию arcpy join для каждой таблицы? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь очистить свой скрипт, чтобы мне не приходилось менять переменные каждый раз, когда я хочу его использовать.

У меня есть таблицы arcgis для каждого штата США (плюс округ Колумбия и Пуэрто-Рико).Я хочу перебрать эти таблицы в папке, объединить каждую из них в шейп-файл, скопировать объединенные объекты в новый класс пространственных объектов в другой базе геоданных, назвать этот класс пространственных объектов после соответствующего имени состояния, затем удалить объединение и двигаться дальше.в следующее состояние.

Я бы считал себя новичком, когда дело доходит до Python.Я пытался учить себя годами, но у меня не было хорошего шанса пройти углубленный курс, и у меня нет никого, с кем я работаю, который знает это слишком хорошо.Я знаю, что есть более эффективные способы написания сценариев, такие как циклы, функции и условные операторы, но я не знаю, как их правильно настроить.

Поэтому я создал сценарий, который сделал то, что мне нужно было сделатьна сегодня, но я бы хотел сделать сценарий более динамичным.Я не хочу менять каждое имя таблицы или имя нового класса объектов.Я пытался выяснить, как создать пользовательскую функцию для части кода, но затем создать цикл, чтобы он знал, как перебирать каждую таблицу в папке.Я не был уверен, нужен ли мне сначала цикл, затем функция, или цикл внутри функции.Тогда я не был уверен, как получить правильные имена для выходных классов пространственных объектов, я знаю, как можно ссылаться на динамическую переменную с помощью% s, но не уверен, как включить ее здесь.

layer = arcpy.GetParameterAsText(0)
inField = "GEOID"
jTable = r'k:\geospatial\data\census\national\census_fact_finder_data\census_tract_year_built\aa_by_state\xls_pcts\tables'
jField = "GEOID"
outFC = r'K:\GEOSPATIAL\DATA\Census\National\Census_Fact_Finder_Data\Shapefiles\CFF_Census_Tracts\PCTs\FCC_CT_YB_PCT.gdb'

arcpy.AddMessage("Processing Arizona...")
#join table to census tract layer
arcpy.AddMessage("Joining Arizona table to Census Tracts...")
tract_join = arcpy.AddJoin_management(layer, inField,jTable + "\\az_pcts", jField, "KEEP_COMMON")

#Copy joined features to new feature class in geodatabase
arcpy.AddMessage("Exporting joined features to FCC_CT_YB_PCT geodatabase...")
arcpy.CopyFeatures_management(tract_join, outFC + "\Arizona_PCT")

#remove all joins
arcpy.AddMessage("Removing joins to process next table...")
arcpy.RemoveJoin_management(layer)
arcpy.AddMessage("Arizona Complete")

Так что сВ приведенном выше примере он соединял таблицу Аризоны (az_pcts) со слоем переписных участков (layer = arcpy.GetParameterAsText(0)), копировал объединенные объекты в новую базу данных и называл ее Arizona_PCT, затем удалял объединение и переходил к следующемуТаблица.Я повторил ту же самую точную структуру для каждой таблицы состояний и изменил все окончания пути так, как я хотел, чтобы они были.Если у кого-нибудь есть какие-либо советы, даже кусочки, это будет очень цениться.

1 Ответ

0 голосов
/ 08 апреля 2019

Прежде всего, добро пожаловать в переполнение стека. Вы можете сделать все это с помощью ModelBuilder. Увидеть: Что такое конструктор моделей и краткое руководство

Но что я не понимаю, какие таблицы у вас есть в папке? Обычно вам нужно указать папку в файловой базе геоданных, персональной базе геоданных или в таблице СУБД, а не в папке. Но я пропустил этот вопрос и дал пример кода для вас выше.

В любом случае, я готовлю код для вас. Вы можете следить за этим:

import arcpy
# iterating all tables in an environment , and make join them with a shapefile

# these are constant variables
shapefilepath = r"c:\users\someplace\someshape.shp"
commoncolumn = "SAMECOLUMN"  # this column must be same in other shapefiles too
# If all shapefile samecolumns are different each other, you need to make a list like this
commoncolumns_ordered = ['SAMECOLUMN1', 'SAMECOLUMN2', ]  # .. goes away
mainfolder = r"c:\users\someplace"
tablegdb = r"c:\users\someplace\somegdb.gdb"  # we'll search our tables here

arcpy.env.workspace = tablegdb  # we will work on here
mytables = arcpy.ListTables("*")  # you can filter your tables as starting or ending with a letter.

for table in mytables:
    # you need to make view from all tables
    name = arcpy.Describe(table).name.encode('utf-8')  # my table name
    table_view = arcpy.MakeTableView_management(table, name)

    # ok so we have our view. Otherwise, we would not be able to use this as an input for add join tool
    """
    There are couple differences between add join and join field tools. Read them:
    Add join help : https://pro.arcgis.com/en/pro-app/tool-reference/data-management/add-join.htm
    Join field help : https://pro.arcgis.com/en/pro-app/tool-reference/data-management/join-field.htm

    * We don't have to make table view if we use join field
    """

    # i assume that both common columns, # fields are same.
    out_join = arcpy.AddJoin_management(table_view, commoncolumn, shapefilepath, commoncolumn)

    # extracting them is not useful. But I'll write it down:
    arcpy.Copy_management(out_join, out_data="%s\\%s" % (out_gdb, name))

# some notes:
# If your samecolumn fields are different between each other in tables
# you need to iterate them like this:
for table, column in zip(mytables, commoncolumns_ordered):
    print (table)
    print (column)
    # do others
...