> 백엔드 개발 > 파이썬 튜토리얼 > Python에서 파일 형식을 압축 해제하는 기본 방법

Python에서 파일 형식을 압축 해제하는 기본 방법

爱喝马黛茶的安东尼
풀어 주다: 2019-06-14 14:29:38
원래의
7985명이 탐색했습니다.

다양한 압축 패키지 형식을 처리하는 Python 라이브러리: patool. 기본적인 압축 해제, 패키징 및 기타 작업만 사용하고 다양한 압축 형식에 해당하는 Python 라이브러리에 대해 자세히 알아보고 싶지 않다면 patool이 좋은 선택이 될 것입니다.

관련 권장 사항: "python video"

Python에서 파일 형식을 압축 해제하는 기본 방법patool 라이브러리 지원 형식은 다음과 같습니다:

7z(.7z, .cb7), ACE(.ace, .cba), ADF(.adf), ALZIP( .alz), APE(.ape), AR(.a), ARC(.arc), ARJ(.arj), BZIP2(.bz2), CAB(.cab), COMPRESS(.Z), CPIO(.cpio ), DEB(.deb), DMS(.dms), FLAC(.flac), GZIP(.gz), ISO(.iso), LRZIP(.lrz), LZH(.lha, .lzh), LZIP( . lz), LZMA(.lzma), LZOP(.lzo), RPM(.rpm), RAR(.rar, .cbr), RZIP(.rz), SHN(.shn), TAR(.tar, .cbt ) , 예를 들어 제가 주로 patool을 사용하여 파일을 압축 해제하면 내 컴퓨터에서는 주로 7z 및 Rtools를 호출합니다. 컴퓨터에 해당 압축 파일을 처리할 수 있는 소프트웨어가 없으면 다음과 같은 오류가 보고됩니다.

import patoolib
# 解压缩
patoolib.extract_archive("archive.zip", outdir="/tmp")
# 测试压缩包是否完整
patoolib.test_archive("dist.tar.gz", verbosity=1)
# 列出压缩包内的文件
patoolib.list_archive("package.deb")
# 创建压缩包
patoolib.create_archive("/path/to/myfiles.zip", ("file1.txt", "dir/"))
# 比较压缩包内文件的差异
patoolib.diff_archives("release1.0.tar.gz", "release2.0.zip")
# 搜索patoolib.search_archive("def urlopen", "python3.3.tar.gz")
# 修改压缩包的压缩格式
patoolib.repack_archive("linux-2.6.33.tar.gz", "linux-2.6.33.tar.bz2")
로그인 후 복사

게다가 , patool은 비밀번호로 보호된 파일을 처리할 수 없습니다. patool과 유사한 라이브러리에는 pyunpack 및 easy-extract가 포함됩니다. pyunpack 라이브러리는 zipfile 및 patool을 사용하고 두 라이브러리에서 지원하는 모든 압축 형식을 지원하며 미리 설치해야 합니다. easy-extract 라이브러리는 압축 해제 소프트웨어 unrar에 의존합니다. , 7z 및 par2를 미리 설치해야 합니다. 설치도 여러 압축 해제 형식을 지원합니다.

일반적인 압축 형식 처리


해당 압축 소프트웨어가 컴퓨터에 설치되어 있지 않고 압축 및 압축 풀기 작업에 Python을 사용하려는 경우 다음을 사용하여 몇 가지 일반적인

zip 형식을 도입할 수 있습니다

zip 형식을 처리할 수 있는 Python 라이브러리에는 Python 표준 라이브러리 zipfile, 타사 라이브러리 python-archive 등이 포함됩니다. 다음은 주로 zipfile 라이브러리의 기본 사용법을 소개합니다.

먼저 ZipFile 객체 생성:

patoolib.util.PatoolError: could not find an executable program to extract format rar; candidates are (rar,unrar,7z)
로그인 후 복사
파일 패키지 압축 해제 , 압축 해제 기능 extract()와 extractall()의 두 가지 유형이 있으며, 전자는 기본적으로 단일 파일을 압축 해제하여 현재 디렉터리에 압축을 해제할 수 있습니다. extract()와 extractall() 모두 pwd 매개변수를 가지며 비밀번호로 압축된 패키지를 처리할 수 있습니다.
# 导入ZipFile类
from zipfile import ZipFile
# ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None)
# 默认模式是读取,该模式提供read(), readline(), readlines(), __iter__(), __next__()等方法
로그인 후 복사

