List
- 파이썬 프로그램
- gugudan
- 3과 5의배수 합하기
- 게시판 페이징
- 간단한 메모장 생성**
- 탭을 4개의 공백으로 바꾸기
- 하위 디렉터리 검색하기
- 파이보
- 코딩도장
파이썬 파일(*.py)
만 출력해 주는 프로그램을 만들어보자search 함수
를 만들고 시작 디렉터리를 입력받도록 코드를 작성# sub_dir_search.py
def search(dirname):
print (dirname)
search("/Users/shinisgood/Desktop/pythonprac") # 서치할 디렉터리를 넣어준다
첨보는 함수
os.listdir(디렉터리)
: 입력된 디렉터리에 있는 파일들의 리스트를 구할 수 있다.import os ` def search(dirname): filenames = os.listdir(dirname) print (filenames) ` search("/Users/shinisgood/Desktop/pythonprac")
['.DS_Store', 'sub_dir_search.py', 'memo.py', 'a.txt', 'memo.txt', 'tabto4.py']
os.path.join(디렉터리, 파일 이름)
: 디렉터리와 파일 이름을 이어주는 함수이며, 디렉터리를 포함한 전체 경로를 쉽게 구할 수 있다.
# 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("/Users/shinisgood/Desktop/pythonprac")
/Users/shinisgood/Desktop/pythonprac/.DS_Store
/Users/shinisgood/Desktop/pythonprac/sub_dir_search.py
/Users/shinisgood/Desktop/pythonprac/memo.py
/Users/shinisgood/Desktop/pythonprac/a.txt
/Users/shinisgood/Desktop/pythonprac/memo.txt
/Users/shinisgood/Desktop/pythonprac/tabto4.py
첨보는 함수
os.path.splitext()
: 파일 이름을 확장자를 기준으로 두 부분으로 나누어 준다
'디렉터리 경로와 파일이름'
'확장자'
로 나뉜다# sub_dir_search.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) # '디렉터리&파일이름' / '확장자' 로 스플릿해라 print (ext) ` search("/Users/shinisgood/Desktop/pythonprac")
('/Users/shinisgood/Desktop/pythonprac/.DS_Store', '') ('/Users/shinisgood/Desktop/pythonprac/sub_dir_search', '.py') ('/Users/shinisgood/Desktop/pythonprac/memo', '.py') ('/Users/shinisgood/Desktop/pythonprac/a', '.txt') ('/Users/shinisgood/Desktop/pythonprac/memo', '.txt') ('/Users/shinisgood/Desktop/pythonprac/tabto4', '.py')
'확장자'
만 가지고 오기
os.path.splitext()[-1]
함수 뒤[-1]
붙혀라# sub_dir_search.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] # 확장자 이름만 가지고 오기 위해서 print (ext) ` search("/Users/shinisgood/Desktop/pythonprac")
.py .py .txt .txt .py
/Users/shinisgood/Desktop/pythonprac
에서 확장자가 .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': # 확장자 중 .py파일만 가지고 오도록 지정
print(full_filename) # print(ext)를 입력하면 확장자 이름만 가지고온다.
search("/Users/shinisgood/Desktop/pythonprac`")
/Users/shinisgood/Desktop/pythonprac/sub_dir_search.py
/Users/shinisgood/Desktop/pythonprac/memo.py
/Users/shinisgood/Desktop/pythonprac/tabto4.py
첨보는 함수
os.path.isdir(full_filename)
: 입력된 값(full_filename)
이 디렉터리인지 파일인지 구별할 수 있게 해준다.
- 디렉터리가 맞으면
True
출력>>> import os >>> os.path.isdir("/Users/shinisgood/Desktop/pythonprac") True
/Users/shinisgood/Desktop/pythonprac
뿐 아니라 하위 디렉터리(sub directory)까지 파일을 서치할 수 있도록 해보자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): # pythonprac 디렉터리 안에있는 파일은 "디렉터리 경로/파일이름.확장자"으로 출력되기 때문에 False 이다. 하지만 pythonprac안에있는 pythonprac2 디렉터리는 "디렉터리 경로"로만 출력되기 때문에 True이다(왜냐면 뭔 파일이 아니니께).
search(full_filename) # True인 pythonprac2 디렉터리를 다시 서치한다(재귀 호출).
else:
ext = os.path.splitext(full_filename)[-1] # False 인 pythonprac 디렉터리 안에있는 파일들을 확장자만 표시하고
if ext == '.py': # 확장자 중 ".py"파일 확장자만 가져와서 출력하도록 한다.
print(full_filename)
except PermissionError:
pass
search("/Users/shinisgood/Desktop/pythonprac`")
try ...
except PermissionError
를 사용한 이유
os.listdir()
를 수행할 때 권한이 없는 디렉터리에 접근하더라도 프로그램이 오류로 종료되지 않고 그냥 수행되도록 하기 위해서이다.
Summary
재귀호출 활용 하는걸 잘 이해해야하고,
os 함수
들을 잘 기억하장사용된 주요 코드
search(디렉터리)
os.listdir(디렉터리)
os.path.splitext()[-1]
os.path.isdir(full_filename)
try ...
except 오류코드
첨보는 함수
os.walk
: 시작 디렉터리부터 시작하여 그 하위 모든 디렉터리를 차례대로 방문하게 해주는 함수import os ` for (path, dir, files) in os.walk("/Users/shinisgood/Desktop/pythonprac"): print("%s/%s/%s" % (path, dir,files))
/Users/shinisgood/Desktop/pythonprac/['pythonprac2']/['.DS_Store', 'sub_dir_search.py', 'memo.py', 'a.txt', 'memo.txt'] /Users/shinisgood/Desktop/pythonprac/pythonprac2/[]/['.DS_Store', 'tabto4.py']
import os
for (path, dir, files) in os.walk("/Users/shinisgood/Desktop/pythonprac/pythonprac2"):
for filename in files: # pythonprac과 하위폴더 내 모든파일의 이름을 하나씩 불러오자
ext = os.path.splitext(filename)[-1] # 파일 이름과 확장자로 나누자
if ext == '.py':
print("%s/%s" % (path, filename)) # ".py"인 파일을 "경로/파일이름"으로 출력
참고
path
: 현재 디렉터리 경로dir
: 현재 디렉터리 내 폴더(디렉터리)files
: 파일명