Maison  >  Article  >  développement back-end  >  Méthode de base pour décompresser les formats de fichiers en python

Méthode de base pour décompresser les formats de fichiers en python

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼original
2019-06-14 14:29:387869parcourir

Une bibliothèque python qui gère plusieurs formats de packages compressés : patool. Si vous n'utilisez que des opérations de décompression, d'empaquetage et autres de base et que vous ne souhaitez pas en savoir plus sur les bibliothèques python correspondant aux différents formats de compression, patool devrait être un bon choix.

Recommandations associées : "vidéo python"

Méthode de base pour décompresser les formats de fichiers en pythonLes formats pris en charge par la bibliothèque patool incluent :

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) et ZOO (.zoo)

Utilisation de base de 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")

Cependant, le fonctionnement normal de patool dépend d'autres logiciels de décompression. Par exemple, lorsque j'utilise habituellement patool pour décompresser des fichiers, cela principalement. appelle mon ordinateur. Pour les deux programmes 7z et Rtools, s'il n'y a pas de logiciel sur l'ordinateur capable de traiter les fichiers compressés correspondants, une erreur sera signalée :

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

De plus, patool ne peut pas traiter les fichiers protégés par mot de passe. fichiers compressés.
Les bibliothèques similaires à patool incluent pyunpack et easy-extract : la bibliothèque pyunpack s'appuie sur zipfile et patool, prend en charge tous les formats de compression pris en charge par les deux bibliothèques et doit être installée à l'avance ; logiciels unrar, 7z et par2. Il doit être installé à l'avance et prend également en charge plusieurs formats de décompression.

Traitement des formats de compression courants

Si le logiciel de compression correspondant n'est pas installé sur l'ordinateur et que vous souhaitez simplement utiliser python pour les opérations de compression et de décompression, vous pouvez utiliser autres détails ci-dessous Présentation de plusieurs

formats zip courants

bibliothèques python qui peuvent gérer le format zip, notamment le fichier zip de la bibliothèque standard python et la bibliothèque tierce python-archive, etc. Les éléments suivants sont principalement présentés. Jetons un coup d'œil à l'utilisation de base de la bibliothèque zipfile :
Créez d'abord un objet ZipFile :

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

Décompressez le package de fichiers. Il existe deux fonctions de décompression : extract() et extractall. (). Le premier peut décompresser un seul fichier et décompresse par défaut dans le répertoire actuel. Le second peut décompresser plusieurs fichiers par lots et décompresser tous les fichiers par défaut. extract() et extractall() ont tous deux le paramètre pwd et peuvent gérer des packages compressés avec des mots de passe.

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

Créer des fichiers compressés : zipfile propose quatre méthodes pour compresser des fichiers : zipfile.ZIP_STORED (par défaut), 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)

Compresser l'intégralité du dossier de fichiers

# 方法一
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)

🎜>

pip install rarfile
format rar

le format rar n'a pas de bibliothèque standard python correspondante et doit s'appuyer sur des bibliothèques tierces rarfile, python-unrar, pyUnRAR2, etc. les bibliothèques ci-dessus ont quelque chose en commun Cela dépend de la prise en charge de la bibliothèque UnRAR de RARLAB Ce qui suit présente principalement la bibliothèque rarfile :

Installation et configuration

Commande d'installation :

LookupError: Couldn't find path to unrar library.
<.>Mais la configuration est parfois assez coûteuse. Vous devez d’abord télécharger et installer UnRAR. Étant donné que le système d'exploitation de mon ordinateur est Windows, je peux télécharger UnRarDLL depuis le site officiel de RARLAB et l'installer sur le chemin par défaut C:Program Files (x86)UnrarDLL.
Ensuite, ajoutez des variables d'environnement. Tout d'abord, ajoutez C:Program Files (x86)UnrarDLLx64 (mon système est 64 bits) à la variable Path dans les variables système (clic droit sur ordinateur> Propriétés> Paramètres système avancés> Avancé> ; Variables d'environnement), mais l'erreur est toujours signalée après le redémarrage de PyCharm :

# mode的值只能为&#39;r&#39;
class rarfile.RarFile(rarfile, mode=&#39;r&#39;, charset=None, info_callback=None, crc_check=True, errors=&#39;stop&#39;)

Essayez ensuite de créer une nouvelle variable dans les variables système, entrez ?UNRAR_LIB_PATH pour le nom de la variable, et la valeur de la variable est ?C:Program Fichiers (x86)UnrarDLLx64UnRAR64.dll (32 La valeur de la variable sous le système de bits est C:Program Files (x86)UnrarDLLUnRAR.dll). Redémarrez PyCharm et le problème est résolu.

Utilisation de base

L'utilisation de la bibliothèque rarfile est très similaire à celle du fichier zip et inclut également extract(), extractall(), namelist(), infolist(), getinfo (), open(), read(), printdir() et d'autres fonctions, la principale différence est que l'objet RarFile ne prend en charge que le mode lecture et ne peut pas écrire de fichiers.

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

Utiliser la bibliothèque rarfile pour décompresser les packages compressés rar équivaut à utiliser la bibliothèque zipfile pour décompresser les packages compressés au format zip. Veuillez vous référer à l'utilisation de la bibliothèque zipfile.

De plus, l'installation, la configuration et l'utilisation de la bibliothèque python-unrar sont très similaires à la bibliothèque rarfile, mais la bibliothèque python-unrar ne prend pas en charge l'instruction with si vous souhaitez utiliser l'instruction with. , vous pouvez aller dans le répertoire d'installation de la bibliothèque python-unrar. Ajoutez l'instruction suivante au fichier rarfile.py :

tarfile.open(name=None, mode=&#39;r&#39;, fileobj=None, bufsize=10240, **kwargs)

format tar

le format tar est un packaging courant format de fichier sous les systèmes Unix. Il peut être associé à différentes méthodes de compression. Formez différents formats de fichiers compressés, tels que : .tar.gz (.tgz), .tar.bz2 (.tbztb2), .tar.Z (.taz). , .tar.lzma (.tlz), .tar.xz ( .txz) etc. Le format tar correspond au fichier tar de la bibliothèque standard Python. Les formats pris en charge incluent : tar, tar.gz, tar.bz2, tar.xz, .tar.lzma, etc.
Utilisation de base de la bibliothèque tarfile :

Créer des objets tarfile

La bibliothèque tarfile crée des objets en utilisant tarfile.open() au lieu de tarfile.TarFile().

tarfile.open(name=None, mode=&#39;r&#39;, 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=&#39;.&#39;)

解压符合某些条件的文件

# 解压后缀名为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(&#39;test.tar&#39;,&#39;w:gz&#39;)
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库,以后有机会再详细介绍。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn