이전 글에서 파이썬의 os.listdir을 소개한 적이 있을 겁니다. 다시 복습해 봅시다.

 


 먼저 이 코드는, main.py가 있는 폴더에 있는 파일과 폴더들을 모두 가져옵니다. 단 자신과 상위 폴더는 제외합니다.

 

 해당 폴더에 들어가서 ls -a를 쳐 봅시다. 그러면 이 폴더에 속한 디렉토리와 파일들이 나옵니다. .과 ..을 제외한 갯수를 세면 7개입니다. 프로그램의 실행 결과를 볼까요?

 

 

 7개로 동일하게 나옵니다. 여기서 문제. 이 리스트에 있는 친구들이 파일인지 폴더인지 알아낼 수 있는 방법이 있을까요?

 

 

 그렇지 않습니다. 단지, 리스트에 있는 아이템만 보고 알 길이 없습니다. 그렇기 때문에, 따로 아래와 같은 처리를 해 주어야 합니다.

 

 os.path.isdir로 따로 처리를 했음을 알 수 있습니다. 이는 listdir 함수가 이름 외에 다른 부가적인 정보를 리턴하지 않기 때문입니다. 그러면 어떻게 해야 하나요? os.scandir은 이러한 고민을 말끔하게 해결해 줍니다. 파일의 이름 말고도 부가적인 정보를 돌려주기 때문입니다. 예를 들자면, 디렉토리인지 아닌지, stat 과 같은 것들입니다. 한 줄로 정리하면, os.scandir 함수는 폴더에 속해 있는 파일들의 메타 정보들까지 얻어와야 할 때 유용하게 쓰입니다.

 


 현재 디렉토리에 있는 파일의 갯수가 몇 개인지 세어 봅시다. listdir을 쓰면, 순회를 하면서, os.path.isfile 함수를 써야 합니다. 왜? 파일의 이름 말고는 아무런 정보도 리턴하지 않기 때문입니다.

 

 실행 결과는 9.51초나 걸렸다고 나옵니다.

 

 

 scandir은 DirEntry를 리턴하는데요. 이 안에 파일에 대한 여러 메타 정보들이 들어 있습니다. 이 중에는 파일인지 아닌지에 대한 것도 포함되어 있습니다.

 

 

 dirEntry에서 is_file은 파일인지 아닌지를 리턴합니다. t는 dirEntry의 리스트이므로, item.is_file()은 리스트에 있는 것들이 파일인지 아닌지를 검사한다는 의미가 됩니다.

 

 실행 시간은 9초에서 0.07초로 매우 단축되었습니다.

 

 제 우분투 머신에서도, scandir을 써서 디렉토리 안에 있는 것들이 파일인지 아닌지 판단하는 4.py가 listdir과 os.path.isfile 조합을 쓴 3.py보다 4배 가량 빠릅니다. 이는 문서에도 나와있다 시피, system call이 덜 일어나기 때문입니다.