.rar 和 .zip 是两种常见的压缩文件格式,.rar 压缩率比zip高,但速度慢,随机访问的速度慢。.zip 可以通过第三方库 zipfile 来进行压缩和解压;.rar 可以通过第三方库 unrar 中的 rarfile 来进行解压(参考),但是笔者目前没有找到可以方便地将批量文件/文件夹压缩成 .rar 格式的工具。
直到看到博文 Python实现加密压缩成RAR或ZIP文件 中提供的思路:直接用 Python 调用 Windows 系统下的 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
命令参数解释:
—— 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
弄清楚 CMD 命令后,例用 Python 进行实现就很容易了,实现方式为:os.system
。
具体实现代码如下:
import os
def compress(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)
现在我的需求是:在 root_path 目录下有大量的文件/文件夹,需要逐个对其进行压缩成 .rar 格式。
实现如下:
root_path = "D:/test/folder/"
lists = os.listdir(root_path)
for fp in lists:
input_file = '"' + fp + '"' #待压缩的文件路径及文件,多加一重引号
output_file = '"' + fp + '.rar"' #压缩文件的输出路径及文件名,多加一重引号
compress(input_file, output_file, root_path)
大功告成!
make_targz()
方法时出现问题)