前言
.rar 和 .zip 是两种常见的压缩文件格式,.rar 压缩率比zip高,但速度慢,随机访问的速度慢。.zip 可以通过第三方库 zipfile 来进行压缩和解压;.rar 可以通过第三方库 unrar 中的 rarfile 来进行解压(参考),但是笔者目前没有找到可以方便地将批量文件/文件夹压缩成 .rar 格式的工具。
直到看到博文Python实现加密压缩成RAR或ZIP文件 中提供的思路:直接用 Python 调用 Windows 系统下的 CMD 命令进行压缩。
CMD命令参数
调用压缩成 .rar 的 CMD 命令为:
C:/"Program Files"/WinRAR/WinRAR.exe a D:/test/data.rar D:/test/data.txt
C:/"Program Files"/WinRAR/WinRAR.exe a D:/test/folder.rar D:/test/folder
命令参数解释:
- 第一个参数为 WinRAR 软件的安装路径,(需要在电脑上安装 WinRAR)
- 第二个参数a表示添加压缩,
- 第三个参数为压缩文件的输出路径及其压缩的文件名,
- 第四个参数为待压缩的文件路径,如果是单个文件需要具体到文件名,如果是文件夹下所有文件,只需到当前文件夹路径。
—— NOTE:如果任意一个路径名中含有空格,一定要用引号引起来,否则会报错!!为了保险起见,建议第一、三和四个参数统统通用引号引起来:
"C:/Program Files/WinRAR/WinRAR.exe" a"D:/test/data.rar""D:/test/data.txt"
"C:/Program Files/WinRAR/WinRAR.exe" a"D:/test/folder.rar""D:/test/folder"
—— NOTE:如果需要压缩成 .zip 格式,只需要修改输出文件的后缀名即可。
待压缩文件路径的级别
第四个参数——待压缩的文件路径从哪一级目录开始,压缩包就从哪一级目录开始。
举个例子,现在我的D:\
中存在一个文件夹test
,目录结构如下:
D:\
|_test\
|_data.txt
|_folder\
|_data1.txt
|_data2.txt
|_subfolder\
|_data3.txt
|_data4.txt
情形1:输入完整的路径
当我想压缩文件夹folder\
时,执行命令:
"C:/Program Files/WinRAR/WinRAR.exe" a"D:/test/folder.rar""D:/test/folder"
生成的folder.rar
目录结构如下:
folder.rar\
|_test\
|_folder\
|_data1.txt
|_data2.txt
|_subfolder\
|_data3.txt
|_data4.txt
我们实际想压缩的是文件夹folder
,压缩的结果是从系统盘D:\
下的test\
开始(不过test\
下的其它文件不会被压缩进去,如上面的data.txt
)。
同理,当我只想压缩subfolder\
时,若执行如下命令:
"C:/Program Files/WinRAR/WinRAR.exe" a"D:/test/folder/subfolder.rar""D:/test/folder/subfolder"
生成的subfolder.rar
目录结构如下:
subfolder.rar\
|_test\
|_folder\
|_subfolder\
|_data3.txt
|_data4.txt
情形2:只输入需要压缩的文件/文件夹名
如果不想要多余的上级目录,可以将CMD命令行的当前工作路径切换到该文件/文件夹所在的目录。
示例如下,当我想压缩文件夹folder\
时,执行命令:
cd"D:/test/""C:/Program Files/WinRAR/WinRAR.exe" a"folder.rar""folder"
生成的folder.rar
目录结构如下:
folder.rar\
|_folder\
|_data1.txt
|_data2.txt
|_subfolder\
|_data3.txt
|_data4.txt
同理,当我只想压缩subfolder\
时,若执行如下命令:
cd"D:/test/folder/""C:/Program Files/WinRAR/WinRAR.exe" a"subfolder.rar""subfolder"
生成的subfolder.rar
目录结构如下:
subfolder.rar\
|_subfolder\
|_data3.txt
|_data4.txt
Python 调用CMD命令
弄清楚 CMD 命令后,例用 Python 进行实现就很容易了,实现方式为:os.system
。
具体实现代码如下:
import osdefcompress(input_file, output_file, root_path,
rar_path='C:/"Program Files"/WinRAR/WinRAR.exe'):"""
调用CMD命令压缩文件/文件夹
Parameters
----------
input_file : 需要压缩的文件/文件夹名。从哪一级目录开始,就会从哪一级开始压缩;
output_file : 压缩文件的输出路径及其压缩的文件名;
可以是.rar, .zip;
root_path: input_file 所在目录;
rar_path : WinRAR软件的安装路径,
The default is 'C:/"Program Files"/WinRAR/WinRAR.exe'.
NOTE: 路径和文件名中带空格的时候一定要多加一重引号!!
"""
cmd_command= r'%s a %s %s'%(rar_path, output_file, input_file)
os.chdir(root_path)# 切换工作目录
os.system(cmd_command)if os.system(cmd_command)==0:print('Successful backup to', output_file)else:print('Backup FAILED', input_file)
Python实现自动批量压缩
现在我的需求是:在 root_path 目录下有大量的文件/文件夹,需要逐个对其进行压缩成 .rar 格式。
实现如下:
root_path="D:/test/folder/"
lists= os.listdir(root_path)for fpin lists:
input_file='"'+ fp+'"'#待压缩的文件路径及文件,多加一重引号
output_file='"'+ fp+'.rar"'#压缩文件的输出路径及文件名,多加一重引号
compress(input_file, output_file, root_path)
大功告成!
参考阅读
- Python实现加密压缩成RAR或ZIP文件 (好文,非常感谢)
- python文件rar, zip,tar, gz压缩,解压缩文件 (参考使用其中的
make_targz()
方法时出现问题)