으앙망!

으앙 망했어!

공부/Python

[os] scandir & listdir

euangmang 2025. 8. 15. 18:42

Python 내장 모듈 중 os를 이용해 디렉토리 내의 요소들을 가져올 수 있다.

대표적으로 scandirlistdir 두 함수가 있는데,

각각 특성이 다르기 때문에 상황에 따라 골라 사용하는 게 좋겠다.

(공식 문서에서는 scandir을 좀 더 권하는 듯하다.)


os.scandir

os.scandir을 사용하면 iterator를 반환한다.

반환 받은 iterator의 각 요소는 os.DirEntry 클래스에 속하기 때문에

해당 클래스의 method를 사용할 수 있다.

대표적인 method들은 다음과 같다.

- name : 요소 이름

- path : 절대경로

- is_file : 일반 파일의 경우 True 반환

- is_dir : 디렉토리의 경우 True 반환

...


os.listdir

os.listdir을 사용하면 list를 반환한다.

반환 받은 list의 각 요소는 str, 즉 문자형에 속한다.

따라서, 보통 os.path의 여러 method를 같이 사용하는 편이다.

- os.path.join : 디렉토리와 요소를 함께 사용해 절대경로 반환

- os.path.isfile : 일반 파일의 경우 True 반환

- os.path.isdir : 디렉토리의 경우 True 반환

...


두 함수를 단순한 예시에 적용해 비교해보았다.

os.scandir의 경우 os.listdir의 경우
pdir = "/path/to/directory"

with os.scandir(pdir) as scdir:

    for entry in scdir:
        print("Name:", entry.name)
        print("File:", entry.is_file())
        print("Dir.:", entry.is_dir())
        print("Abs. path:", entry.path)

        print(f"[ {entry.name} ]")

        with os.scandir(entry.path) as scdir2:
            for entry2 in scdir2:
                print("   |--", f"[ {entry2.name} ]")

        print("-"*80)
pdir = "/path/to/directory"

listdir = os.listdir(pdir)

for entry in listdir:
    abspath = os.path.join(pdir, entry)
    print("Name:", entry)
    print("File:", os.path.isfile(abspath))
    print("Dir.:", os.path.isdir(abspath))
    print("Abs. path:", abspath)

    print(f"[ {entry} ]")

    listdir2 = os.listdir(abspath)

    for entry2 in listdir2:
        print("   |--", f"[ {entry2} ]")

    print("-"*80)
결과 (두 결과 모두 동일)
Name: 2024
File: False
Dir.: True
Abs. path: /data7/NCEP/CFSv2/Operational_9-month_Forecast/6-hourly/flxf/nc/2024
[ 2024 ]
   |-- [ 202405 ]
   |-- [ 202411 ]
   |-- [ 202409 ]
   |-- [ 202408 ]
   |-- [ 202401 ]
   |-- [ 202402 ]
   |-- [ 202412 ]
   |-- [ 202410 ]
   |-- [ 202403 ]
   |-- [ 202407 ]
   |-- [ 202406 ]
   |-- [ 202404 ]
--------------------------------------------------------------------------------
Name: 2025
File: False
Dir.: True
Abs. path: /data7/NCEP/CFSv2/Operational_9-month_Forecast/6-hourly/flxf/nc/2025
[ 2025 ]
   |-- [ 202501 ]
   |-- [ 202503 ]
   |-- [ 202502 ]
--------------------------------------------------------------------------------

 

두 함수 모두 동일한 기능을 수행할 수 있다.

 

만약 특정 디렉토리 내의 요소들을 단순한 문자형으로만 얻고자 한다면

listdir이 좀 더 빠른 방법일 수 있다.

 

하지만, 각 요소의 특성을 더 필요로 한다면

scandir이 좀 더 유용할 수 있다.

 

두 함수 공통적으로 주의해야 할 사항으로는,

반환 받은 요소가 이름순으로 정렬되어 있지 않다는 것이다.

따라서 일정한 순서로 정렬이 필요한 경우

사용자가 따로 sorting을 해줘야 한다.

(나는 보통 sort 메서드나 sorted 함수를 사용하는 편이다.)

 

- 끝 -