Grundlegende Methode zum Dekomprimieren von Dateiformaten in Python

爱喝马黛茶的安东尼
Freigeben: 2019-06-14 14:29:38
Original
7862 Leute haben es durchsucht

Eine Python-Bibliothek, die mehrere komprimierte Paketformate verarbeitet: patool. Wenn Sie nur grundlegende Dekomprimierungs-, Verpackungs- und andere Vorgänge verwenden und nicht mehr über die Python-Bibliotheken erfahren möchten, die verschiedenen Komprimierungsformaten entsprechen, sollte patool eine gute Wahl sein.

Verwandte Empfehlungen: „Python-Video

Grundlegende Methode zum Dekomprimieren von Dateiformaten in PythonZu den von der Patool-Bibliothek unterstützten Formaten gehören:

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), XZ (.xz), ZIP (.zip, .jar, .cbz) und ZOO (.zoo)

Grundlegende Verwendung von patool:

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")
Nach dem Login kopieren

Der normale Betrieb von patool hängt jedoch von anderer Dekomprimierungssoftware ab, wenn ich beispielsweise normalerweise patool zum Dekomprimieren von Dateien verwende Wenn auf dem Computer keine Software vorhanden ist, die die entsprechenden komprimierten Dateien verarbeiten kann, wird bei den beiden Programmen 7z und Rtools ein Fehler gemeldet:

patoolib.util.PatoolError: could not find an executable program to extract format rar; candidates are (rar,unrar,7z)
Nach dem Login kopieren

Außerdem kann patool nicht passwortgeschützt verarbeiten komprimierte Dateien.
Zu den patool-ähnlichen Bibliotheken gehören Pyunpack und Easy-Extract: Die Pyunpack-Bibliothek basiert auf Zipfile und Patool, unterstützt alle von den beiden Bibliotheken unterstützten Komprimierungsformate und muss im Voraus installiert werden Software unrar, 7z und par2 Es muss im Voraus installiert werden und unterstützt auch mehrere Dekomprimierungsformate.

Verarbeitung gängiger Komprimierungsformate

Wenn die entsprechende Komprimierungssoftware nicht auf dem Computer installiert ist und Sie Python nur für Komprimierungs- und Dekomprimierungsvorgänge verwenden möchten, können Sie Folgendes verwenden die anderen Details unten. Wir stellen mehrere gängige

Zip-Formate vor

Python-Bibliotheken, die das Zip-Format verarbeiten können, umfassen die Python-Standardbibliothek „Zipfile“ und die Bibliothek „Python-Archive“ von Drittanbietern usw ., die im Folgenden hauptsächlich vorgestellt werden. Schauen wir uns die grundlegende Verwendung der Zipfile-Bibliothek an:
Erstellen Sie zunächst ein ZipFile-Objekt:

# 导入ZipFile类
from zipfile import ZipFile
# ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None)
# 默认模式是读取,该模式提供read(), readline(), readlines(), __iter__(), __next__()等方法
Nach dem Login kopieren

Dekomprimieren Sie das Dateipaket. Es gibt zwei Dekomprimierungsfunktionen: extract(). und extractall(). Ersteres kann eine einzelne Datei dekomprimieren und standardmäßig in das aktuelle Verzeichnis dekomprimieren. Letzteres kann standardmäßig mehrere Dateien dekomprimieren. Sowohl extract() als auch extractall() verfügen über den Parameter pwd und können komprimierte Pakete mit Passwörtern verarbeiten.

with ZipFile('test.zip') as myzip:
    myzip.extract(member='1.txt',path='tmp')
    myzip.extractall(path='tmp',members=['1.txt','2.txt'],pwd='password')
Nach dem Login kopieren

Komprimierte Dateien erstellen: zipfile verfügt über vier Methoden zum Komprimieren von Dateien: zipfile.ZIP_STORED (Standard), zipfile.ZIP_DEFLATED, zipfile.ZIP_BZIP2, zipfile.ZIP_LZMA

# 添加文件的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)
Nach dem Login kopieren

Komprimieren Sie den gesamten Dateiordner

# 方法一
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)
Nach dem Login kopieren

rar-Format

Das rar-Format verfügt nicht über eine entsprechende Python-Standardbibliothek und muss auf die Bibliotheken rarfile, python-unrar, pyUnRAR2 usw. von Drittanbietern zurückgreifen. Die oben genannten Bibliotheken haben etwas gemeinsam. Es hängt von der Unterstützung der UnRAR-Bibliothek von RARLAB ab. Im Folgenden wird hauptsächlich die Rarfile-Bibliothek vorgestellt:

