Python 파일 복사 완벽 가이드|shutil 모듈 사용법과 예외 처리

1. 들어가며

Python은 파일 작업을 손쉽게 수행할 수 있는 강력한 도구를 제공합니다. 그중에서도 파일 복사는 일상적인 작업 중 하나입니다. 이번 글에서는 Python의 표준 라이브러리인 shutil 모듈을 사용해 파일과 디렉터리를 효율적으로 복사하는 방법을 소개합니다. 구체적인 코드 예제와 함께, 덮어쓰기를 방지하는 기법과 오류 처리, 나아가 응용적인 파일 복사 방법도 다룹니다。

2. Python에서 파일을 복사하기 위한 준비

shutil 모듈 임포트

shutil 모듈은 Python 표준 라이브러리로, 추가 설치가 필요 없습니다. 다음 코드로 임포트합니다。
import shutil
파일 복사, 이동, 삭제와 같은 작업을 수행할 수 있습니다. 또한, os 모듈과 조합하면 파일이나 디렉터리의 존재 여부를 확인하고, 오류 처리를 강화할 수 있습니다。

shutil 모듈의 장점

shutil 모듈은 직관적인 사용법과 간결한 코드 구조가 특징입니다. 특히, 파일이나 디렉터리 전체의 일괄 처리가 필요한 경우, shutil은 강력한 도구가 됩니다。

3. shutil 모듈의 기본적인 사용 방법

shutil.copy()의 사용법

shutil.copy()는 파일을 복사할 때 사용하는 기본적인 함수입니다. 이 함수는 원본 파일을 지정한 새 위치로 복사합니다。
import shutil

# 파일 복사
shutil.copy('original.txt', 'copy.txt')
복사 대상에 동일한 이름의 파일이 존재하는 경우, 덮어쓰게 됩니다。

shutil.copy2()의 사용법

shutil.copy2()는 파일의 메타데이터(생성 일시, 접근 권한 등)까지 포함하여 복사하는 함수입니다。
import shutil

# 파일 내용과 메타데이터를 복사
shutil.copy2('original.txt', 'copy_with_metadata.txt')
파일의 완전한 복제본을 만들 때 유용합니다。

4. 디렉터리 전체를 복사하는 방법

shutil.copytree()의 사용 방법

shutil.copytree()는 디렉터리 전체를 재귀적으로 복사하기 위한 함수입니다. 원본 디렉터리 내의 모든 파일과 하위 디렉터리를 새 위치로 복사합니다.
import shutil

# 디렉터리 복사
shutil.copytree('source_directory', 'destination_directory')
다만, 복사 대상에 동일한 이름의 디렉터리가 존재하면 오류가 발생하므로 사전에 확인해야 합니다。

복사 시 무시할 파일이나 디렉터리 지정

특정 파일이나 디렉터리를 복사 대상에서 제외하려면 ignore 매개변수에 shutil.ignore_patterns()를 사용합니다。
import shutil

# .log 파일을 무시하고 복사
shutil.copytree('source_directory', 'destination_directory', ignore=shutil.ignore_patterns('*.log'))
이 코드는 .log 파일을 제외하고 디렉터리 전체를 복사합니다。
年収訴求

5. 덮어쓰기를 방지하는 방법

os.path.exists()를 사용하기

shutil.copy()shutil.copy2()를 사용하면, 동일한 이름의 파일이 존재하는 경우 기본적으로 덮어써집니다. 이를 방지하려면 파일의 존재 여부를 사전에 확인해야 합니다。
import shutil
import os

# 덮어쓰기를 방지하기 위한 파일 존재 확인
if not os.path.exists('copy.txt'):
    shutil.copy('original.txt', 'copy.txt')
else:
    print('파일은 이미 존재합니다. 복사를 건너뜁니다.')

pathlib.Path.exists()를 사용하기

pathlib을 사용하면, 파일 존재 확인을 보다 직관적으로 수행할 수 있습니다。
from pathlib import Path

# Path 객체로 존재 여부 확인
dst = Path('copy.txt')

if not dst.exists():
    shutil.copy('original.txt', dst)
else:
    print('파일은 이미 존재합니다. 복사를 건너뜁니다.')

6. Python에서 파일을 이동하는 방법

shutil.move()의 사용법

shutil.move()는 파일이나 디렉터리를 다른 위치로 이동하기 위한 함수입니다。
import shutil

# 파일 이동
shutil.move('original.txt', 'new_folder/original.txt')
목적지 디렉터리가 존재하지 않으면 FileNotFoundError가 발생하므로, 미리 디렉터리 존재 여부를 확인하고 필요에 따라 생성하는 것이 권장됩니다。
import shutil
import os

# 디렉터리 존재 확인 및 생성
if not os.path.exists('new_folder'):
    os.makedirs('new_folder')

# 파일 이동
shutil.move('original.txt', 'new_folder/original.txt')

7. Python에서 파일 복사 예제 코드

파일을 복사하는 예제

import shutil

# 파일 복사
shutil.copy('data.txt', 'backup/data_backup.txt')

디렉터리 전체를 복사하는 예제

import shutil

# 디렉터리 복사
shutil.copytree('project_files', 'project_backup')

덮어쓰기를 방지하기 위한 예제

import shutil
import os

# 덮어쓰지 않도록 복사
if not os.path.exists('backup/report.txt'):
    shutil.copy('report.txt', 'backup/report.txt')
else:
    print('파일이 이미 존재합니다. 복사를 중지합니다.')

8. 응용편: 특정 파일 형식만 복사하는 방법

glob 모듈을 사용하면, 특정 파일 형식(예를 들어.txt.csv)만 선택적으로 복사할 수 있습니다。
import shutil
import glob

# .txt 파일을 모두 복사
for file in glob.glob('data/*.txt'):
    shutil.copy(file, 'backup/')
이렇게 하면 data 폴더 내의 모든 .txt 파일을 backup 폴더에 복사합니다。

9. 오류 처리와 예외 처리

파일 작업 중 발생할 수 있는 오류에 대해 예외 처리를 하는 것은 매우 중요합니다. 예를 들어, 파일을 찾을 수 없거나 권한 오류가 발생할 수 있습니다。

기본적인 예외 처리 추가

import shutil

try:
    shutil.copy('non_existent_file.txt', 'backup/')
except FileNotFoundError as e:
    print(f'파일을 찾을 수 없습니다: {e}')
except PermissionError as e:
    print(f'권한 오류가 발생했습니다: {e}')
except Exception as e:
    print(f'예기치 않은 오류가 발생했습니다: {e}')
이 코드에서는 특정 오류를 캐치하여 그에 맞는 처리를 수행합니다。

10. 정리

Python의 shutil 모듈을 사용하면 파일과 디렉터리 복사를 쉽게 수행할 수 있습니다. 덮어쓰기를 방지하는 기법, 특정 파일만 복사하는 방법, 나아가 오류 처리를 추가하면 파일 작업을 더욱 안전하고 효율적으로 수행할 수 있습니다. 이 글을 참고하여 일상적인 작업에서 Python으로 파일 복사를 활용해 보세요.
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール