Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 tarfile 모듈로 tar 아카이브 파일 읽고 쓰기 완벽 가이드

tar 유틸리티는 원래 UNIX 운영체제를 위해 도입된 도구입니다. 여러 개의 파일을 하나의 아카이브 파일(흔히 tarball이라고 부름)로 묶어 파일 배포를 쉽게 만들어 주는 것이 목적입니다. 파이썬 표준 라이브러리의 tarfile 모듈에 포함된 함수들을 활용하면 tar 아카이브를 생성하고 필요할 때 tarball에서 파일을 추출할 수 있습니다. 아카이브는 gzip, bz2, lzma 압축 방식으로 만들 수도 있고, 압축 없이 생성할 수도 있습니다.

이 모듈에서 정의된 핵심 함수는 open()이며, 이 함수를 통해 tar 파일에 데이터를 쓰거나 읽는 작업을 수행합니다.

open() 함수

open() 함수는 매개변수로 전달된 파일 이름에 해당하는 TarFile 객체를 반환합니다. 이 함수는 mode라는 또 다른 매개변수를 요구하며, 기본값은 'r'(압축 없음)입니다. 사용 가능한 모드는 아래 표와 같습니다.

번호모드 및 동작
1'r' 또는 'r:*'
투명한(자동 감지) 압축 방식으로 읽기 위해 열기
2'r:'
압축 없이 읽기 위해 열기
3'r:gz'
gzip 압축으로 읽기 위해 열기
4'r:bz2'
bzip2 압축으로 읽기 위해 열기
5'r:xz'
lzma 압축으로 읽기 위해 열기
6'x' 또는 'x:'
압축 없이 배타적으로(exclusive) tarfile 생성
7'x:gz'
gzip 압축으로 tarfile 생성
8'x:bz2'
bzip2 압축으로 tarfile 생성
9'x:xz'
lzma 압축으로 tarfile 생성
10'a' 또는 'a:'
압축 없이 기존 아카이브에 추가하기 위해 열기
11'w' 또는 'w:'
압축 없이 쓰기 위해 열기
12'w:gz'
gzip 압축으로 쓰기 위해 열기
13'w:bz2'
bzip2 압축으로 쓰기 위해 열기
14'w:xz'
lzma 압축으로 쓰기 위해 열기

이 모듈은 TarFile 클래스를 정의합니다. open() 함수 대신 생성자를 직접 호출하여 TarFile 객체를 인스턴스화할 수도 있습니다.

TarFile() 생성자

이 생성자 역시 파일 이름과 mode 매개변수가 필요하며, mode의 가능한 값은 위 표와 동일합니다.

TarFile 클래스에서 자주 사용되는 주요 메서드는 다음과 같습니다.

add()

아카이브에 파일을 추가하는 메서드입니다. 파일, 디렉터리, 심볼릭 링크, 바로 가기 등의 이름을 지정할 수 있으며, 기본적으로 디렉터리는 재귀적으로(recursively) 추가됩니다. 재귀적 추가를 막으려면 recursive 매개변수를 False로 설정하면 됩니다.

addfile()

TarInfo 객체를 아카이브에 추가하는 메서드입니다.

extractall()

별도의 경로를 명시하지 않으면 아카이브의 모든 멤버를 현재 경로에 추출하는 메서드입니다.

extract()

지정한 멤버만 특정 경로에 추출하는 메서드이며, 기본 경로는 현재 디렉터리입니다.

tar 파일 생성 예제

다음 예제는 gzip 알고리즘으로 압축되는 tar 파일을 열고 그 안에 파일을 하나 추가하는 코드입니다.

>>> import tarfile
>>> fp = tarfile.open("zen.tar.gz", "w:gz")
>>> fp.add("zen.txt")
>>> fp.close()

현재 작업 디렉터리에 'zen.txt' 파일이 있다고 가정하면, 이 파일이 'zen.tar.gz' 아카이브에 추가됩니다.

tar 파일 추출 예제

다음 코드는 tar 아카이브에서 파일을 읽어 들여 모든 파일을 현재 폴더에 추출합니다. 결과를 확인하려면 미리 현재 폴더의 'zen.txt'를 삭제하거나 이름을 변경해 두면 좋습니다.

>>> fp = tarfile.open("zen.tar.gz", "r:gz")
>>> fp.extractall()
>>> fp.close()

실행 후 현재 디렉터리에 'zen.txt' 파일이 다시 나타난 것을 확인할 수 있습니다.

현재 디렉터리의 모든 파일로 tar 만들기

현재 디렉터리에 있는 모든 파일로 tar 아카이브를 구성하려면 다음 코드를 사용합니다.

import tarfile, glob
fp = tarfile.open('file.tar', 'w')
for file in glob.glob('*.*'):
    fp.add(file)
fp.close()

커맨드 라인 인터페이스(CLI)

tar 파일의 생성과 추출은 커맨드 라인 인터페이스를 통해서도 가능합니다. 예를 들어 명령 창에서 다음 명령을 실행하면 'lines.txt' 파일이 tar 파일에 추가됩니다.

C:\python36 >python -m tarfile -c line.tar lines.txt

사용할 수 있는 커맨드 라인 옵션은 다음과 같습니다.

-l 또는 --listtarfile 안의 파일 목록을 표시합니다.
-c 또는 --create소스 파일들로부터 tarfile을 생성합니다.
-e 또는 --extractoutput_dir이 지정되지 않으면 tarfile을 현재 디렉터리에 추출합니다.
-t 또는 --testtarfile이 유효한지 검사합니다.
-v 또는 --verbose상세한(verbose) 출력을 제공합니다.

다음 명령은 line.tar를 현재 디렉터리 아래의 newdir 폴더에 추출합니다.

C:\python36>python -m tarfile -e line.tar newdir/

다음 명령은 tar 아카이브에 포함된 모든 파일 목록을 출력합니다.

C:\python36>python -m tarfile -l files.tar

지금까지 tarfile 모듈에 대해 살펴보며, 이 모듈에 정의된 클래스와 함수들의 사용법을 정리했습니다. gzip·bz2·lzma 등 다양한 압축 방식을 지원하고 CLI까지 제공하기 때문에 파일 백업이나 배포용 아카이브 처리에 매우 유용하게 활용할 수 있습니다.