답변:
전체 디렉토리 트리에 대한 .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
.
arcname=os.path.basename(source_dir)
의 전체 경로 구조를 제공 할 것입니다 source_dir
(대부분의 상황에서 그것은 아마도 불편할 것입니다).
arcname=os.path.basename(source_dir)
still은 아카이브에의 내용이 포함 된 폴더가 포함되어 있음을 의미합니다 source_dir
. 아카이브의 루트에 폴더 내의 내용이 아닌 내용 자체를 포함하려면 arcname=os.path.sep
대신 사용하십시오.
os.path.sep
하면 아카이브에 "."서비스가 포함 되기 때문 입니다. 또는 "/"폴더는 일반적으로 문제가되지 않지만 나중에이 아카이브를 프로그래밍 방식으로 처리하는 경우 문제가 될 수 있습니다. 유일한 방법은 os.walk
파일을 개별적 으로 수행 하고 추가하는 것입니다
arcname='.'
. 사용할 필요가 없습니다 os.walk
.
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"로 바꾸십시오.
with tarfile.open( ..
대신 호출하는 파이썬 open
과 close
수동. 일반 파일을 열 때도 마찬가지입니다.
"gzip 압축 쓰기를 위해 열기"를 의미하는으로 tarfile.open 을 호출합니다 mode='w:gz'
.
당신은 아마 파일 이름 (끝 할 수 있습니다 name
에 인수 open
로)를 .tar.gz
,하지만 압축 능력에 영향을주지 않습니다.
BTW, 일반적으로를 사용하여 압축 할 수 있는 것보다 더 잘 압축 할 수있는 'w:bz2'
것과 마찬가지로 .tar
bzip2
gzip
이전 답변은 tarfile
Python 모듈을 사용하여 Python에서 .tar.gz
파일 을 만드는 것이 좋습니다. 이것은 분명히 좋은 Python 스타일의 솔루션이지만 보관 속도에 심각한 단점이 있습니다. 이 질문 은 Linux tarfile
의 tar
유틸리티 보다 약 2 배 느리다 는 것을 언급합니다 . 내 경험에 따르면이 추정은 꽤 정확합니다.
따라서 더 빠른 보관을 위해 모듈을 사용하여 tar
명령을 사용할 수 있습니다 subprocess
.
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
@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()}")