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

2022-05-18 17:21:02

前言

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

大功告成!

参考阅读

  • 作者:假如我年华正好
  • 原文链接:https://blog.csdn.net/qq_37851620/article/details/118083373
    更新时间:2022-05-18 17:21:02