Python解压常见格式的压缩文件

网络下载的视频文件通常都是压缩文件,以 rar 格式诸多。为了方便在 Android 系统中播放,所以想一次性将某个文件夹的文件全部解压。以下代码能对 rar, zip, gz, tgz 和 tar 格式且没有密码的文件进行解压。

安装相关库

需要安装第三方库 unrar 和 rarfile,都可以用 pip 命令安装:

pip install rarfile
pip install unrar

在安装这两个第三方库以后,还需要在操作系统中安装执行 rar 解压的依赖文件。以 Windows 系统为例,先到 RARLab 官方下载库文件 http://www.rarlab.com/rar/UnRARDLL.exe,这是一个压缩包,双击解压,使用默认的安装位置:C:\Program Files (x86)\UnrarDLL。

解压后,根据操作系统的位置,配置环境变量。进入 UnrarDLL 文件夹,可以看到文件夹下有一个 UnRAR.dll 文件,在文件夹下有一个 x64 文件夹,里面放的是 64 位的文件。根据操作系统的版本,配置一个名为 UNRAR_LIB_PATH 的环境变量:

Python解压常见格式的压缩文件_第1张图片

代码

import gzip
import os
import tarfile
import zipfile
from unrar import rarfile

def decompress_rar(src_file, dest_dir):
    """
    Decompress rar file into destination direction
    """
    rv = (True, '')

    try:
        rar = rarfile.RarFile(src_file)
        rar.extractall(dest_dir)
    except Exception as e:
        rv = (False, e)
        return rv

    return rv


def decompress_tar_and_tgz(src_file, dest_dir):
    """
    Decomporess .tar or .tgz file into destination directory
    """
    rv = (True, '')
    try:
        tar = tarfile.open(src_file)
        names = tar.getnames()
        for name in names:
            tar.extract(name, dest_dir)
        tar.close()
    except Exception as e:
        rv = (False, e)
        return rv

    return rv


def decompress_zip(src_file, dest_dir):
    """
    Decompress .zip file into destination folder
    """
    rv = (True, '')
    try:
        zip_file = zipfile.ZipFile(src_file)
        for name in zip_file.namelist():
            zip_file.extract(name, dest_dir)
        zip_file.close()
    except Exception as e:
        rv = (False, e)
        return rv
    
    return rv

def decompress_gz(src_file, dest_dir):
    """
    Decompress .gz file into destination folder
    """
    rv = (True, "")
    try:
        fname = dest_dir + '/' + os.path.basename(src_file)
        gfile = gzip.GzipFile(src_file)
        open(fname, "w+").write(gfile.read())
        gfile.close()
    except Exception as e:
        rv = (False, e)
        return rv

    return rv


def decompress(src_file, dest_dir):
    fname, ext = os.path.splitext(src_file)

    if ext in ('.tgz', '.tar'):
        decompress_tar_and_tgz(src_file, dest_dir)
    elif ext == '.zip':
        decompress_zip(src_file, dest_dir)        
    elif ext == '.rar':
        decompress_rar(src_file, dest_dir)
    elif ext == '.gz':
        decompress_gz(src_file, dest_dir)


def decompress_folder(src_dir):
    files = os.listdir(src_dir)

    for fname in files: # fname is file name with extension
        name, ext = os.path.splitext(fname) # name is file name without extension
        src_file = os.path.join(src_dir, fname)
        dest_path = os.path.join(src_dir, name)
        if not os.path.exists(dest_path):
            os.mkdir(dest_path)

        decompress(src_file, dest_path)
        print(src_file, 'was decompressed.')


if __name__ == '__main__':
    src_dir = r'D:\some_folder_name'
    decompress_folder(src_dir)

利用 winrar 软件进行解压

winrar 提供命令行解压,Python 语言可以调用 winrar 命令。在执行命令之前,把 winrar.exe 所在的路径加到环境变量。然后,比如,我们要把 D:\test 下所有 zip 文件解压,可以用下面的命令:

winrar.exe x D:\test\*.zip D:\test\unzip\

winrar 的命令行参数很多,这里不展开,x 表示使用绝对路径进行解压。Python 对 winrar 命令进行封装的代码如下:

import os

def unzip_folder(sourcepath):
    if sourcepath[-1:] == "\\":
        files = sourcepath + "*.zip"
    else:
        files = sourcepath + "\\" + "*.zip"

    dest = sourcepath + "\\unzip\\"

    cmd = 'WinRAR.exe x {} {}'.format(files, dest)
    os.system(cmd)  


if __name__ == "__main__":
    source_folder = r"D:\test\\"
    unzip_folder(source_folder)

你可能感兴趣的:(Python)