Python을 사용하여 전체 압축 tar 파일을 만드는 방법은 무엇입니까?


답변:


186

전체 디렉토리 트리에 대한 .tar.gz(일명 .tgz) 을 빌드하려면 :

import tarfile
import os.path

def make_tarfile(output_filename, source_dir):
    with tarfile.open(output_filename, "w:gz") as tar:
        tar.add(source_dir, arcname=os.path.basename(source_dir))

이렇게하면 이름과 내용이 같은 단일 최상위 폴더가 포함 된 gzip 압축 된 tar 아카이브가 생성됩니다 source_dir.


31
독자를위한 메모처럼, 생략 하면 tar 파일 arcname=os.path.basename(source_dir)의 전체 경로 구조를 제공 할 것입니다 source_dir(대부분의 상황에서 그것은 아마도 불편할 것입니다).
Brōtsyorfuzthrāx

12
두 번째 메모; using arcname=os.path.basename(source_dir)still은 아카이브에의 내용이 포함 된 폴더가 포함되어 있음을 의미합니다 source_dir. 아카이브의 루트에 폴더 내의 내용이 아닌 내용 자체를 포함하려면 arcname=os.path.sep대신 사용하십시오.
조나단 H

2
@Sheljohn 안타깝게도 이것은 완전히 정확하지 않습니다.를 사용 os.path.sep하면 아카이브에 "."서비스가 포함 되기 때문 입니다. 또는 "/"폴더는 일반적으로 문제가되지 않지만 나중에이 아카이브를 프로그래밍 방식으로 처리하는 경우 문제가 될 수 있습니다. 유일한 방법은 os.walk파일을 개별적 으로 수행 하고 추가하는 것입니다
The Godfather

모든 디렉토리 구조를 제거하려면 arcname='.'. 사용할 필요가 없습니다 os.walk.
edouardtheron

85
import tarfile
tar = tarfile.open("sample.tar.gz", "w:gz")
for name in ["file1", "file2", "file3"]:
    tar.add(name)
tar.close()

tar.bz2 압축 파일을 만들려면 파일 확장자 이름을 ".tar.bz2"로, "w : gz"를 "w : bz2"로 바꾸십시오.


10
당신은 정말 사용해야하는 with tarfile.open( ..대신 호출하는 파이썬 openclose수동. 일반 파일을 열 때도 마찬가지입니다.
Jonathan H

31

"gzip 압축 쓰기를 위해 열기"를 의미하는으로 tarfile.open 을 호출합니다 mode='w:gz'.

당신은 아마 파일 이름 (끝 할 수 있습니다 name에 인수 open로)를 .tar.gz,하지만 압축 능력에 영향을주지 않습니다.

BTW, 일반적으로를 사용하여 압축 할 수 있는 것보다 더 잘 압축 할 수있는 'w:bz2'것과 마찬가지로 .tarbzip2gzip


6
bzip2 압축 타르볼의 파일 이름은 ".tar.bz2"로 끝나야합니다.
Ignacio Vazquez-Abrams

8

이전 답변은 tarfilePython 모듈을 사용하여 Python에서 .tar.gz파일 을 만드는 것이 좋습니다. 이것은 분명히 좋은 Python 스타일의 솔루션이지만 보관 속도에 심각한 단점이 있습니다. 이 질문 은 Linux tarfiletar유틸리티 보다 약 2 배 느리다 는 것을 언급합니다 . 내 경험에 따르면이 추정은 꽤 정확합니다.

따라서 더 빠른 보관을 위해 모듈을 사용하여 tar명령을 사용할 수 있습니다 subprocess.

subprocess.call(['tar', '-czf', output_filename, file_to_archive])

0

이 tar.gz 파일에서 열린보기 디렉토리에서 압축하십시오. 해결에서 os.path.basename (file_directory)을 사용하십시오.

with tarfile.open("save.tar.gz","w:gz"):
      for file in ["a.txt","b.log","c.png"]:
           tar.add(os.path.basename(file))

tar.gz 파일에서의 사용 디렉토리에서 압축


0

@Aleksandr Tukallo의 답변 외에도 출력 및 오류 메시지 (발생한 경우)를 얻을 수 있습니다. 를 사용하여 폴더를 압축하는 tar것은 다음 답변 에 꽤 잘 설명되어 있습니다.

import traceback
import subprocess

try:
    cmd = ['tar', 'czfj', output_filename, file_to_archive]
    output = subprocess.check_output(cmd).decode("utf-8").strip() 
    print(output)          
except Exception:       
    print(f"E: {traceback.format_exc()}")       
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.