파이썬에서 디렉토리 구조의 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()
답변
가장 쉬운 방법은을 사용하는 것 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__.py
and 로 파이썬 패키지를 압축하려고 시도 __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')