안녕하세요 점프투 파이썬 06-6 하위디렉토리 검색하기 질문있습니다.

C:/doit/sub_dir_search.py

import os

def search(dirname):
try:
filenames = os.listdir(dirname)
for filename in filenames:
full_filename = os.path.join(dirname, filename)
if os.path.isdir(full_filename):
search(full_filename)
else:
ext = os.path.splitext(full_filename)[-1]
if ext == '.py':
print(full_filename)
except PermissionError:
pass

search("c:/")

이런식으로 코드를 짜면 된다고 하셨는데, try문을 이 코드 실행중PermissionError가 뜨더라도 코드가 종료되지 않기 위해 넣은것이라고 하셨습니다.
근데 생각해보면 pass 때문에 그럼 결국 종료되어 버리지 않나요? pass는 처음으로 돌아가는것이 아니라 가만히 있는 것을 수행하는것이니까요.

gunpoll823 358

2021년 12월 19일 6:04 오후

이렇게 하면 아래와 같이 에러 나는곳에서 for문이 끊겨 버리는데, try: for i in [1,2,3,4,0,5,6]: print(10/i) except ZeroDivisionError: pass #결과값 10.0 5.0 3.3333333333333335 2.5 try문을 안으로 넣으면, for i in [1,2,3,4,0,5,6]: try: print(10/i) except ZeroDivisionError: pass #결과값 10.0 5.0 3.3333333333333335 2.5 2.0 1.6666666666666667 이렇게 끝까지 출력 됩니다. 따라서 위의 코드에서도 try, except pass를 for문 안쪽으로 넣어야 의도한대로 for문이 안끊기고 끝까지 실행되어 모든 디렉토리를 훑을 수 있는것이 아닌지요?? - gunpoll823님, 2021년 12월 19일 9:25 오후 추천 , 대댓글
@gunpoll823님 아, 네 제가 질문의 요지를 잘 이해하지 못했었네요, search 함수는 해당 디렉터리로 권한 오류가 걸리면 그 하위 디렉터리는 전부 접근 불가이기 때문에 거기서 멈추는 것이 맞습니다. 다만 권한이 있는 디렉터리들은 재귀 호출이 계속 진행되기 때문에 권한이 있는 디렉터리는 찾기가 모두 진행됩니다. - 박응용님, 2021년 12월 19일 10:47 오후 추천 , 대댓글
@박응용님 음..그러니까 import os def search(dirname): try: filenames = os.listdir(dirname) for filename in filenames: full_filename = os.path.join(dirname, filename) if os.path.isdir(full_filename): search(full_filename) else: ext = os.path.splitext(full_filename)[-1] if ext == '.py': print(full_filename) except PermissionError: pass search("c:/") 이런식으로 하면, 만약에 예를들어 입력한 디렉토리에 [ 1, 2 ,3, 4] 이런식으로 디렉토리들이 존재한다고 생각하고, 3이 만약 접근 권한이 없는 디렉토리라 가정해보죠. ([ ] 가 입력한 디렉토리를 말하고 1 2 3 4가 그안에 있는 디렉토리들을 의미합니다.) 그럼 여기서 1,2에 대해 search를 수행하면 except문으로 안넘어가고 성공적으로 수행되겠죠. 근데 3에 대해 search를 수행하면 답변 주신대로 except문으로 넘어가 pass가 수행되어 그 하위 디렉토리에 대해서 모두 수행이 안되는것도 이해했습니다. 하지만 여기서, 재귀 호출이 계속 진행 되지 않고 4에 대해선 이 for문이 마저 수행 되지 않고 끝나 버릴것이라고 생각합니다. 제가 위 댓글에 들었던 예시인데 try: for i in [1,2,3,4,0,5,6]: print(10/i) except ZeroDivisionError: pass #결과값 10.0 5.0 3.3333333333333335 2.5 이와 같은 경우처럼 오류가 난 뒤의 값들은 for문이 수행되지 않게 된다고 생각한다는 말이죠. 결론은, 재귀 호출이 for문에 들어가는 요소들에 대해 끝까지 진행되게 하려면, 아래와 같이 for문안에 try문을 넣은 형태로 해야 위에서 말했던 [1,2,3,4]중 3은 pass하고 4까지 search를 수행하게 될 수 있게 된다고 생각합니다. import os def search(dirname): filenames = os.listdir(dirname) for filename in filenames: try: full_filename = os.path.join(dirname, filename) if os.path.isdir(full_filename): search(full_filename) else: ext = os.path.splitext(full_filename)[-1] if ext == '.py': print(full_filename) except PermissionError: pass search("c:/") 글이 길어졌는데, 긴글 읽어주셔서 감사하고, 답변도 늘 감사드립니다. - gunpoll823님, M 2021년 12월 19일 11:09 오후 추천 , 대댓글
@gunpoll823님 PermissionError는 os.listdir 호출시 발생합니다. 따라서 [1, 2, 3, 4] 디렉터리에서 3이라는 디렉터리가 접근권한이 없다면 3이라는 디렉터리는 search가 수행됩니다. 다만 재귀로 호출된 search 함수에서 os.listdir 호출시 PermissionError가 날거구요, 그렇다면 4라는 디렉터리는 호출이 될것 같습니다. - 박응용님, M 2021년 12월 19일 11:32 오후 추천 , 대댓글
@박응용님 아 PermissonError가 os.listdir 함수에서 발생하는 에러인줄 모르고 있어서 헤맸네요. 감사합니다! - gunpoll823님, 2021년 12월 19일 11:37 오후 추천 , 대댓글
목록으로