압축 파일 생성: zipfile에는 네 가지 파일 압축 방법이 있습니다: zipfile.ZIP_STORED(기본값), zipfile.ZIP_DEFLATED, zipfile.ZIP_BZIP2, zipfile.ZIP_LZMA

with ZipFile('test.zip') as myzip:
    myzip.extract(member='1.txt',path='tmp')
    myzip.extractall(path='tmp',members=['1.txt','2.txt'],pwd='password')
로그인 후 복사

전체 폴더 압축

# 添加文件的mode有'w', 'a', 'x'
# 'w'表示覆盖或写入一个新文件;'a'表示在已有文件后追加;'x'表示新建文件并写入。
# 在三种mode下,如果未写入认识数据,则会生成空的ZIP文件。
with ZipFile('test.zip',mode='w') as myzip:    
    for file in ['1.txt', '2.txt']: # 需压缩的文件列表        
        myzip.write(file,compress_type=zipfile.ZIP_DEFLATED)
로그인 후 복사

rar 형식

rar format에는 해당 python 표준 라이브러리가 없으며 타사 라이브러리 rarfile, python-unrar, pyUnRAR2 등에 의존해야 합니다. 위 라이브러리는 RARLAB의 UnRAR 라이브러리 지원에 의존한다는 공통점이 있습니다. 다음은 주로 다음을 소개합니다. rarfile 라이브러리:

설치 및 구성

설치 명령:

# 方法一
def addToZip(zf, path, zippath):
    if os.path.isfile(path):        
        zf.write(path, zippath, zipfile.ZIP_DEFLATED)  # 以zlib压缩方法写入文件    
    elif os.path.isdir(path):        
        if zippath:            
            zf.write(path, zippath)        
        for nm in os.listdir(path):            
            addToZip(zf, os.path.join(path, nm), os.path.join(zippath, nm))
with zipfile.ZipFile('tmp4.zip', 'w') as zip_file:    
      addToZip(zip_file,'tmp','tmp')    
#方法二
class ZipFolder:    
    def toZip(self, file, zipfilename):        
        # 首先创建zipfile对象        
        with zipfile.ZipFile(zipfilename, 'w') as zip_file:            
            if os.path.isfile(file):  # 判断写入的是文件还是文件夹,是文件的话直接写入                
                zip_file.write(file)            
            else:  # 否则调用写入文件夹的函数assFolderToZip()                
                self.addFolderToZip(zip_file, file)    
    def addFolderToZip(self, zip_file, folder):        
        for file in os.listdir(folder):  # 依次遍历文件夹内的文件            
            full_path = os.path.join(folder, file)            
            if os.path.isfile(full_path): # 判断是文件还是文件夹,是文件的话直接写入                
                print('File added: ', str(full_path))                
                zip_file.write(full_path)            
            elif os.path.isdir(full_path):             
            # 如果是文件夹的话再次调用addFolderToZip函数,写入文件夹                
                print('Entering folder: ', str(full_path))                
                self.addFolderToZip(zip_file, full_path)
directory = 'tmp'   # 需压缩的文件目录
zipfilename = 'tmp1.zip'    #压缩后的文件名
ZipFolder().toZip(directory, zipfilename)
로그인 후 복사

하지만 구성에는 시간이 걸립니다. 먼저 UnRAR을 다운로드하여 설치하세요. 제 컴퓨터 운영체제가 Windows이기 때문에 RARLAB 공식 홈페이지에서 UnRarDLL을 다운로드하여 기본 경로인 C:Program Files (x86)UnrarDLL에 설치하시면 됩니다.

그런 다음 환경 변수를 추가합니다. 먼저 시스템 변수의 경로 변수에 C:Program Files (x86)UnrarDLLx64(내 시스템은 64비트)를 추가합니다(컴퓨터 마우스 오른쪽 버튼 클릭 > 속성 > 고급 시스템 설정 > 고급 > 환경 변수). , 그러나 PyCharm을 다시 시작한 후에도 오류가 계속 보고됩니다.

pip install rarfile
로그인 후 복사
그런 다음 시스템 변수에 새 변수를 생성하려고 시도하고 변수 이름으로 ?UNRAR_LIB_PATH를 입력하고 변수 값은 ?C:Program Files (x86)UnrarDLLx64UnRAR64.dll입니다. (C:\Program Files (x86)UnrarDLLUnRAR.dll의 32비트 시스템에서 변수 값). PyCharm을 다시 시작하면 문제가 해결됩니다.

기본 사용법

