Python에서 ZIP 파일을 압축 및 압축 해제하는 zipfile

사업

Python 표준 라이브러리의 zipfile 모듈을 사용하여 파일을 ZIP으로 압축하고 ZIP 파일을 압축 해제할 수 있습니다. 표준 라이브러리에 포함되어 있으므로 추가 설치가 필요하지 않습니다.

다음 내용을 설명합니다.

  • 여러 파일을 ZIP 파일로 압축
  • 기존 ZIP 파일에 새 파일 추가
  • 디렉토리(폴더)를 ZIP 파일로 압축
  • 비밀번호가 있는 ZIP 파일로 압축
  • ZIP 파일의 내용을 확인하십시오.
  • ZIP 파일의 전체 내용을 추출(압축 해제)합니다.
  • ZIP 파일의 내용을 선택하고 압축을 풉니다.

여러 파일을 ZIP 파일로 압축

ZipFile 객체를 만들고 write() 메서드를 사용하여 압축하려는 파일을 추가합니다.

새로운 ZIP 파일을 생성하기 위해서는 생성하고자 하는 ZIP 파일의 경로를 ZipFile 객체 생성자의 첫 번째 인수로 지정하고 두 번째 인수를 다음과 같이 지정합니다.w'

또한 세 번째 인수로 압축 방식을 지정할 수 있습니다.

  • zipfile.ZIP_STORED:압축하지 않고 여러 파일을 결합하기만 하면 됩니다(기본값).
  • zipfile.ZIP_DEFLATED:일반 ZIP 압축(zlib 모듈 필요)
  • zipfile.ZIP_BZIP2:BZIP2 압축(bz2 모듈 필요)
  • zipfile.ZIP_LZMA:LZMA 압축(lzma 모듈 필요)

BZIP2 및 LZMA는 압축률이 높지만(더 작은 크기로 압축 가능) 압축에 필요한 시간이 더 깁니다.

write() 메서드에서 첫 번째 인수 파일 이름이 있는 파일은 두 번째 인수 arcname이 있는 ZIP 파일에 기록됩니다. arcname을 생략하면 파일 이름이 그대로 사용됩니다. arcname은 디렉토리 구조를 지정할 수도 있습니다.

ZipFile 객체는 close() 메서드로 닫아야 하지만 with 문을 사용하면 블록이 완료되면 자동으로 닫힙니다.

import zipfile

with zipfile.ZipFile('data/temp/new_comp.zip', 'w', compression=zipfile.ZIP_DEFLATED) as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt')
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

write() 메서드의 compress_type 인수를 지정하여 각 파일에 대한 압축 방법을 선택할 수도 있습니다.

with zipfile.ZipFile('data/temp/new_comp_single.zip', 'w') as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt', compress_type=zipfile.ZIP_DEFLATED)
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

기존 ZIP 파일에 새 파일 추가

기존 zip 파일에 새 파일을 추가하려면 ZipFile 객체를 생성할 때 생성자의 첫 번째 인수를 기존 zip 파일의 경로로 설정합니다. 또한 두 번째 인수 모드를 다음과 같이 설정합니다.a'

그런 다음 위의 예와 같이 write() 메서드를 사용하여 파일을 추가하기만 하면 됩니다.

with zipfile.ZipFile('data/temp/new_comp.zip', 'a') as existing_zip:
    existing_zip.write('data/temp/test4.txt', arcname='test4.txt')

디렉토리(폴더)를 ZIP 파일로 압축

전체 디렉토리(폴더)를 하나의 ZIP 파일로 압축하려면 os.scandir() 또는 os.listdir()을 사용하여 파일 목록을 만들 수 있지만 파일 목록에서 make_archive()를 사용하는 것이 더 쉽습니다. 기준 치수.

다음 기사를 참조하십시오.

비밀번호가 있는 ZIP 파일로 압축

zipfile 모듈에서는 비밀번호로 보호된 ZIP를 생성할 수 없습니다. 파일을 암호로 보호된 zip 파일로 압축하려면 타사 라이브러리 pyminizip을 사용하십시오.

암호로 보호된 ZIP의 압축 해제는 zipfile 모듈을 사용하여 수행할 수 있습니다(아래 참조).

ZIP 파일의 내용을 확인하십시오.

기존 ZIP 파일의 내용을 확인할 수 있습니다.

생성자의 첫 번째 인수 파일을 기존 zip 파일의 경로로 설정하고 두 번째 인수 모드를 ‘r’로 설정하여 ZipFile 객체를 만듭니다. 모드 인수는 기본값이 ‘r’이므로 생략할 수 있습니다.

ZipFile 객체의 namelist() 메서드를 사용하여 아카이브된 파일 목록을 가져올 수 있습니다.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    print(existing_zip.namelist())
# ['test1.txt', 'zipdir/test2.txt', 'zipdir/sub_dir/test3.txt', 'test4.txt']

ZIP 파일의 전체 내용을 추출(압축 해제)합니다.

ZIP 파일의 내용을 풀려면 위의 예와 같이 생성자의 첫 번째 인수 파일을 기존 ZIP 파일의 경로로 사용하고 두 번째 인수 모드를 ‘r’로 사용하여 ZipFile 개체를 만듭니다. 모드 인수는 기본값이 ‘r’이므로 생략할 수 있습니다.

ZipFile 객체의 extractall() 메서드는 ZIP 파일의 전체 내용을 추출(압축 해제)합니다. 첫 번째 인수인 path는 추출할 디렉터리의 경로를 지정합니다. 생략하면 파일이 현재 디렉토리로 추출됩니다.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extractall('data/temp/ext')

암호가 있는 ZIP 파일은 암호를 extractall() 메서드의 인수 pwd로 지정하여 추출할 수 있습니다.

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extractall('data/temp/ext_pass', pwd='password')

ZIP 파일의 내용을 선택하고 압축을 풉니다.

압축을 풀고 특정 파일만 추출하려면 extract() 메서드를 사용하십시오.

extract() 메서드의 첫 번째 인수는 추출할 파일의 이름이고 두 번째 인수 path는 추출할 디렉터리의 경로입니다. 경로 인수를 생략하면 파일이 현재 디렉토리로 추출됩니다. 압축을 푼 파일의 이름은 ZIP 파일이 저장되어 있는 경우 해당 디렉토리의 경로를 포함해야 합니다.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extract('test1.txt', 'data/temp/ext2')

extractall() 메서드와 마찬가지로 extract() 메서드를 사용하면 암호를 pwd 인수로 지정할 수도 있습니다.

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extract('test1.txt', 'data/temp/ext_pass2', pwd='password')