python/os.walk 필터링 os_walkf

Posted at 2010/02/02 19:58// Posted in python/pyutils
python 의 os.walk 는 특정 디렉토리내 파일들을 재귀적으로 탐색할 수 있는 유용한 함수입니다.


# -*- coding:cp949 -*-
# 특정 디렉토리내 모든 파일의 경로를 출력하는 스크립트
import os

root = "특정 디렉토리 경로"
for base, dirs, names in os.walk(root):
for name in names:
print os.path.join(base, name)


그런데 사용하다보면
*.h 만 뽑아낸다던지, .svn 폴더는 제외한다던지 처럼
특정 폴더나 확장자만 얻어내야 할 경우가 자주 있습니다.

예1)

# .svn 디렉토리 제외
for base, dirs, names in os.walk(root):
dirs[:] = [dir for dir in dirs if dir != ".svn"]
...


예2)

# 확장자가 .h 인 파일만 추려내기
for base, dirs, names in os.walk(root):
for name in names:
if os.path.splitext(name)[1].lower() == ".h":
yield os.pah.join(base, name)


1~2줄 정도 추가되는 코드지만 너무 자주 쓰다보니 이렇게 한 두줄 쓰는 것도 귀찮아집니다.

그래서 os_walkf 란 함수를 만들었습니다.

def os_walkf(root, filterDir=None, filterName=None, filterExt=None):

for base, dirs, names in os.walk(root):
if filterDir:
dirs[:] = [dir for dir in dirs if filterDir(dir)]

if filterName:
if filterExt:
for name in names:
if filterName(name) and filterExt(os.path.splitext(name)[1]):
yield os.path.join(base, name)
else:
for name in names:
if filterName(name):
yield os.path.join(base, name)
else:
if filterExt:
for name in names:
if filterExt(os.path.splitext(name)[1]):
yield os.path.join(base, name)
else:
for name in names:
yield os.path.join(base, name)

속도를 위해 과감히 분기처리시켰습니다.

어디서나 사용하기 쉽도록 urlimport 를 지원합니다~

예제1

# .svn 디렉토리 제외
import urlimport_myevan
from os_utils import os_walkf

for path in os_walkf(".", filterDir=lambda dir: dir != ".svn"):
print path


예제2

# .h 파일만 수집
import urlimport_myevan
from os_utils import os_walkf

for path in os_walkf(".", filterExtr=lambda ext: ext.lower() == ".h"):
print path


짜잔~
이올린에 북마크하기(0) 이올린에 추천하기(0)
2010/02/02 19:58 2010/02/02 19:58