5. 특정 디렉터리부터 시작해서 그 하위 모든 파일 중 파이썬 파일(*.py)만 출력해 주는 프로그램을 만들어 보자.
- 내 답안
디렉터리 안의 모든 파일을 읽어서 리스트로 만들어 주는 glob을 활용한다.
1) glob 코드를 넣은 모듈을 만든다.("practice6_6.py")
import glob
glob.glob("C:/doit/*.py")
2) 다음 명령을 통해 실행한다.
C:/doit>python practice6_6.py
*여기서 뭐가 더 있을텐데 뭘 더 해야 하는지 잘 모르겠고, 코드 실행도 안 됨..!
이 문제 아예 못 푼 듯ㅠ
- 해설
1) sub_dir_search.py 파일을 작성한다.
# C:/doit/sub_dir_search.py
def search(dirname):
print (dirname)
search("c:/")
search 함수를 만들고 시작 디렉터리를 입력받도록 코드를 작성했다.
2) 이 디렉터리에 있는 파일을 검색할 수 있도록 소스를 변경한다.
# C:/doit/sub_dir_search.py
import os
def search(dirname):
filenames = os.listdir(dirname)
for filename in filenames:
full_filename = os.path.join(dirname, filename)
print(full_filename)
search("C:/")
os.listdir를 사용하면 해당 디렉터리에 있는 파일들의 리스트를 구할 수 있다.(파일 이름의 리스트)
경로를 포함한 파일 이름을 구하기 위해서는 입력으로 받은 dirname을 앞에 덧붙여 주어야 한다.
os 모듈에는 디렉터리와 파일 이름을 이어 주는 os.path.join 함수가 있으므로, 이 함수를 사용하면 디렉터리를 포함한 전체 경로를 쉽게 구할 수 있다.
위 코드를 수행하면 C:/ 디렉터리에 있는 파일이 출력된다.
c:/$Recycle.Bin
c:/$WINDOWS.~BT
c:/$Windows.~WS
c:/adb
c:/AMD
c:/android
c:/bootmgr
c:/BOOTNXT
… 생략 …
3) 디렉터리의 파일 중 확장자가 .py인 파일만을 출력하도록 코드를 변경한다.
import os
def search(dirname):
filenames = os.listdir(dirname)
for filename in filenames:
full_filename = os.path.join(dirname, filename)
ext = os.path.splitext(full_filename)[-1]
if ext == '.py':
print(full_filename)
search("C:/")
파일 이름에서 확장자만 추출하기 위해 os 모듈의 os.path.splitext 함수를 사용하였다.
os.path.splitext는 파일 이름을 확장자를 기준으로 두 부분으로 나누어 준다.
따라서 os.path.splitext(full_filename)[-1]은 해당 파일의 확장자 이름이 된다.
4) C:/ 디텍터리뿐만 아니라 하위 디렉터리도 검색이 가능하도록 다음과 같이 코드를 변경한다.
import os
def search(dirname):
try:
filenames = os.listdir(dirname)
for filename in filenames:
full_filename = os.path.join(dirname, filename)
if os.path.isdir(full_filename):
search(full_filename)
else:
ext = os.path.splitext(full_filename)[-1]
if ext == '.py':
print(full_filename)
except PermissionError:
pass
search("C:/")
try ... except PermissionError로 함수 전체를 감싼 이유는 os.listdir를 수행할 때 권한이 없는 디렉터리에 접근하더라도 프로그램이 오류로 종료되지 않고 그냥 수행되도록 하기 위해서이다.
full_filename이 디렉터리인지 파일인지 구별하기 위하여 os.path.isdir 함수를 사용하였고,
디렉터리일 경우 해당 경로를 입력받아 다시 search 함수를 호출하였다.
이렇게 해당 디렉터리의 파일이 디렉터리일 경우 다시 search 함수를 호출해 나가면(*재귀 호출)
해당 디렉터리의 하위 파일을 다시 검색하기 시작하므로 결국 모든 파일들을 검색할 수 있게 된다.
※ 재귀 호출이란 자기 자신을 다시 호출하는 프로그래밍 기법이다.
이 코드에서는 search 함수에서 다시 자기 자신인 search 함수를 호출하는 것이 바로 재귀 호출이다.
위 코드를 수행하면 C:/디렉터리에 있는 모든 파이썬 파일이 출력될 것이다.
*모르는 게 아주 많이 나왔다.... 다시 복습해야징
+ [하위 디렉터리 검색을 쉽게 해주는 os.walk]
os.walk는 시작 디렉터리부터 시작하여 그 하위 모든 디렉터리를 차례대로 방문하게 해주는 함수
import os
for (path, dir, files) in os.walk("c:/"):
for filename in files:
ext = os.path.splitext(filename)[-1]
if ext == '.py':
print("%s/%s" % (path, filename))
디렉터리와 파일을 검색하는 일반적인 경우라면 os.walk를 사용하기
'강의 > 점프투파이썬' 카테고리의 다른 글
[점프투파이썬] 4. 문서에 있는 탭(tab)을 공백(space)으로 바꾸기(sys.argv/replace) (2) | 2020.03.17 |
---|---|
[점프투파이썬] 3. 간단한 메모장 만들기(sys.argv) (0) | 2020.03.17 |
[점프투파이썬] 2. 게시판 페이징하기 (0) | 2020.03.17 |
[점프투파이썬] 1. 3의 배수와 5의 배수의 총합 구하기 (0) | 2020.03.17 |
댓글