콘텐츠로 건너뛰기

파이썬 디렉토리에서 파일 목록 보는 방법

[

파이썬 디렉토리 내 모든 파일 목록 가져오기

파이썬에서 디렉토리의 모든 파일과 폴더 목록을 가져오는 것은 파일과 관련된 작업을 수행하는 많은 작업에서 자연스러운 첫 번째 단계입니다. 그러나 이 작업을 수행하는 다양한 방법이 있다는 사실에 놀라실 수도 있습니다.

하나의 작업을 수행하는 많은 방법이 있다면, 해당 문제에는 일반적인 해결책이 없다는 것을 나타낼 수 있습니다. 아마도 각각의 해결책은 장단점을 가지고 있을 것입니다. 이는 파이썬에서 디렉토리의 내용을 나열하는 경우에도 마찬가지입니다.

처음에는 경로를 문자열로 처리하는 것이 괜찮아 보일 수 있지만, 여러 운영 체제를 혼합해서 사용할 때는 더 복잡한 상황이 발생합니다. 또한 파일 경로가 무엇인지와는 추상적으로 매우 동떨어진 문자열 조작과 관련된 코드가 많아집니다. 상황이 빠르게 암호화될 수 있습니다.

경로를 문자열로 처리하는 것이 적절하지 않다고 말한 것은 아닙니다. 결국, pathlib 없이도 개발자들은 많은 해결책을 찾아냈습니다! 그러나 pathlib 모듈은 많은 까다로운 문제를 처리하고 코드의 주요 논리에 집중할 수 있도록 해줍니다.

모든 것은 Path 객체를 생성하는 것으로 시작됩니다. 이 객체는 사용 중인 운영 체제(Operating System, OS)에 따라 다를 것입니다. Windows에서는 WindowsPath 객체를 반환하고, Linux와 macOS에서는 PosixPath를 반환할 것입니다.

  • Windows
  • Linux + macOS
import pathlib
desktop = pathlib.Path("C:/Users/RealPython/Desktop")
desktop
import pathlib
desktop = pathlib.Path("/home/RealPython/Desktop")
desktop

이러한 OS에 구애받는 객체를 사용하면 다양한 메서드와 속성을 활용할 수 있습니다.

1. 디렉토리에서 모든 파일과 폴더 목록 가져오기

파일과 폴더의 목록을 가져오는 첫 번째 방법은 os 모듈의 listdir() 함수를 사용하는 것입니다. 이를 사용하면 디렉토리 내의 모든 파일과 폴더의 이름을 반환할 수 있습니다.

import os
path = "./"
items = os.listdir(path)
for item in items:
print(item)

이 코드는 현재 디렉토리의 모든 항목을 출력합니다. listdir() 함수는 해당 디렉토리의 파일과 서브 디렉토리를 모두 가져옵니다.

2. 디렉토리 내 파일 목록을 재귀적으로 가져오기

실제로 모든 하위 디렉토리의 파일과 폴더를 포함시키고 싶다면 어떻게 해야 할까요? 이렇게 하기 위해서는 재귀적인 방법을 사용해야 합니다. 재귀적으로 모든 하위 디렉토리의 모든 파일과 폴더를 가져오기 위해 os 모듈의 walk() 함수를 사용할 수 있습니다.

import os
path = "./"
for root, dirs, files in os.walk(path):
for file in files:
print(os.path.join(root, file))

위 코드에서 walk() 함수는 현재 디렉토리에 있는 path로부터 모든 파일과 폴더를 순회합니다. 디렉토리, 서브 디렉토리, 파일의 리스트로 순회하면서 join() 함수를 사용하여 디렉토리와 파일 이름을 연결합니다.

3. 특정 조건에 따라 Python Glob 패턴 사용하기

만약 특정 조건에 따라 파일과 폴더를 필터링하고 싶다면 어떻게 해야 할까요? 이 경우에는 Python의 Glob 패턴을 사용하여 조건에 맞는 항목만 가져올 수 있습니다.

3.1. .glob() 함수를 사용한 조건부 목록 작성

Python의 pathlib 모듈은 .glob() 함수를 제공합니다. 이 함수를 사용하여 특정 패턴과 일치하는 모든 항목을 가져올 수 있습니다.

import pathlib
path = pathlib.Path("./")
items = path.glob("*") # 현재 디렉토리 내의 모든 항목 반환
for item in items:
print(item)

이 예제에서 pathlib.Path()를 사용하여 현재 디렉토리를 지정합니다. .glob() 함수는 모든 항목을 반환하는데, 이는 현재 디렉토리의 모든 파일과 폴더를 포함합니다. 따라서 특정 조건에 따라 패턴을 작성하여 조건에 맞는 항목만 가져올 수 있습니다.

3.2. .rglob() 함수를 사용한 조건부 목록 작성

.rglob() 함수는 .glob() 함수와 비슷하지만, 재귀적으로 하위 디렉토리의 모든 항목도 포함합니다.

import pathlib
path = pathlib.Path("./")
items = path.rglob("*") # 디렉토리의 모든 항목(재귀적으로) 반환
for item in items:
print(item)

.rglob("*") 패턴을 사용하면 현재 디렉토리와 그 하위 디렉토리의 모든 파일과 폴더를 반환합니다. 이 방법을 사용하면 특정 조건에 따라 조건에 맞는 항목만 필터링할 수 있습니다.

3.3. Glob 방법을 사용한 고급 일치

Glob 패턴을 사용하면 더욱 고급스럽게 일치시킬 수도 있습니다. Glob 패턴에는 와일드카드 및 문자 클래스를 사용하여 특정 파일과 폴더를지정할 수 있습니다.

import pathlib
path = pathlib.Path("./")
items = path.glob("[!a]*") # 이름이 'a'로 시작하지 않는 모든 항목 반환
for item in items:
print(item)

이 예제에서는 glob("[!a]*") 패턴을 사용하여 이름이 ‘a’로 시작하지 않는 모든 항목을 반환합니다. 이와 같은 방법을 사용하면 특정 조건에 따라 조건에 맞는 항목만 가져올 수 있습니다.

4. 쓰레기 디렉토리 목록에서 제외하기

때때로 디렉토리의 쓰레기 파일이나 특정 패턴을 가진 항목을 제외하고 싶을 수 있습니다. 이 경우 .rglob()를 사용하여 해당 디렉토리를 필터링할 수 있습니다.

4.1. .rglob()를 사용하여 전체 디렉토리 필터링

.rglob() 함수를 사용하여 원하는 항목만 포함하도록 디렉토리를 필터링할 수 있습니다. 이를 통해 필터링할 디렉토리의 직계 하위 디렉토리를 제외한 모든 하위 디렉토리를 포함하여 일치하는 항목만 반환할 수 있습니다.

import pathlib
path = pathlib.Path("./")
items = [item for item in path.rglob("*") if not item.is_dir()]
for item in items:
print(item)

이 코드에서 is_dir() 메서드를 사용하여 디렉토리인지 여부를 확인합니다. 조건을 만족하지 않는 항목은 필터링되어 반환되지 않습니다.

4.2. 재귀적인 .iterdir() 함수 생성

자체적으로 재귀적인 .iterdir() 함수를 작성하여 디렉토리에서 원하는 항목만 필터링할 수도 있습니다.

import pathlib
def recursive_iterdir(path):
for item in path.iterdir():
if item.is_file():
yield item
elif item.is_dir():
yield from recursive_iterdir(item)
path = pathlib.Path("./")
items = recursive_iterdir(path)
for item in items:
print(item)

위 코드에서 iterdir() 메서드를 사용하여 디렉토리의 항목을 반환합니다. item이 파일이면 제너레이터에서 바로 반환되고, 디렉토리이면 recursive_iterdir() 함수에 재귀적으로 호출하여 하위 디렉토리의 항목을 검색합니다.

결론

파이썬에서 디렉토리의 파일과 폴더 목록을 가져오는 방법은 여러 가지입니다. 여기에서는 가장 일반적인 방법과 몇 가지 대안적인 도구에 대해 알아보았습니다. os 모듈의 listdir() 함수, os.walk() 함수, pathlib 모듈의 .glob().rglob() 함수를 사용하여 파일과 폴더의 목록을 가져올 수 있습니다. 또한 별도의 조건을 지정하여 원하는 항목만 필터링하는 방법도 알아보았습니다.

pathlib 모듈은 많은 편리한 메서드와 속성을 제공하여 파일 경로를 처리하는 일을 단순화시킵니다. 이를 통해 코드의 가독성과 유지 보수성을 향상시킬 수 있습니다. 적절한 방법을 선택하여 파일과 폴더 목록을 가져오는 작업을 수행하세요.