2012-04-27 1 views
0

a.shp 또는 b.shp가있는 폴더가 여러 개 있고 기타 파일이 여러 개 있습니다. 또는 하나의 폴더에 a.shp와 b.shp를 모두 포함 할 수 있습니다. 이 경우 a.shp를 선택하고 싶습니다. 폴더에 두 개의 파일이 없으면 분석에서 해당 폴더를 제외합니다.파이썬에서 파일 이름에 조건부 파일 찾기

if folder1 has a.shp only: 
    myunit = r"D:\folder1\a.shp" 
elif folder2 has b.shp only: 
    myunit = r"D:\folder2\b.shp" 
elif folder3 has a.shp and b.shp: 
    myunit = r"D:\folder3\a.shp" 
elif folder4 doesn't have a.shp and b.shp: 
    Don't assign anything into myunit. 

사람이 파이썬에서 그 작업을 수행하는 방법에 대한 조언을 제공 할 수 있다면 나는 그것을 감사 정말 것이다 :

나는 다음과 같은 파이썬 코드 뭔가를 작성해야합니다.

감사합니다.

답변

1

나는 귀하의 코드가 귀하의 문제에 대한 설명과 일치하지 않는다고 생각합니다. 나는 문제가 제대로 설명되어 있다고 가정하고, 그래서 당신이 필요로하는 DIRS 필터링하는 기능을 만들어 :

import os 

def filter_dirs(dirs=[]): 
    result = [] 
    for dir in dirs: 
     files = os.listdir(dir) 
     file_a = 'a.shp' in files 
     file_b = 'b.shp' in files 
     if file_a or file_b: 
      result.append({'dir':dir, 'file_a':file_a, 'file_b':file_b}) 
    return result 

그런 다음 몇 가지 폴더와 기능을 시도하고 결과를 참조하십시오

filter_dirs(['D:\folder1', 'D:\folder2', 'D:\folder3']) 
+0

I을 'AttributeError :'list '객체에'push '속성이 없습니다. 그러나 "push"를 "append"로 바꾸는 것이 효과적입니다. 고맙습니다. –

+0

아, 네 말이 맞아. 콘솔에서 코드를 테스트하지 않았습니다. 이제 고칠 수 있습니다. 감사합니다. – sebasuy

1

os.path.exists을 원하는 것처럼 들리므로 패스 이름을 인수로 사용하고 파일 이름이 존재하는지 여부에 따라 True 또는 False을 반환합니다. 파일 이름을 구성하기 위해 os.path.join을 원할 수도 있습니다.

0

os.path.exists 등을 가져 오지 않으려면 try/catch 논리를 사용할 수 있습니다. 거기 있으면 항상 열어 볼 수 있습니다. 그래도 문제가 해결되지 않으면 오류를 찾아서 열어보십시오. 그래도 작동하지 않으면 오류를 포착하고 해당 폴더를 무시하십시오.

docs ("예외"에 대한 CTRL + F)에서 코드 이렇게 권장되는 방법을 도시 :

워드 프로세서에서도
def get_status(file): 
    try: 
     return open(file).readline() 
    except EnvironmentError as err: 
     print "Unable to open file: {}".format(err) 
     sys.exit(1) 

,을 os.path 등과 다른 방법을 도시하는 단편 개럿 (Gareth)은 다음과 같이 설명합니다.

def get_status(file): 
    if not os.path.exists(file): 
     print "file not found" 
     sys.exit(1) 
    return open(file).readline() 

그러나 문서는 스타일면에서이를 권장합니다. 파이썬은 고의적으로 우아한 예외 처리 기능을 가지고 있습니다. 그것은 당신이하기 전에 모든 것을 C 스타일의 편집증 검사에 대해 걱정하는 것보다 이것을 활용하는 관용적 인 것으로 간주됩니다. 그래도 os.path 방식으로하고 싶다면 무엇이든하십시오. 어느 쪽이든 작동합니다.