用 Python 实现批量压缩成 .rar 或 .zip 文件

前言

.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 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)    

Python实现自动批量压缩

现在我的需求是:在 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)

大功告成!

参考阅读

  • Python实现加密压缩成RAR或ZIP文件 (好文,非常感谢)
  • python文件rar, zip,tar, gz压缩,解压缩文件 (参考使用其中的make_targz()方法时出现问题)

你可能感兴趣的:(python,python,cmd,rar)