2013-05-23 5 views
0

Я пытаюсь объединить несколько каталогов и несколько GDB для создания списка классов объектов. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь удалить определенные классы объектов из списка, сценарий просто игнорируется или я получаю сообщение об ошибке, в котором x не существует в списке. (X). Проблема с именами классов объектов состоит в том, что у нее есть 3 буквы, которые уникальны для каждого GDB, при этом все еще имеют 2 других стандартных компонента.loop through dirnames list.remove() не работает

Что-то вроде этого:

directory1> directory1.gdb> формы> fc_dir1_feature

&

directory2> directory2.gdb> формы> fc_dir2_feature

и так далее ...

Я использую

for dirpath, dirnames, filenames in arcpy.da.Walk(in_workspace, datatype="FeatureClass",type="Polygon"): 
if "dir1" in dirnames: 
    dirnames.remove('dir1') 

Что отлично подходит для удаления наборов данных функций из GDB и расширения всех классов объектов внутри. Но я не могу удалить только определенные классы объектов.

Спасибо за любую помощь.

+0

код, который вы показать ничего не фильтрует ... у вас нет любые каталоги с именем 'dir1'. Вам нужен внутренний цикл for, который выполняет итерации dirnames и проверок, чтобы увидеть, находится ли 'dir1' в одном из них. – tdelaney

+0

Да, этот фрагмент сценария удалит весь каталог и классы объектов внутри. Вот где моя проблема, я не хочу, чтобы весь каталог перешел некоторые классы объектов в каталог. – cbrannin

+0

у вас есть каталог под названием «directory1» и каталоги, такие как «fc_dir1_feature», которые содержат «dir1», но не каталоги, называемые самими «dir1». Итак, если ваш оператор if действительно 'if" directory1 "в dirnames:', тогда у вас будет эта проблема. Думаю, я знаю, как это решить и напишу ответ. – tdelaney

ответ

1

Предполагая, что arcpy.da.Walk работает как os.walk (то есть удаление каталога из dirnames перестает идти к этому каталогу), вы должны добавить еще один цикл для итерации dirnames и применить ваш фильтр. Обратите внимание, что я скопировал dirnames, чтобы я мог вызвать remove, не запутывая итератор.

for dirpath, dirnames, filenames in arcpy.da.Walk(in_workspace, datatype="FeatureClass",type="Polygon"): 
    # remove subdirectories that match pattern so they will not be walked 
    for dirname in dirnames[:]: 
     if 'dir1' in dirname: 
      dirnames.remove(dirname) 

списывание из ArcGIS Resources, вы можете использовать регулярные выражения для фильтрации имен файлов несколько различных способов. Ниже приведены примеры регулярных выражений, который удаляет файлы, которые имеют «ABC», «Защиту» или «ГХИ» в ваших подстановочных слотов:

import arcpy 
import os 
import re 

workspace = "c:/data" 
feature_classes = [] 

# i dont like abc, def or ghi features so I have a regex to match them 
filter_classes_re = re.compile('fc_(abc|def|ghi)_feature$') 

for dirpath, dirnames, filenames in arcpy.da.Walk(workspace, 
                datatype="FeatureClass", 
                type="Polygon"): 
    for filename in filenames: 
     # only add to feature list if it doesn't match the bad guys 
     if filter_classes_re.match(filename) is None: 
      feature_classes.append(os.path.join(dirpath, filename)) 


# alternately, i could extract the wildcard part and compare it outside 
# of the regex ... but this will be slower 

filter_classes_re = re.compile('fc_(.*?)_feature$') 

for dirpath, dirnames, filenames in arcpy.da.Walk(workspace, 
                datatype="FeatureClass", 
                type="Polygon"): 
    for filename in filenames: 
     # extract the wildcard part 
     match = filter_classes_re.match(filename) 
     if match: 
      matched = match.group(1) 
     else: 
      matched = '' 
     if matched not in ('abc', 'def', 'ghi'): 
      feature_classes.append(os.path.join(dirpath, filename)) 
+0

Вопрос что я пытаюсь ограничить файлы в каталоге. Мне все равно нужно ходить по каталогам и удалять определенные файлы. Файлы обозначаются как «fc _. * _ Feature». Я попытаюсь применить ваш скрипт выше, чтобы работать с именами файлов, будет ли это работать? – cbrannin

+0

Да, вы можете сделать то же самое с именами файлов. Поскольку имена файлов не нужны для дальнейшей итерации, вы создаете новый список желаемых_файлов, просматриваете имена файлов и вставляете только те, которые вы хотите в списке. Тогда вы должны, конечно, использовать этот список. – tdelaney

+0

Я не знаю/понимаю, как иметь дело с тем, что имена файлов имеют в них подстановочный знак (fc_ [wildcard] _feature. Я прохожу через сотни каталогов и есть несколько файлов, подобных этому, которые нужно исключить. Все остальное, что я пробовал, было проигнорировано. – cbrannin