Python을 이용한 폴더 전체 복사 방법

Python을 이용한 폴더 전체 복사 방법

Python
Python을 이용한 폴더 전체 복사 방법
Author

gabriel yang

Published

September 30, 2024


Python은 파일 및 폴더 작업을 손쉽게 처리할 수 있는 강력한 표준 라이브러리를 제공합니다. 특히, 폴더 전체를 복사하는 기능은 파일 관리를 자동화하는 데 유용합니다. 이번 글에서는 Python의 shutil 모듈을 사용하여 폴더 전체를 복사하는 방법에 대해 알아보겠습니다.

1. shutil 모듈 소개

Python의 shutil 모듈은 파일 및 디렉토리 작업을 위한 여러 유용한 함수들을 제공합니다. 특히, 디렉토리 복사와 관련된 함수로는 copytree()가 있는데, 이 함수는 폴더와 그 안의 파일 및 하위 디렉토리까지 모두 복사할 수 있습니다.

2. shutil.copytree() 함수 사용법

shutil.copytree() 함수는 소스 폴더의 모든 내용을 대상 폴더로 복사합니다. 이 함수는 재귀적으로 동작하며, 원본 폴더의 하위 디렉토리와 파일을 그대로 복사해 줍니다.

사용법

import shutil

# 소스 폴더와 대상 폴더 경로 설정
src = '/path/to/source/folder'
dst = '/path/to/destination/folder'

# 폴더 복사
shutil.copytree(src, dst)

위 코드에서 src는 복사할 원본 폴더의 경로이고, dst는 복사될 대상 폴더의 경로입니다. 만약 대상 폴더가 이미 존재하면 오류가 발생하므로, 대상 폴더가 존재하지 않는지 확인해야 합니다.

예시

다음은 “example” 폴더를 “example_backup” 폴더로 복사하는 예시입니다.

import shutil

# 원본 폴더와 대상 폴더 경로
src = 'example'
dst = 'example_backup'

# 폴더 전체 복사
shutil.copytree(src, dst)

print(f"폴더 '{src}'가 '{dst}'로 성공적으로 복사되었습니다.")

3. 복사 과정에서 발생할 수 있는 오류 처리

대상 폴더가 이미 존재하거나 경로가 잘못되었을 때, copytree() 함수는 오류를 발생시킵니다.

File /usr/lib/python3.8/os.py:223, in makedirs(name, mode, exist_ok)
    221         return
    222 try:
--> 223     mkdir(name, mode)
...
    225     # Cannot rely on checking for EEXIST, since the operating system
    226     # could give priority to other errors like EACCES or EROFS
    227     if not exist_ok or not path.isdir(name):

FileExistsError: [Errno 17] File exists: './example_backup'

이를 방지하거나 오류를 처리하기 위해 try-except 구문을 사용할 수 있습니다.

예시: 오류 처리 추가

import shutil
import os

src = 'example'
dst = 'example_backup'

try:
    # 폴더가 이미 있는지 확인
    if os.path.exists(dst):
        raise FileExistsError(f"대상 폴더 '{dst}'가 이미 존재합니다.")

    # 폴더 복사
    shutil.copytree(src, dst)
    print(f"폴더 '{src}'가 '{dst}'로 성공적으로 복사되었습니다.")

except FileExistsError as e:
    print(e)
except FileNotFoundError as e:
    print(f"원본 폴더 '{src}'를 찾을 수 없습니다.")
except Exception as e:
    print(f"복사 중 오류 발생: {e}")

이 예시에서는 대상 폴더가 이미 존재할 때 FileExistsError 예외를 발생시키고, 원본 폴더가 없을 경우 FileNotFoundError를 처리합니다. 그 외의 오류는 Exception으로 잡아 복사 도중 발생할 수 있는 다양한 예외를 처리할 수 있습니다.

4. 특정 파일 형식만 복사하고 싶을 때

만약 특정 파일 형식만 복사하고 싶다면, shutil.copytree() 함수에 ignore 파라미터를 사용할 수 있습니다. ignore_patterns() 함수를 사용하면 원하는 패턴의 파일을 무시할 수 있습니다.

예시: 특정 파일 형식을 제외하고 복사

import shutil
from shutil import ignore_patterns

src = 'example'
dst = 'example_backup'

# .txt 파일을 제외하고 복사
shutil.copytree(src, dst, ignore=ignore_patterns('*.txt'))

print(f"폴더 '{src}'가 '{dst}'로 복사되었으며, .txt 파일은 제외되었습니다.")

이 코드는 .txt 파일을 제외하고 폴더를 복사합니다. 이처럼 ignore_patterns() 함수를 활용하면 복사 시 제외할 파일 형식을 지정할 수 있습니다.

5. 대상 폴더가 이미 있을 때 복사하는 방법

대상 폴더가 이미 존재하는 경우, 기본적으로 copytree()는 오류를 발생시키지만, 필요하다면 파일을 덮어쓰거나 합치는 방식으로 복사할 수 있습니다. 이 경우, copytree() 대신 shutil.copy2()os.makedirs()를 사용하여 직접 구현할 수 있습니다.

예시: 대상 폴더가 이미 있을 때 복사

import os
import shutil

def copy_folder(src, dst):
    # 대상 폴더가 없으면 생성
    if not os.path.exists(dst):
        os.makedirs(dst)

    # 원본 폴더의 모든 파일 및 하위 디렉토리 복사
    for item in os.listdir(src):
        src_path = os.path.join(src, item)
        dst_path = os.path.join(dst, item)

        if os.path.isdir(src_path):
            copy_folder(src_path, dst_path)  # 재귀적으로 하위 디렉토리 복사
        else:
            shutil.copy2(src_path, dst_path)  # 파일 복사

src = 'example'
dst = 'example_backup'

copy_folder(src, dst)

print(f"폴더 '{src}'가 '{dst}'로 성공적으로 복사되었습니다.")

이 방식은 대상 폴더가 이미 존재하더라도 폴더를 덮어쓰지 않고 파일을 추가하는 방식으로 동작합니다.