[python] 파이썬에서 디렉토리의 zip 아카이브를 만드는 방법은 무엇입니까?

파이썬에서 디렉토리 구조의 zip 아카이브를 어떻게 만들 수 있습니까?



답변

다른 사람들이 지적했듯이 zipfile 을 사용해야합니다 . 설명서에는 사용 가능한 기능이 나와 있지만 실제로는 전체 디렉토리를 압축하는 데 사용할 수있는 방법을 설명하지 않습니다. 예제 코드로 설명하는 것이 가장 쉽다고 생각합니다.

#!/usr/bin/env python
import os
import zipfile

def zipdir(path, ziph):
    # ziph is zipfile handle
    for root, dirs, files in os.walk(path):
        for file in files:
            ziph.write(os.path.join(root, file))

if __name__ == '__main__':
    zipf = zipfile.ZipFile('Python.zip', 'w', zipfile.ZIP_DEFLATED)
    zipdir('tmp/', zipf)
    zipf.close()

적응 : http://www.devshed.com/c/a/Python/Python-UnZipped/


답변

가장 쉬운 방법은을 사용하는 것 shutil.make_archive입니다. zip 및 tar 형식을 모두 지원합니다.

import shutil
shutil.make_archive(output_filename, 'zip', dir_name)

특정 파일을 건너 뛰는 것과 같이 전체 디렉토리를 압축하는 것보다 복잡한 작업을 수행해야하는 경우 zipfile다른 사람들이 제안한대로 모듈 을 파헤쳐 야합니다 .


답변

mydirectory모든 파일 및 하위 디렉토리를 포함하여 새 zip 파일에 내용을 추가하려면

import os
import zipfile

zf = zipfile.ZipFile("myzipfile.zip", "w")
for dirname, subdirs, files in os.walk("mydirectory"):
    zf.write(dirname)
    for filename in files:
        zf.write(os.path.join(dirname, filename))
zf.close()


답변

파이썬에서 디렉토리 구조의 zip 아카이브를 어떻게 만들 수 있습니까?

파이썬 스크립트에서

Python 2.7+ shutil에는 make_archive함수가 있습니다.

from shutil import make_archive
make_archive(
  'zipfile_name',
  'zip',           # the archive format - or tar, bztar, gztar 
  root_dir=None,   # root for archive - current working dir if None
  base_dir=None)   # start archiving from here - cwd if None too

압축 된 아카이브 이름은으로 지정 zipfile_name.zip됩니다. 경우 base_dir이다에서 멀리 아래로 root_dir그것은에없는 파일을 제외합니다 base_dir,하지만 여전히 최대의 부모 DIRS의 파일을 보관root_dir .

Cygwin에서 2.7로 테스트하는 데 문제가있었습니다 .cwd에 대해 root_dir 인수를 원합니다.

make_archive('zipfile_name', 'zip', root_dir='.')

쉘에서 파이썬 사용하기

zipfile모듈을 사용하여 쉘에서 Python 으로이 작업을 수행 할 수 있습니다 .

$ python -m zipfile -c zipname sourcedir

zipname원하는 대상 파일의 이름은 어디에 있습니까?.zip 경우 하면 자동으로 수행되지 않음) sourcedir은 디렉토리의 경로입니다.

파이썬을 압축 (또는 부모 디렉토리를 원하지 않음) :

__init__.pyand 로 파이썬 패키지를 압축하려고 시도 __main__.py하고 부모 디렉토리를 원하지 않는 경우

$ python -m zipfile -c zipname sourcedir/*

$ python zipname

패키지를 실행합니다. 압축 된 아카이브에서 진입 점으로 하위 패키지를 실행할 수 없습니다.

파이썬 앱 압축하기 :

python3.5 이상이 있고 구체적으로 Python 패키지를 압축하려면 zipapp을 사용 하십시오 .

$ python -m zipapp myapp
$ python myapp.pyz


답변

이 기능은 디렉토리 트리를 반복적으로 압축 하여 파일을 압축 하고 아카이브에 올바른 상대 파일 이름을 기록합니다. 아카이브 항목은에 의해 생성 된 것과 동일합니다 zip -r output.zip source_dir.

import os
import zipfile
def make_zipfile(output_filename, source_dir):
    relroot = os.path.abspath(os.path.join(source_dir, os.pardir))
    with zipfile.ZipFile(output_filename, "w", zipfile.ZIP_DEFLATED) as zip:
        for root, dirs, files in os.walk(source_dir):
            # add directory (needed for empty dirs)
            zip.write(root, os.path.relpath(root, relroot))
            for file in files:
                filename = os.path.join(root, file)
                if os.path.isfile(filename): # regular files only
                    arcname = os.path.join(os.path.relpath(root, relroot), file)
                    zip.write(filename, arcname)


답변

파이썬 표준 라이브러리 세트의 일부인 shutil을 사용하십시오. shutil 사용은 매우 간단합니다 (아래 코드 참조).

  • 첫 번째 인수 : 결과 zip / tar 파일의 파일 이름
  • 두 번째 인수 : zip / tar,
  • 3 번째 인수 : dir_name

암호:

import shutil
shutil.make_archive('/home/user/Desktop/Filename','zip','/home/username/Desktop/Directory')


답변

결과 zip 파일에 압축을 추가하려면 이 링크를 확인 하십시오. .

다음을 변경해야합니다.

zip = zipfile.ZipFile('Python.zip', 'w')

zip = zipfile.ZipFile('Python.zip', 'w', zipfile.ZIP_DEFLATED)