안녕하세요. 여행 갔다와서 오랫만에 글을 씁니다. 이번 시간에는 파이썬의 os에 있는 listdir에 대해 알아봅시다.

 


 먼저, 함수 설명을 봅시다. 이 함수는 디렉토리 안에 있는 파일들의 목록을 리턴해 주는 함수입니다. 예제 프로그램을 봅시다.

 

 

 먼저, main.py는 프로젝트의 root 폴더에 있습니다. os.path.abspath('./test_data')는 기준 경로 밑에 test_data 폴더의 abspath를 출력합니다. 프로젝트 구조를 볼게요.

 

 

 test_data 밑에 있는 파일은 디렉토리 1, 1.in, 1.txt, 2.txt입니다. 실행 결과만 보도록 하겠습니다.

 

 

  1, 1.in, 1.txt, 2.txt를 출력하는데요. 기준 경로로 잡혀있는 것이 드라이브 C 밑에 Users 밑에 chokw 밑에 PycharmProjects 밑에 있는 testP 디렉토리여서 그렇습니다.

 

 

 만약에, testP 밑에 있는 2 디렉토리 밑에 main.py가 있었어요. 그리고, testP 밑에 test_data라는 디렉토리가 있었어요.

 

 

 2 폴더에서, main.py를 실행시키면 어떻게 될까요? 지정된 경로를 찾을 수 없다는 에러가 뜨는데요. 이는, 2 밑에 test_data라는 디렉토리가 없기 때문입니다.

 

 다시 이 상태로 돌아와 봅시다. main.py가 testP 밑에 있었고, 기준 디렉토리가 testP로 잡혀있었다고 해 보겠습니다. 그러면, 아래와 같이 상황이 그려질 겁니다.

 

 

 './test_data'는, 그림에서 ... 밑에 있는 test_data를 가리킵니다. 이 폴더 안에 있는 파일, 디렉토리는 무엇이 있나요? 1.txt, 2.txt, 1.in, 디렉토리 1이 있어요. 이들을 리스트 형태로 리턴하게 됩니다.

 

상대 경로를 처리할 때에는, 기준이 되는 경로를 잘 파악하시면 좋습니다.

 


 그런데, listdir은 파일이던, 디렉토리던 상관 없이 결과에 뿌려주게 됩니다. 해당 디렉토리에 있는 파일만 찾고 싶다면 어떻게 하면 좋을까요? os.path.isfile을 사용하시면 됩니다. 이것은 파일이면 True를, 그렇지 않으면 False를 리턴합니다. 그런데, listdir은 절대 경로 전체가 아니라, 파일 이름만을 리턴하게 됩니다. 그래서, 기준이 되는 디렉토리의 절대 경로랑 디렉토리 안에 있는 파일이나 디렉토리 이름을 join해야 합니다.

 

 

 3번째 줄에, os.path.isfile 메서드를 보시면 알 수 있습니다. 2번째 줄에 path는 기준이 되는 경로 밑에 test_data의 abspath를 돌려줍니다. 이 안에 있는 파일들은 os.listdir로 구할 수 있습니다.

 

 기준이 되는 dir이 제가 군청색으로 표시한 ...이였다면, ./test_data 밑에 있는 건 그림에서 보시면 1.txt, 2.txt, 1.in, 1일 겁니다. 이 중에서 1은 디렉토리입니다. 이것은 file이 아니므로 os.path.isFile은 False가 나올 겁니다. 그러므로, 1은 걸러지고, 1.txt, 2.txt, 1.in만 결과값에 취합되서 출력되게 됩니다.

 

 결과는 위와 같습니다.