들어가며..
Python 내장 API, os와 shutil을 사용하여 디렉토리 생성부터 파일 생성, 카피까지 다루어본다.
디렉토리 생성/삭제
os 패키지를 사용하여 디렉토리 생성/삭제 처리
import os
root_dir = 'C:/python_test'
os.mkdir(root_dir)
os.mkdir은 하위디렉토리 생성 불가, os.makedirs로 생성
os.mkdir('C:/A/B/C') # Fail
os.makedirs('C:/A/B/C') # Success
위 root_dir 디렉토리가 정상 생성되었는지 os.path.isdir 로 확인
os.path.isdir(root_dir) # True
# 디렉토리 삭제
os.rmdir(root_dir)
# 삭제 후 디렉토리 확인
os.path.isdir(root_dir) # False
파일생성
위에서 실습한 내용을 활용하여 아래 구조의 디렉토리 생성
python_exam/
A/
read.txt
A-1/
A-1-A.txt
A-1-B.txt
A-1-1/
B/
import os
from os.path import join
root_dir = join('C:/', 'python_exam')
if os.path.isdir(root_dir) == False:
os.mkdir(root_dir)
subdirs = [join(root_dir, 'A/A-1/A-1-1'), join(root_dir, 'B')]
for _d in subdirs:
if os.path.isdir(_d) == False:
os.makedirs(_d)
생성하려는 디렉토리가 존재하지 않는 경우만 생성한다. ( 반복 실행시 용이 ) 실행 후 디렉토리 생성결과 확인
이제 파일을 각 디렉토리에 생성해보자.
# 위 코드 이어서..
with open(join(root_dir, 'A', 'read.txt'), 'w') as w:
w.write("read.txt")
with open(join(root_dir, 'A/A-1/A-1-A.txt'), 'w') as w:
w.write('A-1-A.txt')
with open(join(root_dir, 'A/A-1/A-1-B.txt'), 'w') as w:
w.write('A-1-B.txt')
파일 복사( copy )
from os import listdir, path, sep, walk
from shutil import copyfile, copy2
buffer_size = 1024
source_path = "C:/python_exam/A"
target_path = "C:/python_exam/B"
# source_path 내에 파일을 추출한다. ( 모든 파일 아님 !! )
files = [f for f in listdir(source_path) if path.isfile(path.join(source_path, f))]
print(files)
# source_path 내에 모든 파일을 추출한다.
all_sub_files = []
for (dir_path, dir_names, file_names) in walk(source_path):
all_sub_files.extend(file_names)
print(all_sub_files)
for f in files:
source_obj = source_path + sep + f
# source_path 에 있는 파일을 target_path에 복사
with open(source_obj, 'rb') as src, open(target_path + sep + 'copied_file.txt', 'wb') as dst:
while True:
buff = src.read(buffer_size)
if not buff:
break
dst.write(buff)
# source_path 에 있는 파일을 target_path에 복사
# copyfile(source_obj, dst=target_path) # Fail
copy2(source_obj, dst=target_path)
copy2(source_obj, dst=target_path + sep + 'copied_file.txt') # 파일이름도 역시 가능하다.
os.walk를 사용하여 인자로 주어진 디렉토리부터 하위의 모든 디렉토리, 파일을 검색할 수 있다.
open으로 복사할 원본파일과 대상파일을 연다. buffer 사이즈(1024)만큼 파일내용을 읽고 대상파일에 쓴다.
shutil을 사용하면 파일 복사를 더욱 쉽게 처리 할 수 있다.
copyfile은 dst (대상) 인자에 파일명까지 모두 기술해야 한다. copyfile 실행 시 아래 오류 발생.
Traceback (most recent call last):
File "c:\src\python\handle_file.py", line 25, in <module>
copyfile(source_obj, dst=target_path)
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\shutil.py", line 261, in copyfile
with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
PermissionError: [Errno 13] Permission denied: 'C:/python_exam/B'
copy2는 디렉토리만 기술하면 원본 파일명과 동일한 이름으로 해당 디렉토리에 파일을 생성한다.
shutil 패키지에서 자주 사용되는 api별 차이점은 아래와 같다.
반응형
'python' 카테고리의 다른 글
pip install error - after connection broken by 'ProxyError (0) | 2021.01.20 |
---|---|
Python - 람다표현식 이해와 예제 ( Understanding Lambda expression ) (0) | 2021.01.19 |
RuntimeError: The current Numpy installation fails to pass a sanity check due to a bug in the windows runtime. (0) | 2020.12.20 |
Python - XML 파싱 오류 해결 ( xml.etree.ElementTree.ParseError ) (1) | 2020.12.07 |
python - 타입 비교, 이런방식도 있었어? (0) | 2020.03.24 |