Installation und Konfiguration
Installationsbefehl:

pip install rarfile
Nach dem Login kopieren

Aber die Konfiguration ist mitunter ziemlich aufwändig. Zuerst müssen Sie UnRAR herunterladen und installieren. Da das Betriebssystem meines Computers Windows ist, kann ich UnRarDLL von der offiziellen RARLAB-Website herunterladen und im Standardpfad C:Programme (x86)UnrarDLL installieren.
Dann fügen Sie zunächst Umgebungsvariablen hinzu: C:Programme (x86)UnrarDLLx64 (mein System ist 64-Bit) zur Pfadvariablen in den Systemvariablen (Rechtsklick auf Computer>Eigenschaften>Erweiterte Systemeinstellungen>Erweitert> Umgebungsvariablen), aber der Fehler wird nach dem Neustart von PyCharm immer noch gemeldet:

LookupError: Couldn't find path to unrar library.
Nach dem Login kopieren

Versuchen Sie dann, eine neue Variable in den Systemvariablen zu erstellen, geben Sie ?UNRAR_LIB_PATH als Variablennamen ein und der Variablenwert ist ?C:Program Dateien (x86)UnrarDLLx64UnRAR64.dll (32 Der Variablenwert unter dem Bitsystem ist C:Programme (x86)UnrarDLLUnRAR.dll). Starten Sie PyCharm neu und das Problem ist gelöst.

Grundlegende Verwendung

Die Verwendung der Rarfile-Bibliothek ist der von Zipfile sehr ähnlich und umfasst außerdem extract(), extractall(), namelist(), infolist(), getinfo (), open (), read (), printdir () und andere Funktionen. Der Hauptunterschied besteht darin, dass das RarFile-Objekt nur den Lesemodus unterstützt und keine Dateien schreiben kann.

# mode的值只能为'r'
class rarfile.RarFile(rarfile, mode='r', charset=None, info_callback=None, crc_check=True, errors='stop')
Nach dem Login kopieren

Die Verwendung der rarfile-Bibliothek zum Dekomprimieren von RAR-komprimierten Paketen ist dasselbe wie die Verwendung der Zipfile-Bibliothek zum Dekomprimieren von komprimierten Paketen im ZIP-Format. Bitte beachten Sie die Verwendung der Zipfile-Bibliothek.

Darüber hinaus sind die Installation, Einrichtung und Verwendung der Python-Unrar-Bibliothek der Rarfile-Bibliothek sehr ähnlich, die Python-Unrar-Bibliothek unterstützt jedoch nicht die with-Anweisung, wenn Sie die with-Anweisung verwenden möchten , können Sie zum Installationsverzeichnis der Python-Unrar-Bibliothek gehen und der Datei rarfile.py die folgende Anweisung hinzufügen:

def __enter__(self):
    """Open context."""    
    return self
def __exit__(self, typ, value, traceback):    
    """Exit context"""    
    self.close()
def close(self):    
    """Release open resources."""    
    pass
Nach dem Login kopieren

tar-Format

tar-Format ist eine gängige Verpackung Dateiformat unter Unix-Systemen. Es kann mit verschiedenen Komprimierungsmethoden abgeglichen werden, wie zum Beispiel: .tar.gz (.tgz), .tar.bz2 (.tbztb2), .tar.Z (.taz). , .tar.lzma (.tlz), .tar.xz (.txz) usw. Das TAR-Format entspricht der Python-Standardbibliothek TAR-Datei. Zu den unterstützten Formaten gehören: tar, tar.gz, tar.bz2, tar.xz, .tar.lzma usw.
Grundlegende Verwendung der Tarfile-Bibliothek:

Tarfile-Objekte erstellen

Die Tarfile-Bibliothek erstellt Objekte mit tarfile.open() anstelle von tarfile.TarFile().

tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs)
Nach dem Login kopieren

其中,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='.')
Nach dem Login kopieren

解压符合某些条件的文件

# 解压后缀名为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))
Nach dem Login kopieren

创建不压缩的打包文件

with tarfile.open("sample.tar", "w") as tar:
    for name in ["foo", "bar", "quux"]:        
        tar.add(name)
Nach dem Login kopieren

创建压缩的打包文件

with tarfile.open("sample.tar", "w:gz") as tar:
    for name in ["foo", "bar", "quux"]:        
        tar.add(name)
Nach dem Login kopieren

压缩并打包整个文件夹,较之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)
Nach dem Login kopieren

其他压缩格式

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

Das obige ist der detaillierte Inhalt vonGrundlegende Methode zum Dekomprimieren von Dateiformaten in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!