:: python

python :: 파이썬 파일/폴더 복사 shutil copy, copy2, copyfile, copytree

토람이 2021. 6. 16. 11:42

파이썬 shutil 라이브러리에는 파일/폴더 복사와 관련된 여러 함수가 있다.
copy, copy2, copyfile, copytree
(copy2 라니.. 공식 라이브러리인데 너무 대충 만든거 아닌지ㅋㅋㅋ)

각각의 기능을 살펴보면

 

함수명 기능 사용방법
copy 파일을 복사한다 shutil.copy(src 파일 경로, dest 파일(or 폴더) 경로)
* dest 에 폴더 경로를 지정할 경우 src 파일명과 같은 파일 생성
copy2 파일을 복사한다 shutil.copy2(src 파일 경로, dest 파일(or 폴더) 경로)
* dest 에 폴더 경로를 지정할 경우 src 파일명과 같은 파일 생성
copyfile 파일을 복사한다 shutil.copyfile(src 파일 경로, dest 파일 경로)
copytree 폴더를 통째로 복사한다 shutil.copytree(src 폴더 경로, dest 폴더 경로)
* dest 폴더 경로가 이미 존재하는 경우 에러 발생


언뜻 봐서는 copy, copy2, copyfile 이 왜 나뉘어 있는지 잘 모르겠어서
shutil 라이브러리 문서를 파보았다.

 

 

** copy, copy2, copyfile 의 차이점

함수명 기능 비고 공통점
copyfile 파일 복사(copyfile)   원본 파일(src) 과 대상 파일(dest) 이 같으면 에러 발생
copy 1) 파일 복사(copyfile)
+
2) 파일 권한 복사(copymode)
* 파일 권한
: 파일 읽기, 쓰기 등의 권한
(리눅스 chmod 개념)
copy2 1) 파일 복사(copyfile)
+
2) 파일 메타데이터 복사(copystat)
* 파일 메타데이터
: 파일 권한, 최근 접근 날짜, 최근 수정한 날짜 등


copy 는 copyfile 을 하고 난 후 권한까지 복사하는 개념,
copy2 는 copyfile 을 하고 난 후 메타데이터까지 복사하는 개념이고

copyfile < copy < copy2
오른쪽으로 갈수록 포괄적인 개념이다.

위 내용을 참고해서 상황에 맞는 함수를 골라 사용하면 될 것 같다. :)


그런데 여기서 한 가지,
위 copy 관련 함수들은 원본파일(src) 이 존재하는지 따로 체크하는 로직이 없어 보였다.
즉, 존재하지 않는 파일을 복사하려 하면 에러가 날 것.

 

import os 
import shutil 

if os.path.exists(src): 
    # src 존재하면 True
    shutil.copy(src, dst)


그래서 위 함수들을 사용할 때
이렇게 파일 존재 여부를 체크하는 조건문을 넣어주면 된다. :D

300x250