본문 바로가기
python

Python - 초간단 디렉토리 및 파일 생성, 복사하기 !

by 맑은안개 2021. 1. 11.

들어가며..

  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별 차이점은 아래와 같다. 

출처 - stack overflow

 

반응형