이번에 살펴볼 문제는, 내 컴퓨터에서 파일명에 어떤 원하는 pattern이 포함되어 있는 파일들을 찾아내는 문제입니다. 일단 이 문제를 위해서는 os
라는 라이브러리를 사용해야합니다. 그 중에서 listdir
이라는 함수는 경로를 인자로 받아서 해당 경로에 있는 파일과 폴더 이름들을 list형태로 리턴해줍니다. 간단한 예를 보시면,
>>> import os
>>> os.listdir('/Users/') #이건 제 컴퓨터의 결과이고, 여러분들은 다 다를 것입니다 :)
['.localized', 'Jacob', 'Shared']
이렇게 쉽게 탐색 결과를 받아올 수 있습니다. 그렇다면, 어떤 것이 폴더이고 어떤 것이 파일인지는 어떻게 알 수 있을까요? 그것은 os.path.isdir
이라는 함수를 쓰면 알 수 있습니다.
>>> os.path.isdir('/Users/')
True
자, 이제 모든 준비가 끝난 것 같네요 :) 이제 본격적으로 탐색부분을 구현해 보겠습니다. 디렉토리 탐색의 가장 기본은 RECURSIVE SEARCH입니다. 폴더를 발견하면 그 하위 폴더로 들어가고, 또 들어가고… 이런식으로 모든 하위폴더, 하위파일에 대해서 pattern검사를 하고 그 결과를 리턴해주는 함수를 짜 보도록 하겠습니다.
def matchPathList(pattern, startPath='./', result=[]):
dirList = os.listdir(startPath)
#해당 디렉토리의 item을 하나씩 돌면서,
for item in dirList:
newPath = startPath + item
#만약 디렉토리이면 recursive하게 하위 디렉토리로 들어가서 탐색합니다.
if os.path.isdir(newPath):
matchPathList(pattern, newPath+'/', result) #directory이기 때문에 끝에 '/'를 붙여줘야 recursive할 때 계속해서 경로를 탐색할 수 있습니다!
#만약 파일이면 패턴이 있는지 검사하고 있으면 결과에 추가합니다.
else:
if pattern in item:
result.append(newPath)
return result
>>> startPath = '/Users/Jacob/Dropbox/'
>>> dirlist = matchPathList('homework', startPath)
['/Users/Jacob/Dropbox/2013-Autumn/EE263/263homework.pdf',
'/Users/Jacob/Dropbox/2013-Autumn/EE263/\xe1\x84\x8c\xe1\x85\xa9\xe1\x86\xa8\xe1\x84\x87\xe1\x85\xa9/263homework.pdf',
'/Users/Jacob/Dropbox/2013-Autumn/EE263/\xe1\x84\x8c\xe1\x85\xa9\xe1\x86\xa8\xe1\x84\x87\xe1\x85\xa9/Solution/263homework_solution.pdf',
'/Users/Jacob/Dropbox/2013-Autumn/EE263/\xe1\x84\x8c\xe1\x85\xa9\xe1\x86\xa8\xe1\x84\x87\xe1\x85\xa9/Solution/EE 263/history/263homework.pdf', ...]
우리가 원하는 파일들의 리스트를 얻었네요 :) 그렇다면 이 리스트를 길이순, 그리고 같은 길이면 알파벳순으로 정렬하려면 어떻게 해야 할까요? 앞서 customized sorting에서 배웠던 방법으로 정렬해보면,
>>> sorted(dirlist, key=lambda x:(len(x), x))
['/Users/Jacob/Dropbox/2013-Autumn/EE263/263homework.pdf',
'/Users/Jacob/Dropbox/2014-Autumn/CS221/\xe1\x84\x89\xe1\x85\xa9\xe1\x84\x89\xe1\x85\xb3/homework.aux',
'/Users/Jacob/Dropbox/2014-Autumn/CS221/\xe1\x84\x89\xe1\x85\xa9\xe1\x84\x89\xe1\x85\xb3/homework.log',
'/Users/Jacob/Dropbox/2014-Autumn/CS221/\xe1\x84\x89\xe1\x85\xa9\xe1\x84\x89\xe1\x85\xb3/homework.pdf',
'/Users/Jacob/Dropbox/2014-Autumn/CS221/\xe1\x84\x89\xe1\x85\xa9\xe1\x84\x89\xe1\x85\xb3/homework.tex',
'/Users/Jacob/Dropbox/2014-Autumn/CS221/\xe1\x84\x89\xe1\x85\xa9\xe1\x84\x89\xe1\x85\xb3/homework.tex~', ...]
아주 멋지게 정렬되는 것을 확인하실 수 있습니다 :)