-
python_shutil : 고수준 파일 연산Python study/문법공부 2022. 10. 7. 10:44
shutil 모듈은 파일과 파일 모음에 대한 여러 가지 고수준 연산을 제공합니다. 특히, 파일 복사와 삭제를 지원하는 함수가 제공됩니다
디렉터리와 파일 연산
shutil.copyfileobj(fsrc, fdst[, length])
파일류 객체 fsrc의 내용을 파일류 객체 fdst에 복사합니다. 주어지면, 정수 length는 버퍼 크기입니다. 특히, 음의 length 값은 *1)청크 단위로 소스 데이터를 반복하지 않고 데이터를 복사하는 것을 의미합니다; 기본적으로 제어되지 않은 메모리 소비를 피하고자 데이터를 청크로 읽습니다. fsrc 객체의 현재 파일 위치가 0이 아니면, 현재 파일 위치에서 파일 끝까지의 내용만 복사됨에 유의하십시오
copyfileobj copyfile 함수에서 copyfileobj를 호출 파이썬을 활용해서 파일을 복사할 때 shutil 라이브러리의 copy, copyfile 등의 함수를 많이 사용하는데
파일 복사 속도가 느린편이다.
그런데 shutil 라이브러리 파일에서 copy 함수들을 보면 궁극적으로 copyfileobj 함수를 호출하게 되어있다.
여기서 주목 할점은 parameter 중 length 입니다.
length 는 청크단위(chunk size) 로 buffer 입니다. 따라서 파일 복사 속도를 개선하고 싶다면 이부분을 수정하면 됩니다.
수정 방법은 라이브러리 파일(shutil.py) 에서 직접 copyfileobj함수를 수정하는 것과 코드 내에서 사용자 함수를 선언하여 copyfileobj를 override 하는 것입니다.
필자는 라이브러리 파일을 직접 수정하는 것을 추천하지 않고 override 하는 것을 추천합니다.
shutil.copyfileobj 를 override 출처: https://toramko.tistory.com/ *1)청크단위(chunk size): Chunk란 아이템이 트랜잭션에 commit되는 수를 말합니다.
Parameter Description fsrc 파일류객체(source) fsdc 파일류객체(destination) length Chuck size, 버퍼 사이즈 shutil.copyfile(src, dst, *, follow_symlinks=True)
shutil.copyfile() 가능한 가장 효율적인 방법으로 이름이 src 인 파일의 내용을 (메타 데이터 없이) 이름이 dst 인 파일에 복사하고 dst를 반환합니다. src와 dst는 경로류 객체나 문자열로 지정된 경로 이름입니다.
dst는 완전한 대상 파일 이름이어야 합니다; 대상 디렉터리 경로를 허용하는 복사는 copy()를 참조하십시오. src와 dst가 같은 파일을 지정하면, SameFileError가 발생합니다.
대상 위치는 쓰기 가능해야 합니다; 그렇지 않으면, OSError 예외가 발생합니다. dst가 이미 존재하면, 교체됩니다. 문자나 블록 장치 및 파이프와 같은 특수 파일은 이 함수로 복사할 수 없습니다.
follow_symlinks가 거짓이고 src가 *1)심볼릭 링크이면, src가 가리키는 파일을 복사하는 대신 새 심볼릭 링크가 만들어집니다.
- exception shutil.SameFileError
이 예외는 copyfile()의 소스와 대상이 같은 파일일 때 발생합니다.
*1) 심볼릭 링크(Symbolic link): 컴퓨팅에서 심볼릭 링크(symbolic link) 또는 기호화된 링크는 절대 경로 또는 상대 경로의 형태로 된 다른 파일이나 디렉터리에 대한 참조를 포함하고 있는 특별한 종류의 파일이다.
버전이력
버전 3.4에서 변경: Error 대신 SameFileError를 발생시킵니다. 후자는 전자의 서브 클래스라서, 이 변경은 이전 버전과 호환됩니다.
버전 3.8에서 변경: 파일을 더 효율적으로 복사하기 위해 플랫폼별 빠른 복사(fast-copy) 시스템 호출을 내부적으로 사용할 수 있습니다. 플랫폼 의존적 효율적인 복사 연산 섹션을 참조하십시오.
Parameter Description fsrc 파일류객체(source) fsdc 파일류객체(destination) follow_symlinks 심볼릭 링크 옵션 shutil.copymode(src, dst, *, follow_symlinks=True)
shutil.copymode src에서 dst로 권한 비트를 복사합니다. 파일 내용, 소유자 및 그룹은 영향을 받지 않습니다. src와 dst는 경로류 객체나 문자열로 지정된 경로 이름입니다. follow_symlinks가 거짓이고 src와 dst가 모두 심볼릭 링크이면, copymode()는 (가리키는 파일이 아니라) dst 자체의 모드를 수정하려고 시도합니다. 이 기능이 모든 플랫폼에서 사용 가능한 것은 아닙니다; 자세한 내용은 copystat()을 참조하십시오. copymode()가 로컬 플랫폼에서 심볼릭 링크를 수정할 수 없고, 그렇게 하도록 요청받으면, 아무것도 하지 않고 반환합니다.
리눅스 OS에서 사용 할 수 있습니다.
shutil.copystat(src, dst, *, follow_symlinks=True)
shutil.copystat 권한 비트, 마지막 액세스 시간, 마지막 수정 시간 및 플래그를 src에서 dst로 복사합니다. 리눅스에서 copystat()은 가능하면 *1)확장 어트리뷰트(extended attributes)도 복사합니다. 파일 내용, 소유자 및 그룹은 영향을 받지 않습니다. src와 dst는 경로류 객체나 문자열로 지정된 경로 이름입니다.
follow_symlinks가 거짓이고 src와 dst가 모두 심볼릭 링크를 참조하면, copystat()은 심볼릭 링크가 참조하는 파일이 아닌 심볼릭 링크 자체에 대해 작동합니다 - src 심볼릭 링크에서 정보를 읽고, dst 심볼릭 링크로 정보를 씁니다.
Parameter Description fsrc 파일류객체(source) fsdc 파일류객체(destination) follow_symlinks 심볼릭 링크 옵션 *1)확장 어트리뷰트(extended attributes): 사용자정의 파일특성
참고 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jalaint&logNo=150140475588
Extended File Attributes (xattr)
참조 : http://en.wikipedia.org/wiki/Extended_file_attributes 참조 : http://skyul.tistory.com/63 우...
blog.naver.com
shutil.copy(src, dst, *, follow_symlinks=True)
shutil.copy 파일 src를 파일 또는 디렉토리 dst에 복사합니다. src 및 dst는 경로와 유사한 객체 또는 문자열이어야 합니다. dst가 디렉토리를 지정하면 파일은 src의 기본 파일 이름을 사용하여 dst로 복사됩니다. dst가 이미 존재하는 파일을 지정하면 대체됩니다. 새로 생성된 파일의 경로(dst)를 반환합니다.
follow_symlinks가 거짓이고, src가 심볼릭 링크이면, dst는 심볼릭 링크로 만들어집니다. follow_symlinks가 참이고 src가 심볼릭 링크이면, dst는 src가 참조하는 파일의 사본이 됩니다.
copy()는 파일 데이터와 파일의 권한 모드(os.chmod()를 참조하십시오)를 복사합니다. 파일의 생성과 수정 시간과 같은 다른 메타 데이터는 유지되지 않습니다. 원본의 모든 파일 메타 데이터를 유지하려면 대신 copy2()를 사용하십시오.
Parameter Description fsrc 파일류객체(source) fsdc 파일류객체(destination) follow_symlinks 심볼릭 링크 옵션 shutil.copy2(src, dst, *, follow_symlinks=True)
shutil.copy2 copy2()가 파일 메타 데이터 보존도 시도한다는 점을 제외하고는 copy()와 동일합니다.
shutil.ignore_patterns(*patterns)
shutil.ignore_patterns 이 팩토리 함수는 copytree()의 ignore 인자를 위한 콜러블 함수로 사용할 수 있는 함수를 만드는데, 제공된 *1)glob 스타일 patterns 중 하나와 일치하는 파일과 디렉터리를 무시하도록 합니다.
*1)glob 스타일 : 패턴은 와일드카드 문자를 사용해서 일정한 패턴을 가진 파일 이름들을 지정하기 위한 패턴입니다.
자주 쓰이는 패턴. 출처:https://velog.io/@k7120792 shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False)
src에 뿌리를 둔 전체 디렉토리 트리를 dst라는 디렉토리에 재귀적으로 복사하고 대상 디렉토리를 반환합니다. dst를 포함하는 데 필요한 모든 중간 디렉토리도 기본적으로 생성됩니다.
디렉터리의 권한과 시간은 copystat()으로 복사되고, 개별 파일은 copy2()를 사용하여 복사됩니다.
symlinks가 참이면, 소스 트리의 심볼릭 링크가 새 트리에서 심볼릭 링크로 표시되고 플랫폼이 허용하는 한 원래 링크의 메타 데이터가 복사됩니다; 거짓이거나 생략되면, 링크된 파일의 내용과 메타 데이터가 새 트리에 복사됩니다.
symlinks가 거짓이면, 심볼릭 링크가 가리키는 파일이 존재하지 않으면, 복사 과정 종료 시 발생하는 Error 예외의 에러 리스트에 예외가 추가됩니다. 이 예외를 침묵시키려면 선택적 ignore_dangling_symlinks 플래그를 참으로 설정할 수 있습니다. 이 옵션은 os.symlink()를 지원하지 않는 플랫폼에는 영향을 미치지 않음에 주목하십시오.
ignore가 주어지면, copytree()가 방문하는 디렉터리와 os.listdir()가 반환한 이 디렉터리 내용의 리스트를 인자로 수신하는 콜러블 이어야 합니다. copytree()는 재귀적으로 호출되기 때문에, 복사되는 디렉터리마다 ignore 콜러블이 한 번 호출됩니다. 콜러블은 현재 디렉터리에 상대적인 디렉터리와 파일 이름의 시퀀스를 반환해야 합니다 (즉, 두 번째 인자에 있는 항목의 부분집합); 이 이름들은 복사 과정에서 무시됩니다. ignore_patterns()를 사용하여 glob 스타일 패턴을 기반으로 이름을 무시하는 콜러블을 만들 수 있습니다.
예외가 발생하면, 이유 리스트와 함께 Error가 발생합니다.
dirs_exist_ok가 false(기본값)이고 dst가 이미 존재하는 경우 FileExistsError가 발생합니다. dirs_exist_ok가 true인 경우 기존 디렉토리를 만나면 복사 작업이 계속되고 src 트리의 해당 파일이 dst 트리 내의 파일을 덮어씁니다.
Parameter Description src
파일류객체(source) dst
파일류객체(destination) symlinks
심볼릭 링크 옵션 ignore
ignore_pattern 함수 사용 옵션 default= False copy_function
개별 파일 복사 함수 지정 ignore_dangling_symlinks
심볼릭 링크 error 침묵 옵션 dirs_exist_ok
기존 디렉토리 존재시 덮어쓰기 옵션 src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False
shutil.rmtree(path, ignore_errors=False, onerror=None)
- rmtree.avoids_symlink_attacks
shutil.rmtree 전체 디렉터리 트리를 삭제합니다; path는 디렉터리를 가리켜야 합니다 (하지만 디렉터리에 대한 심볼릭 링크는 아닙니다). ignore_errors가 참이면, 삭제 실패로 인한 에러는 무시됩니다; 거짓이거나 생략되면, 이러한 에러는 onerror로 지정된 처리기를 호출하여 처리하거나, 생략하면 예외가 발생합니다
onerror가 제공되면, 세 가지 매개 변수를 받아들이는 콜러블 이어야 합니다: function, path 및 excinfo.
첫 번째 매개 변수 function은 예외를 발생시킨 함수입니다; 플랫폼과 구현에 따라 다릅니다. 두 번째 매개 변수 path는 function에 전달된 경로 이름입니다. 세 번째 매개 변수 excinfo는 sys.exc_info()가 반환한 예외 정보입니다. onerror에 의해 발생한 예외는 포착되지 않습니다.
Parameter Description path 삭제 대상 디렉토리 ignore_errors 오류 발생시 침묵 옵션 onerror 오류 발생시 처리기 호출 설정 onerror 처리기 호출 설정 예제 참고 : https://bryan7.tistory.com/277
[python] Directory Tree 삭제하기
python 에서 하위 디렉터리까지 한꺼번에 삭제를 하기 위한 스크립트. shutil.rmtree() 메서드를 호출할 때, ignore_errors=True 로 하면 파일이 사용 중이라서 삭제를 못했을 때도 에러 메시지가 표시가 되
bryan7.tistory.com
shutil.disk_usage(path)
shutil.disk_usage 지정된 경로(path)에 대한 디스크 사용량 통계를 total, used 및 free 어트리뷰트를 갖는 네임드 튜플로 반환합니다. 이들은 바이트 단위의 총, 사용된, 여유 공간의 양입니다. path는 파일이나 디렉터리일 수 있습니다.
[Python] Windows OS Disk Usage Check. (윈도우 운영체제 디스크 사용량 체크)
import shutil.disk_usage(drive) : 드라이브의 전체용량, 사용량, 잔여량 정보를 리턴 import shutil drive = 'c:' c = dict([x for x in zip(['total','used','free'], shutil.disk_usage(drive))]) print(c) p..
pydole.tistory.com
Parameter Description path 대상 디렉토리 또는 파일 shutil.move(src, dst, copy_function=copy2)
shutil.move 파일이나 디렉터리(src)를 다른 위치(dst)로 재귀적으로 옮기고 대상을 반환합니다
대상이 기존 디렉터리이면, src가 해당 디렉터리 내로 이동됩니다. 대상이 이미 존재하지만, 디렉터리가 아니면, os.rename() 의미에 따라 덮어쓸 수 있습니다.
대상이 현재 파일 시스템에 있으면, os.rename()이 사용됩니다. 그렇지 않으면, copy_function을 사용하여 src를 dst로 복사한 다음 제거합니다. 심볼릭 링크의 경우, src의 대상을 가리키는 새 심볼릭 링크가 dst나 그 안에 만들어지고 src가 제거됩니다.
copy_function이 제공되면, src와 dst 두 개의 인자를 취하는 콜러블 이어야 하며, os.rename()을 사용할 수 없을 때 src를 dst로 복사하는 데 사용됩니다. 소스가 디렉터리이면, copytree()가 호출되고 copy_function()을 전달합니다. 기본 copy_function은 copy2()입니다. copy_function으로 copy()를 사용하면 메타 데이터를 복사하지 않는 비용을 지불하는 대신 메타 데이터도 복사할 때 실패하는 이동이 성공할 수 있습니다.
Parameter Description src
대상 디렉토리 또는 파일(source) dst
대상 디렉토리 또는 파일(destination) copy_function
개별 파일 복사기능 처리기 지정 shutil.chown(path, user=None, group=None)
shutil.chown 주어진 path의 소유자 user 및/또는 group을 변경합니다.
user는 시스템 사용자 이름이나 uid 일 수 있습니다; group도 마찬가지입니다. 최소한 하나의 인자가 필요합니다.
하부 함수인 os.chown()도 참조하십시오.
Parameter Description path
대상 디렉토리 또는 파일 user
사용자 권한 메타데이터 group
그룹 권한 메타데이터 참고예제: https://python.engineering/python-shutil-chown-method/
shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None)
- exception shutil.Error
shutil.which 주어진 cmd가 호출되면 실행될 실행 파일의 경로를 반환합니다. 아무런 cmd도 호출되지 않을 것이라면, None을 반환합니다.
mode는 os.access()에 전달되는 권한 마스크입니다, 기본적으로 파일이 존재하고 실행 가능한지를 판단합니다.
path를 지정하지 않으면, os.environ()의 결과가 사용되어, “PATH” 값이나 os.defpath의 폴 백을 반환합니다.
윈도우에서, 기본값을 사용하건 여러분 스스로 제공한 값을 사용하건 현재 디렉터리가 항상 path 앞에 추가됩니다, 이는 실행 파일을 찾을 때 명령 셸이 사용하는 동작입니다. 또한, path에서 cmd를 찾을 때, PATHEXT 환경 변수가 확인됩니다. 예를 들어, shutil.which("python")을 호출하면, which()는 PATHEXT를 검색하여 path 디렉터리에서 python.exe를 찾아야 한다는 것을 알 수 있습니다.
Parameter Description cmd
윈도우 명령어처리기에 실행할 문자열 mode
파일이 존재하고 실행 가능한지를 판단하는 옵션 path
working directory 아카이브 연산
shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])
shutil.make_acrhive 아카이브 파일(가령 zip이나 tar)을 만들고 이름을 반환합니다.
base_name은 만들 파일의 이름인데, 경로를 포함하고 형식별 확장자는 제외합니다.
format은 아카이브 형식입니다. zip, tar, gztar, bztar, xztar 중 하나를 사용 할 수 있습니다.
root_dir은 아카이브의 루트 디렉터리가 될 디렉터리입니다.아카이브의 모든 경로는 루트 디렉토리로 부터 상대경로를 가집니다.보통 아카이브를 만들기 전에 root_dir로 chdir 합니다.
base_dir은 아카이브를 시작할 디렉터리입니다. 즉, base_dir은 아카이브에 있는 모든 파일과 디렉터리의 공통 접두사가 됩니다. base_dir은 root_dir에 상대적으로 제공되어야 합니다. 참고 : https://docs.python.org/ko/3/library/shutil.html#shutil-archiving-example-with-basedir
root_dir과 base_dir은 모두 현재 디렉터리가 기본값입니다.
dry_run이 참이면, 아카이브가 만들어지지 않지만, 실행될 연산이 logger에 로그 됩니다.
tar 아카이브를 만들 때 owner와 *group이 사용됩니다. 기본적으로, 현재 소유자와 그룹을 사용합니다.
logger는 PEP 282와 호환되는 객체여야 합니다. 일반적으로 logging.Logger의 인스턴스를 사용합니다.verbose 인자는 사용되지 않으며 폐지되었습니다.
필수 인자: base_name, format, root_dir, base_dir
Parameter Description base_name
파일 객체(경로포함) , 확장자 제외 format
아카이브 형식.
zip, tar, gztar, bztar, xztar 중 하나를 사용root_dir
아카이브의 루트 디렉터리가 될 디렉터리 base_dir
아카이브를 시작할 디렉터리 dry_run
아카이브 생성 옵션 default : FALSE
거짓이면 로거 로그에 기록됨owner
tar 아카이브 사용시 사용자 권한에 대한 메타데이터 인자 group
tar 아카이브 사용시 사용자 권한에 대한 메타데이터 인자 logger
logger 객체 지정 shutil.get_archive_formats()
shutil.get_archive_formats 아카이브 연산에 지원되는 아카이브 포맷 리스트를 반환합니다.
반환된 시퀀스의 각 요소는 튜플 (name, description)입니다.
기본적으로 shutil 은 다음 형식을 제공합니다.
- zip: ZIP 파일 (zlib 모듈을 사용할 수 있으면).
- tar: 압축되지 않은 tar 파일. 새 아카이브에 POSIX.1-2001 pax 형식을 사용합니다.
- gztar: gzip 된 tar 파일 (zlib 모듈을 사용할 수 있으면).
- bztar: bzip2 된 tar 파일 (bz2 모듈을 사용할 수 있으면).
- xztar: xz 된 tar 파일 (lzma 모듈을 사용할 수 있으면).
register_archive_format()을 사용하여, 새 형식을 등록하거나 기존 형식에 대해 여러분 자신의 아카이버를 제공할 수 있습니다.
shutil.register_archive_format(name, function[, extra_args[, description]])
shutil.register_archive_format name 형식을 위한 아카이버를 등록합니다.
function은 아카이브를 만드는 데 사용되는 콜러블입니다. 콜러블은 만들 파일의 base_name과 그 뒤에 아카이브를 시작할 base_dir(기본값은 os.curdir)를 받습니다. 추가 인자는 키워드 인자로 전달됩니다: owner, group, dry_run 및 logger (make_archive()로 전달됩니다).
주어지면, extra_args는 아카이버 콜러블이 사용될 때 추가 키워드 인자로 사용되는 (name, value) 쌍의 시퀀스입니다.
description은 아카이버 목록을 반환하는 get_archive_formats()에서 사용됩니다. 기본값은 빈 문자열입니다.
Parameter Description name
새로 추가될 아카이브 포맷의 아카이버 지정 function
아카이브 연산 함수 지정 extra_args
지정된 아카이브 연산 함수의 인자값 지정 description
get_archive_farmats()에서 사용되는 메타데이터 지정 디폴트 값은 빈 문자열 shutil.unregister_archive_format(name)
shutil.unregister_archive_format 지원되는 형식 리스트에서 name 아카이브 형식을 제거합니다.
Parameter Description name
제거할 아카이브 형식 지정 shutil.unpack_archive(filename[, extract_dir[, format]])
shutil.unpack_archive 아카이브를 풉니다. filename은 아카이브의 전체 경로입니다.
extract_dir은 아카이브가 풀리는 대상 디렉터리의 이름입니다. 제공되지 않으면, 현재 작업 디렉터리가 사용됩니다.
format은 아카이브 형식입니다: “zip”, “tar”, “gztar”, “bztar” 또는 “xztar” 중 하나. 또는 register_unpack_format()으로 등록된 다른 형식.
필수 인자 : filename, extract_dir, format
Parameter Description filename
unpack 할 아카이브 경로 extract_dir
풀리는 대상 디렉토리 default = None
None 이면 현재 작업 디렉토리 에 풀림format
아카이브 형식 shutil.register_unpack_format(name, extensions, function[, extra_args[, description]])
shutil.register_unpack_format 아카이브 해제기를 등록합니다. name은 형식의 이름이고 extensions는 형식에 해당하는 확장자의 리스트입니다, 가령 Zip 파일의 경우 .zip
function은 아카이브를 푸는 데 사용되는 콜러블입니다. 콜러블은 아카이브의 경로와 그 뒤로 아카이브를 추출해야 하는 디렉터리를 받습니다.
제공되면, extra_args는 키워드 인자로 콜러블에 전달되는 (name, value) 튜플의 시퀀스입니다.
description은 형식을 설명하기 위해 제공될 수 있으며, get_unpack_formats() 함수에 의해 반환됩니다.
Parameter Description name
추가할 아카이브 format 이름 extensions
foramt에 해당하는 확장자 리스트 지정 function
아카이브 연산에 필요한 함수 콜러블 extra_args
지정된 연산 함수의 인자값 description
포맷 설명을 위해 제공됨, get_unpack_formats() 에서 사용되는 메타데이터 shutil.unregister_unpack_format(name)
shutil.unregister_unpack_format 아카이브 해제 형식을 등록 취소합니다. name은 형식의 이름입니다.
Parameter Description name
제거할 아카이브 format 이름 shutil.get_unpack_formats()
shutil.get_unpack_formats 아카이브 해제를 위해 등록된 모든 형식의 리스트를 반환합니다. 반환된 시퀀스의 각 요소는 튜플 (name, extensions, description)입니다.
https://docs.python.org/ko/3/library/shutil.html#shutil.copy2
shutil — 고수준 파일 연산 — Python 3.10.7 문서
shutil — 고수준 파일 연산 소스 코드: Lib/shutil.py shutil 모듈은 파일과 파일 모음에 대한 여러 가지 고수준 연산을 제공합니다. 특히, 파일 복사와 삭제를 지원하는 함수가 제공됩니다. 개별 파일
docs.python.org
'Python study > 문법공부' 카테고리의 다른 글
[Python] Print 문안에서 if 문을 사용하는 방법. (0) 2023.04.26 Python_ subprocess_외부 프로세스 실행 및 입출력 제어 (0) 2022.09.27 python_*args,**kwargs (0) 2022.09.27 python _map() (0) 2021.11.03 할당 연산자 (0) 2021.11.01