ホームページ  >  記事  >  バックエンド開発  >  Pythonでファイル形式を解凍する基本的な方法

Pythonでファイル形式を解凍する基本的な方法

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼オリジナル
2019-06-14 14:29:387870ブラウズ

複数の圧縮パッケージ形式を処理する Python ライブラリ: patool。基本的な解凍、パッケージ化、その他の操作のみを使用し、さまざまな圧縮形式に対応する Python ライブラリについて詳しく知りたくない場合は、patool が良い選択となるはずです。

関連する推奨事項: 「Python ビデオ

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)、XZ (.xz)、ZIP (.zip、.jar、.cbz)、および ZOO (.zoo)

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")

ただし、patool の通常の動作は他の解凍ソフトに依存します。 7z と Rtools の 2 つのプログラムでは、対応する圧縮ファイルを処理できるソフトウェアがコンピュータ上にない場合、エラーが報告されます:

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

さらに、patool はパスワードで保護されたファイルを処理できません圧縮ファイル。
patool に似たライブラリには、pyunpack と easy-extract があります。pyunpack ライブラリは zipfile と patool に依存し、2 つのライブラリでサポートされるすべての圧縮形式をサポートし、事前にインストールする必要があります。easy-extract ライブラリは解凍に依存します。ソフトウェア unrar、7z、par2 を事前にインストールする必要があり、さまざまな解凍形式にも対応しています。

一般的な圧縮形式の処理

対応する圧縮ソフトウェアがコンピューターにインストールされておらず、圧縮および解凍操作に Python を使用したい場合は、次のコマンドを使用できます。その他の詳細は以下をご覧ください。 いくつかの一般的な

zip 形式の紹介

zip 形式を処理できる Python ライブラリには、Python 標準ライブラリ zipfile やサードパーティ ライブラリ python-archive などがあります。主に以下を紹介します zipfile ライブラリの基本的な使い方を見てみましょう:
まず、ZipFile オブジェクトを作成します:

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

ファイル パッケージを解凍します 解凍関数は、extract() と 2 つあります。 extractall()。前者は 1 つのファイルを解凍でき、デフォルトでは現在のディレクトリに解凍されます。後者は複数のファイルをバッチで解凍でき、デフォルトではすべてのファイルを解凍できます。 extract() と extractall() の両方にパラメーター pwd があり、パスワードを使用して圧縮パッケージを処理できます。

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

圧縮ファイルの作成: zipfile には、ファイルを圧縮するための 4 つの方法があります: zipfile.ZIP_STORED (デフォルト)、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)

ファイル全体を圧縮します フォルダー

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

rar 形式

rar 形式には、対応する Python 標準ライブラリがなく、サードパーティのライブラリである rarfile、python-unrar、pyUnRAR2 などに依存する必要があります。上記のライブラリには共通点があります RARLAB の UnRAR ライブラリのサポートに依存します 以下では主に rarfile ライブラリを紹介します:

インストールと構成
インストール コマンド:

pip install rarfile

しかし、構成にはかなりの費用がかかる場合があります。まず、UnRAR をダウンロードしてインストールする必要があります。私のコンピュータのオペレーティング システムは Windows なので、RARLAB 公式 Web サイトにアクセスして UnRarDLL をダウンロードし、デフォルト パス C:\Program Files (x86)\UnrarDLL にインストールします。
次に、環境変数を追加します。まず、C:\Program Files (x86)\UnrarDLL\x64 (私のシステムは 64 ビットです) をシステム変数の Path 変数に追加します (コンピューターを右クリックし、[プロパティ] > [詳細システム] を選択します)設定 >詳細>環境変数) を選択しましたが、PyCharm を再起動した後もエラーが報告されます:

LookupError: Couldn't find path to unrar library.

次に、システム変数に新しい変数を作成してみ、変数名と変数値として ?UNRAR_LIB_PATH を入力します。 ?C:\Program Files (x86) \UnrarDLL\x64\UnRAR64.dll です (32 ビット システムでの変数値は C:\Program Files (x86)\UnrarDLL\UnRAR.dll です)。 PyCharm を再起動すると問題は解決します。

基本的な使用法

rarfile ライブラリの使用法は zipfile と非常によく似ており、extract()、extractall()、namelist()、infolist()、 getinfo ()、open()、read()、printdir() などの関数との主な違いは、RarFile オブジェクトは読み取りモードのみをサポートし、ファイルの書き込みはできないことです。

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

rarfile ライブラリを使用して rar 圧縮パッケージを解凍する方法は、zipfile ライブラリを使用して zip 形式の圧縮パッケージを解凍するのと同じです。zipfile ライブラリの使用方法を参照してください。

さらに、python-unrar ライブラリのインストール、セットアップ、使用方法は rarfile ライブラリとよく似ていますが、python-unrar ライブラリは with ステートメントをサポートしていません。 , python-unrar ライブラリのインストール ディレクトリに移動し、次のステートメントを rarfile.py ファイルに追加します:

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

tar format

tar format is a common 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。