其他
数据治理 | 如何用 Python 批量压缩/解压缩文件
目录
一、前言
二、常用的压缩包格式
三、Python压缩文件
使用 zipfile 库创建 .zip 文件
调用 WinRAR 创建多种格式压缩文件
四、Python解压缩文件
使用 zipfile 库解压 .zip 文件
调用 WinRAR 解压缩
五、结语
本文共4473个字,阅读大约需要12分钟,欢迎指正!
Part1前言
Part2常用的压缩包格式
压缩格式 | 特点 |
---|---|
.zip | 免费开源的,可用于几乎所有操作系统;压缩效率稍逊于.rar格式;安全性稍逊于.rar格式。 |
.rar | 收费的,其版权归 Alexander Roshal 所有;需要使用 WinRAR 软件进行压缩/解压;.rar格式压缩率和安全性强于 .zip 格式。 |
Part3Python 压缩文件
1使用 zipfile 库创建 .zip 文件
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 命令。数据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)
Part4Python 解压缩文件
3使用 zipfile 库解压 .zip 文件
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))
Part5结语
我们将在数据治理板块中推出一系列原创推文,帮助读者搭建一个完整的社科研究数据治理软硬件体系。该板块将涉及以下几个模块(点击标题即可跳转至相应合集):
计算机基础知识 编程基础 数据采集 数据存储 数据清洗 数据实验室搭建 数据治理特别篇
星标⭐我们不迷路!想要文章及时到,文末“在看”少不了!
往期推荐
点击搜索你感兴趣的内容吧
数据Seminar
这里是大数据、分析技术与学术研究的三叉路口
文 | 两米哥
欢迎扫描👇二维码添加关注