查看原文
其他

数据治理 | 如何用 Python 批量压缩/解压缩文件

快点关注→ 数据Seminar 2022-12-31

目录

一、前言

二、常用的压缩包格式

三、Python压缩文件

  1. 使用 zipfile 库创建 .zip 文件

  2. 调用 WinRAR 创建多种格式压缩文件

四、Python解压缩文件

  1. 使用 zipfile 库解压 .zip 文件

  2. 调用 WinRAR 解压缩

五、结语

本文共4473个字,阅读大约需要12分钟,欢迎指正!

Part1前言

在日常工作学习中,我们经常使用压缩文件,为了传输方便,为了备份数据,或是为了节省硬盘空间……总之压缩文件很常用。一般情况下我们会手动压缩和解压文件,可是当我们需要解压100个文件,或者需要分别压缩100个文件,这时一个一个手动处理属实为下下之策。如果你遇到过这样的情况,不妨看看本期技术分享,咱们研究一下怎么用 Python 自动化压缩/解压缩文件

Part2常用的压缩包格式

一般来说,咱们日常使用最频繁的压缩格式主要有两种:.zip格式以及 .rar格式。两者特点如下表所示:
压缩格式特点
.zip免费开源的,可用于几乎所有操作系统;压缩效率稍逊于.rar格式;安全性稍逊于.rar格式。
.rar收费的,其版权归 Alexander Roshal 所有;需要使用 WinRAR 软件进行压缩/解压;.rar格式压缩率和安全性强于 .zip 格式。

Part3Python 压缩文件

1使用 zipfile 库创建 .zip 文件

zip 的压缩算法是开源的,所以 Python 也可以提供 .zip 格式的压缩和解压。在 Python 中创建 .zip 压缩文件以及解压缩 .zip 文件主要使用标准库 zipfile 。
需要强调的是,使用 zipfile 压缩一个文件和压缩一个文件夹完全是两码事,尽管可以用一个方法将这两件事办成,但为了更容易理解,还是分开介绍他们吧。
压缩文件的代码如下:
import zipfile,os
# 定义压缩文件的方法
def file_to_zip(filepath, zipath):
    '''
    filepath : 待压缩文件的路径
    zipath   :压缩后文件的路径
    '
''
    zf = zipfile.ZipFile(zipath, 'w', zipfile.ZIP_DEFLATED) # 创建压缩文件对象
    zf.write(filepath, os.path.basename(filepath)) # 传入待压缩文件路径,进行压缩
    zf.close()

filepath = 'D:\\Files\\数据A\\数据A_0.xlsx'
zipath = 'D:\\Files\\数据A_0.zip'
file_to_zip(filepath, zipath)
压缩文件夹的代码如下:
# 定义压缩文件夹的方法
def folder_to_zip(folderpath, zipath):
    """
    folderpath : 待压缩文件夹的路径
    zipath     :压缩后文件存放的路径    
    "
""
    zip = zipfile.ZipFile(zipath, "w", zipfile.ZIP_DEFLATED)
    for path, dirnames, filenames in os.walk(folderpath):
        # 将待压缩文件夹下的所有文件逐一添加到压缩文件
        fpath = path.replace(os.path.dirname(folderpath), '')
        for filename in filenames:
            zip.write(os.path.join(path, filename), os.path.join(fpath, filename))
    zip.close()

folderpath= 'D:\\Files\\数据A'
zipath = 'D:\\Files\\数据A.zip'
folder_to_zip(folderpath, zipath)

💡提示:

尽管使用以上代码可以将文件(夹)压缩为扩展名为 .rar 的压缩文件,但实际上那并不是真的 rar 压缩文件(类似于将 .zip 文件重命名为 .rar 文件),实际上还是 .zip 压缩包。

2调用 WinRAR 创建多种格式压缩文件

WinRAR 是一款功能强大的压缩包管理器,它不仅支持手动压缩/解压缩,还可以在命令行中使用命令来压缩/解压文件,Windows 系统安装 WinRAR 软件后,进入 WinRAR 安装路径(下图中的路径是Windows 安装 WinRAR 的默认路径),打开 WinRAR 帮助程序即可查阅 WinRAR 命令。
这样一来,我们就可以使用 Python 在命令行中运行压缩命令来完成压缩任务,如下图所示,我们调用 WinRAR 软件将数据A文件夹中的所有数据逐一压缩,并删除源文件,代码如下:
import os
def WinRAR_compress(filepath, compressed, WinRAR='"C:/Program Files/WinRAR/WinRAR.exe"'):
    '''
    filepath   : 待压缩文件的名称
    compressed : 压缩后文件的名称
    WinRAR     : WinRAR 程序的绝对路径
    '
''
    # 使用 os.system() 可以执行 cmd 命令,执行成功会返回 0
    # 先使用 cd 命令切换工作路径到待压缩文件(夹)所在的目录
    # 如果不切换工作路径,压缩后的文件中将含有目标文件的所有父文件夹
    cd = 'cd /d D:\Files\数据A'
    # 执行压缩文件(夹)的命令
    compress  = f'{WinRAR} a "{compressed}" "{filepath}"'
    state = os.system(f'{cd} && {compress }')   # 执行压缩命令并返回执行状态
    # 判断是否执行成功,若成功则跳过,若失败则会报错并提示
    assert state==0, '解压失败'

