2013-05-23 3 views
0

여러 디렉토리와 여러 GDB를 반복하여 피쳐 클래스 목록을 만들려고합니다. 내가 가지고있는 문제는 목록에서 특정 피쳐 클래스를 제거하려고 할 때 스크립트가 무시되고 있거나 x가 목록에 존재하지 않는다는 오류가 발생한다는 것입니다. (x). 피쳐 클래스 이름의 문제점은 각 GDB에 고유 한 3 개의 문자가 있지만 표준 인 2 개의 다른 구성 요소가 여전히 있다는 것입니다.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'이라는 디렉토리. dirnames를 반복하고 'dir1'이 그 중 하나에 있는지 확인하는 inner for 루프가 필요합니다. – tdelaney

+0

예 스크립트 스 니펫은 전체 디렉토리 및 피쳐 클래스를 삭제합니다. 그게 내 문제가 어디 전체 디렉토리가 디렉토리 내에서 몇 가지 기능을 클래스 싶지 않아요. – cbrannin

+0

'directory1'이라는 디렉토리와 'dir1'을 포함하지만 'dir1'이라는 디렉토리가없는 'fc_dir1_feature'와 같은 디렉토리가 있습니다. 그래서 if 문이 정말로''dirnames :'에있는''directory1 ''이라면, 당신은 그 문제를 갖게 될 것입니다. 나는 이것을 해결하는 방법을 알고 대답을 쓸 것이라고 생각합니다. – tdelaney

답변

1

arcpy.da.Walk가 os.walk처럼 작동한다고 가정하면 (즉, dirnames에서 디렉토리를 제거하면 해당 디렉토리로 이동하는 것을 멈 춥니 다) 다른 for 루프를 추가하여 dirnames를 반복하고 필터를 적용해야합니다. 내가 이터레이터를 엉망으로 만들지 않고 remove를 호출 할 수 있도록 dirnames를 복사했음을 주목하라.

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에서 Cribbing, 당신은 여러 가지 방법으로 파일 이름을 필터링하는 정규식을 사용할 수 있습니다. 여기에 'ABC'를 가진 파일을 제거하는 정규 표현식의 예는 와일드 카드 슬롯에 'DEF'또는 'GHI'이다 :

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

예, 파일 이름을 사용하여 동일한 기본 작업을 수행 할 수 있습니다. 이후의 반복을 위해 파일 이름이 필요하지 않으므로 새로운 wanted_files 목록을 만들고 파일 이름을 반복하며 목록에 원하는 이름 만 붙이십시오. 그런 다음 어딘가에 목록을 사용해야합니다. – tdelaney

+0

파일 이름에 와일드 카드 (fc_ [와일드 카드] _feature)가 있다는 사실을 어떻게 처리해야할지 모르겠다. 필자는 수백 개의 디렉토리를 거치며이를 제외해야하는 여러 개의 파일이 있습니다. 내가 해봤 다른 모든 것은 무시되었습니다. – cbrannin