rarfile 라이브러리의 사용법은 zipfile과 매우 유사하며 extract(), extractall(), namelist(), infolist(), getinfo(), open(), read(), printdir() 및 기타 기능과의 주요 차이점은 RarFile 개체는 읽기 모드만 지원하고 파일을 쓸 수 없다는 것입니다.

LookupError: Couldn't find path to unrar library.
로그인 후 복사

rarfile 라이브러리를 사용하여 rar 압축 패키지의 압축을 푸는 것은 zipfile 라이브러리를 사용하여 zip 형식의 압축 패키지를 푸는 것과 같습니다. zipfile 라이브러리의 사용법을 참조하세요. 또한 python-unrar 라이브러리의 설치, 설정 및 사용은 rarfile 라이브러리와 매우 유사하지만 python-unrar 라이브러리는 with 문을 사용하려는 경우 찾을 수 있습니다. python-unrar 라이브러리 설치 디렉터리에 있는 rarfile.py를 파일에 추가합니다.

# mode的值只能为'r'
class rarfile.RarFile(rarfile, mode='r', charset=None, info_callback=None, crc_check=True, errors='stop')
로그인 후 복사

tar format

tar 형식은 Unix 시스템에서 서로 다른 압축 방법을 사용하여 서로 다른 형식을 만들 수 있습니다. 압축 파일 형식: .tar.gz (.tgz ), .tar.bz2 (.tbztb2), .tar.Z (.taz), .tar.lzma (.tlz), .tar.xz (.txz) ), 등. tar 형식은 Python 표준 라이브러리 tarfile에 해당합니다. 지원되는 형식은 tar, tar.gz, tar.bz2, tar.xz, .tar.lzma 등입니다.

tarfile 라이브러리의 기본 사용법:

tarfile 객체 생성

tarfile 라이브러리는 tarfile.TarFile() 대신 tarfile.open()을 사용하여 객체를 생성합니다.

tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs)
로그인 후 복사

其中,mode可取的值比较多,主要包括'r', 'w', 'a', 'x'四种模式(在zipfile库的使用中简单介绍过),以及这四种模式与'gz', 'bz2', 'xz'三种压缩方法的组合模式,具体取值如下表所示:

模式 含义

'r'or'r:*' 自动解压并打开文件(推荐模式)

'r:' 只打开文件不解压

'r:gz' 采用gzip格式解压并打开文件

'r:bz2' 采用bz2格式解压并打开文件

'r:xz' 采用lzma格式解压并打开文件

'x'or'x:' 仅创建打包文件,不压缩

'x:gz' 采用gzip方式压缩并打包文件

'x:bz2' 采用bzip2方式压缩并打包文件

'x:xz' 采用lzma方式压缩并打包文件

'a'or'a:' 打开文件,并以不压缩的方式追加内容。如果文件不存在,则新建

'w'or'w:' 以不压缩的方式写入

'w:gz' 以gzip的方式压缩并写入

'w:bz2' 以bzip2的方式压缩并写入

'w:xz' 以lzma的方式压缩并写入

但是,不支持'a'与三种压缩方法的组合模式('a:gz', 'a:bz2'、'a:xz')

基本使用方法
解压缩至指定的目录

with tarfile.open("test.tar.gz") as tar:    
    tar.extractall(path='.')
로그인 후 복사

解压符合某些条件的文件

# 解压后缀名为py的文件
def py_files(members):
    for tarinfo in members:        
        if os.path.splitext(tarinfo.name)[1] == ".py":            
            yield tarinfo
with tarfile.open("sample.tar.gz") as tar:    
    tar.extractall(members=py_files(tar))
로그인 후 복사

创建不压缩的打包文件

with tarfile.open("sample.tar", "w") as tar:
    for name in ["foo", "bar", "quux"]:        
        tar.add(name)
로그인 후 복사

创建压缩的打包文件

with tarfile.open("sample.tar", "w:gz") as tar:
    for name in ["foo", "bar", "quux"]:        
        tar.add(name)
로그인 후 복사

压缩并打包整个文件夹,较之zipfile库简单得多,可使用add()函数进行添加

tar = tarfile.open('test.tar','w:gz')
for root ,dir,files in os.walk(os.getcwd()):      
  for file in files:          
      fullpath = os.path.join(root,file)          
      tar.add(fullpath)
로그인 후 복사

其他压缩格式

Python原生的数据压缩打包的标准库还包括:bz2、gzip、zlib、lzma以及建立在zipfile和tarfile库基础上的shutil库,以后有机会再详细介绍。

위 내용은 Python에서 파일 형식을 압축 해제하는 기본 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