for file in os.listdir(r'D:\Files\数据A'):
    # 压缩文件(夹)
    WinRAR_compress(file, os.path.splitext(file)[0] + '.zip')
    # 压缩后删除源文件
    filepath = os.path.join(r'D:\Files\数据A', file)
    if os.path.exists(filepath): os.remove(filepath)
由于是调用 WinRAR 软件进行压缩,所以这种方法也可以压缩任何 WinRAR 支持的压缩格式(包括 .zip、.rar、.7z 等等),前提是你已经安装了 WinRAR
以上两种方法,我们更推荐第二种。

Part4Python 解压缩文件

首先,如果你安装了靠谱的压缩包管理器(比如 WinRAR),解压缩就成了一件容易事儿,因为 WinRAR 是支持手动批量解压缩的,鼠标选中多个压缩文件,右键即可一键解压。
不过这种方法也有不足之处——不能跨文件夹解压多个压缩文件。所以使用代码解压也就有了存在的意义。

3使用 zipfile 库解压 .zip 文件

使用 Python 解压缩文件的代码如下:
import zipfile
def unzip(zipath, savefolder):
    '''
    zipath     : 待解压文件的路径
    savefolder : 解压后文件存放的文件夹的绝对路径
    '
''
    zf = zipfile.ZipFile(zipath)  # zipfile 读取压缩文件对象
    zf.extractall(savefolder)     # 压缩文件内全部文件解压到输入的文件夹中
    zf.close()   # 关闭 zipfile 对象
    
 # 有一个压缩文件,其路径为:"D:\\Files\\数据A.zip"
 # 我们将它解压到这个文件夹下:"D:\\TEST", 如果这个文件夹不存在,那么解压过程会自动创建它
 # 那么调用以上方法解压的代码如下:
 unzip("D:\\Files\\数据A.zip""D:\\TEST")
如果需要批量解压多个文件,使用上述方法,每次传入压缩文件的路径和解压后存放的路径,循环即可。

4调用 WinRAR 解压缩

前面的创建压缩文件举例示范中,我们将 数据A 文件夹下所有文件压缩为 zip 压缩包。下面我们将演示使用 Python 调用 WinRAR 跨文件夹解压不同类型的压缩文件,为此我们事先将 数据B 文件夹下所有文件压缩为 rar 压缩包。
那么批量解压文件的代码如下:
import os,glob
def WinRAR_uncompress(compressed, filepath, WinRAR='"C:/Program Files/WinRAR/WinRAR.exe"'):
    '''
    compressed : 待解压文件的绝对路径
    filepath   : 解压后文件存放的文件夹,绝对路径
    WinRAR     : WinRAR 程序的绝对路径
    '
''
    # 由于参数全部都是绝对路径,所以无需切换工作目录,直接执行解压命令即可
    # 注意:所有路径不需要在外层添加双引号,否则可能导致解压失败
    uncompress  = f'{WinRAR} x {compressed} {filepath}'
    state = os.system(uncompress)   # 执行压缩命令并返回执行状态
    # 判断是否执行成功
    assert state==0, '解压失败'

# 读取两个文件夹下所有压缩文件的绝对路径
Copressedfiles = glob.glob(r'D:\Files\数据A\*.zip') + glob.glob(r'D:\Files\数据B\*.rar')
# 循环解压
for file in Copressedfiles:
    # 解压到压缩文件所在的文件夹中(解压到当前文件夹)
    WinRAR_uncompress(file, os.path.dirname(file))
同理,这种方式可以解压所有 WinRAR 软件支持的压缩文件类型。

Part5结语

实际上,压缩/解压缩的使用场景是很多的。比如压缩或者解压很多大文件,那么压缩或解压的过程会比较漫长;或者当我们需要完成这样一个流程去处理多个压缩文件,解压 ➔ 处理解压后的文件 ➔ 重新压缩。这样费时且繁琐的工作何必躬身力行,交给机器去做就好。
本期的技术分享到此结束,欢迎大家交流分享。
我们将在数据治理板块中推出一系列原创推文,帮助读者搭建一个完整的社科研究数据治理软硬件体系。该板块将涉及以下几个模块(点击标题即可跳转至相应合集):
  1. 计算机基础知识
  2. 编程基础
  3. 数据采集
  4. 数据存储
  5. 数据清洗
  6. 数据实验室搭建
  7. 数据治理特别篇



星标⭐我们不迷路!想要文章及时到,文末“在看”少不了!

往期推荐


“CCAD专项人才”招募计划 | 职等你来!

基本无害 | 专栏停更声明

数据治理 | 还在人工识别表格呢?Python 调用百度 OCR API 又快又准

基本无害 | 第四章第一节(全)— 工具变量和因果关系

基本无害 | 管用的工具变量——工具变量和因果关系(三)

数据治理 | csv 总乱码?教你三招,习一即可!


点击搜索你感兴趣的内容吧

数据Seminar推荐搜索      基本无害数据清理



数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


文 | 两米哥


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存