2012-02-23 2 views
0

파일 이름과 폴더 경로 이름을 매개 변수로 사용하여 직접 또는 간접적으로 폴더 및 폴더에있는 파일을 검색하는 프로그램이 필요합니다. 함수는 파일의 경로명 (찾은 경우)을 반환해야하며, 폴더 또는 폴더의 하위 디렉토리에서 파일을 찾을 수없는 경우 없음을 반환해야합니다. 이 함수는 재귀 적이어야합니다.파일의 경로 이름을 재귀 적으로 반환하십시오.

def search(fname, path): 

    for item in os.listdir(path): 
     next = os.path.join(path, item) 
     try: 
      search(next,fname) 
     except: 
      return next 

그것의 라인을 따라 뭔가 같이해야합니다 :

>>>search('fileA.txt', 'test') 
'test\\fileA.txt' 
>>>search('fileB.txt', 'test') 
'text\\folder2\\fileB.txt' 

요법

여기 내 코드입니다. 하지만 파일 찾기에 상관없이 fileA.txt를 찾기 위해 코드를 얻을 수 있습니다. 당신은 실제로에 확인 함수에 조건이없는

  1. :

    이 ** 내가 몇 가지 문제를 참조하십시오

    내가 어떤 도움을 교사에게 물었다, 이것은 그녀가 나에게 무엇인가 파일을 찾았는지 확인하십시오. 이 문제를 해결할 때 다음 호를 참조하십시오.
  2. 이미 경로를 추가 한 경우 fname은 해당 파일과 일치하지 않습니다. 파일의 전체 경로 이름을 만들기 전에 파일 이름을 확인해야합니다. 그렇지 않으면 일치시킬 수 없습니다.
  3. 재귀 호출에서 반환 된 값은 사용하지 마십시오. 이들은 경로 또는 없음 중 하나를 반환해야하며 돌아 오는 것을 확인하지 않습니다. **
+1

왜'try' /'except'를 사용하고 있습니까? 나는 당신이'if' /'else'를 찾고 있다고 생각합니다. –

+0

정교하세요? – AngelE

답변

2

재귀 요소가 겹쳐서 표시됩니다. search(fname, next)을 시도해보십시오.

브렌든 (Blndan)에 의해 언급 된 바와 같이 여기에 오류가 발생하지 않았으므로 if/else이 아니라 try/except이 사용되어야합니다.

그리고 마지막으로 재귀를 종료하고 무한 반복/재귀를 방지하는 최종 조건 인 기본 사례 (예 : 더 이상 이동할 수있는 디렉토리 없음)가없는 것 같습니다.

1

이 작업을 수행하기 위해() os.walk 사용할 수 있습니다

import os 

def search(fname, path): 
    for root, dirs, files in os.walk(path): 
     if fname in files: 
      return os.path.join(root, file) 
     else: 
      return None 
+0

나는 그것을 추가하려고 생각하고 있었지만 선생님이 그들이 os.walk을 재발견하기를 바라고 있다고 생각합니다. – Edwin

+0

공정한 점은 "요구 사항"에 의한 할당이 재귀 적이라는 것이 었습니다. – aravenel

+0

예, 불행히도 재귀 적이어야하며, 여전히 문제가 있습니다 : / – AngelE

0

당신은 재귀 종료 조건이 필요합니다. 함수가 반환해야하는 조건과 계속 유지해야하는 조건을 생각해보십시오. 그런 다음 해당 조건을 테스트하기 위해 if/else 블록을 작성하십시오. 반환 조건이 성립하면 올바른 값을 반환하십시오. 그렇지 않으면 재귀 호출의 결과를 반환합니다. 즉, 다음과 같이 나타납니다 (0120).

def search(old_args) 
    if condition: 
     return 'value' # recursion terminates and value is returned 
    else:    # all the way down the call stack 
     return search(new_args) # continue recursion until `condition` holds & 
           # pass the result down the stack with `return` 
관련 문제