当前位置:首页>python>《告别付费软件!用Python自建RAR批量转ZIP工具,省钱又省心,赶紧来get!》-附源码和exe

《告别付费软件!用Python自建RAR批量转ZIP工具,省钱又省心,赶紧来get!》-附源码和exe

  • 2026-10-05 14:52:02
《告别付费软件!用Python自建RAR批量转ZIP工具,省钱又省心,赶紧来get!》-附源码和exe

“带你横跨办公自动化的数据江海”

@摸鱼

闻道有先后,术业有专攻。各位大佬们大家好!~我是你们的老朋友摸鱼~,本人在十多年的日常工作中摸爬滚打攒了不少Python办公自动化的实用项目技巧,自创立"码海听潮"公众号以来,已经陆续分享70多篇原创文章啦!里面满满的办公实操干货,希望能与各位大佬共同探讨办公效率提升之道,实现不加班自由。

好叻,多了不说,少了不唠,咱直接上干货。

办公需求场景

从崩溃到优雅的进化

有一个神秘的rar格式的压缩文件夹,里面有多个.rar格式的压缩文件,现在的需求是把所有的.rar格式压缩文件转为.zip格式的压缩文件, 要是这种类似的需求你的Big Boss安排你去完成,请问阁下该如何应对?

需求的rar压缩文件夹如下图:

  • rar压缩文件夹列表

办公痛点分析

01

 痛点1:重复劳动多,效率极低

    • 如果压缩文件数量很多,逐个打开、解压、再重新压缩为ZIP格式会非常耗时且枯燥。

    02

     痛点2:可能中断

      • 人工操作容易因疲劳或疏忽导致遗漏或中断,尤其是在文件数量庞大时。

      03

      痛点3:多层嵌套结构

      • 如果RAR文件内部还包含其他RAR文件(多层嵌套),人工逐层处理会更加繁琐。

      由此可见若操作成百上千个rar格式压缩文件的话整个操作流程繁琐且耗时,高频次的鼠标点击和键盘输入使操作者手指疲劳,堪称"键盘敲冒烟"式的体力劳动,加上人工疲劳操作极易导致遗漏文件夹。于是乎这时候,按以往的 “解题套路”,Python 的专属 BGM 该响起来了 ——go~ go~ go~,救苦救难的大救星这不就来了!!

      @摸鱼

      问题拆解思路

      1.遍历文件夹→

      2.对rar文件逐个打开、解压、再重新压缩为zip文件→

      下面,我就用python代码让excel见识一下,什么叫"传统文化遇上赛博效率"(仅展示部分代码,非完整代码,需完整代码看文章末尾说明~)

      import sysfrom PyQt6.QtWidgets import (    QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,    QPushButton, QLineEdit, QTextEdit, QFileDialog, QMessageBox,    QLabel, QFrame, QGroupBox)from PyQt6.QtGui import QColor, QPaletteclass RarToZipWindow(QMainWindow):    def __init__(self):        super().__init__()        self.init_ui()        self.setWindowTitle("RAR 批量转 ZIP 工具")        self.setGeometry(100, 100, 750, 600)        self.setStyleSheet("""            QMainWindow {                background-color: #f5f7fa;            }            QGroupBox {                font-weight: bold;                border: 2px solid #3498db;                border-radius: 8px;                margin-top: 12px;                padding-top: 10px;            }            QGroupBox::title {                subcontrol-origin: margin;                left: 10px;                padding: 0 5px 0 5px;                color: #2c3e50;            }            QPushButton {                background-color: #3498db;                color: white;                border: none;                padding: 8px 16px;                border-radius: 4px;                font-weight: bold;                font-size: 13px;            }            QPushButton:hover {                background-color: #2980b9;            }            QPushButton:pressed {                background-color: #1c6ea4;            }            QPushButton:disabled {                background-color: #95a5a6;                color: #7f8c8d;            }            QLineEdit {                padding: 8px;                border: 2px solid #bdc3c7;                border-radius: 4px;                font-size: 13px;            }            QLineEdit:focus {                border-color: #3498db;            }            QTextEdit {                border: 2px solid #bdc3c7;                border-radius: 4px;                font-family: 'Consolas', 'Microsoft YaHei';                font-size: 12px;                background-color: white;            }            QLabel {                color: #2c3e50;                font-size: 13px;            }        """)    def init_ui(self):        central = QWidget()        self.setCentralWidget(central)        main_layout = QVBoxLayout(central)        main_layout.setSpacing(15)        main_layout.setContentsMargins(25, 25, 25, 25)        # ========== 配置区域 ==========        config_group = QGroupBox("配置")        config_layout = QVBoxLayout(config_group)        config_layout.setSpacing(12)        # UnRAR路径设置        unrar_layout = QHBoxLayout()        unrar_label = QLabel("UnRAR路径:")        unrar_label.setFixedWidth(100)        self.unrar_edit = QLineEdit()        self.unrar_edit.setPlaceholderText("请选择 UnRAR.exe 文件路径")        self.btn_unrar = QPushButton("浏览")        self.btn_unrar.clicked.connect(self.choose_unrar)        self.btn_unrar.setFixedWidth(80)        unrar_layout.addWidget(unrar_label)        unrar_layout.addWidget(self.unrar_edit)        unrar_layout.addWidget(self.btn_unrar)        config_layout.addLayout(unrar_layout)        # 目标目录设置        dir_layout = QHBoxLayout()        dir_label = QLabel("目标目录:")        dir_label.setFixedWidth(100)        self.dir_edit = QLineEdit()        self.dir_edit.setPlaceholderText("请选择包含RAR文件的文件夹")        self.btn_dir = QPushButton("浏览")        self.btn_dir.clicked.connect(self.choose_dir)        self.btn_dir.setFixedWidth(80)        dir_layout.addWidget(dir_label)        dir_layout.addWidget(self.dir_edit)        dir_layout.addWidget(self.btn_dir)        config_layout.addLayout(dir_layout)        main_layout.addWidget(config_group)        # ========== 控制按钮区域 ==========        control_frame = QFrame()        control_layout = QHBoxLayout(control_frame)        control_layout.setSpacing(15)        self.btn_start = QPushButton("🚀 开始转换")        self.btn_start.setStyleSheet("""            QPushButton {                background-color: #27ae60;                font-size: 14px;                padding: 10px 20px;            }            QPushButton:hover {                background-color: #219653;            }        """)        self.btn_start.clicked.connect(self.start)        self.btn_stop = QPushButton("⏹️ 停止")        self.btn_stop.setStyleSheet("""            QPushButton {                background-color: #e74c3c;                font-size: 14px;                padding: 10px 20px;            }            QPushButton:hover {                background-color: #c0392b;            }        """)        self.btn_stop.clicked.connect(self.stop)        self.btn_stop.setEnabled(False)        self.btn_clear = QPushButton("🗑️ 清空日志")        self.btn_clear.clicked.connect(self.clear_log)        control_layout.addStretch()        control_layout.addWidget(self.btn_start)        control_layout.addWidget(self.btn_stop)        control_layout.addWidget(self.btn_clear)        control_layout.addStretch()        main_layout.addWidget(control_frame)        # ========== 日志区域 ==========        log_group = QGroupBox("转换日志")        log_layout = QVBoxLayout(log_group)        self.log = QTextEdit()        self.log.setReadOnly(True)        self.log.setMinimumHeight(300)        log_layout.addWidget(self.log)        main_layout.addWidget(log_group, 1)  # 给日志区域分配更多空间        self.log_append("📢 欢迎使用RAR批量转ZIP工具")        self.log_append("1. 点击【浏览】选择UnRAR.exe路径")        self.log_append("2. 点击【浏览】选择包含RAR文件的文件夹")        self.log_append("3. 点击【开始转换】按钮进行批量转换")        self.log_append("-" * 50)    def log_append(self, text):        self.log.append(text)        # 自动滚动到底部        scrollbar = self.log.verticalScrollBar()        scrollbar.setValue(scrollbar.maximum())    def choose_unrar(self):        path, _ = QFileDialog.getOpenFileName(            self,             "选择 UnRAR.exe",             "",             "可执行文件 (*.exe);;所有文件 (*.*)"        )        if path:            self.unrar_edit.setText(path)            self.log_append(f"✅ 已设置 UnRAR:{path}")    def choose_dir(self):        path = QFileDialog.getExistingDirectory(self, "选择包含RAR文件的文件夹")        if path:            self.dir_edit.setText(path)            self.log_append(f"📂 已选择目录:{path}")    def start(self):        unrar = self.unrar_edit.text().strip()        folder = self.dir_edit.text().strip()        if not unrar:            QMessageBox.warning(self, "提示", "请选择有效的 UnRAR.exe 文件")            return        if not folder:            QMessageBox.warning(self, "提示", "请选择有效的转换目录")            return        self.btn_start.setEnabled(False)        self.btn_stop.setEnabled(True)        self.log_append("🔍 正在扫描文件...")        self.log_append("🚀 开始转换...")        self.log_append("✅ 这是一个示例日志")    def stop(self):        reply = QMessageBox.question(            self, "确认停止",             "确定要停止转换过程吗?",            QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,            QMessageBox.StandardButton.No        )        if reply == QMessageBox.StandardButton.Yes:            self.log_append("⏹️ 用户请求停止转换...")            self.btn_start.setEnabled(True)            self.btn_stop.setEnabled(False)    def clear_log(self):        self.log.clear()        self.log_append("🗑️ 日志已清空")        self.log_append("-" * 50)# ------------------------------------------------------------------------------# 入口# ------------------------------------------------------------------------------if __name__ == "__main__":    app = QApplication(sys.argv)    # 设置应用程序样式    app.setStyle("Fusion")    # 设置调色板    palette = QPalette()    palette.setColor(QPalette.ColorRole.Window, QColor(240, 242, 245))    palette.setColor(QPalette.ColorRole.WindowText, QColor(44, 62, 80))    app.setPalette(palette)    win = RarToZipWindow()    win.show()    sys.exit(app.exec())

      最终将所有的rar文件转为了zip文件,实现了之前既定的需求...

      通过上面Python自动化脚本,仅用1分钟的时间就完成原需手动操作数小时的工作任务。从最初准备手动人工机械操作的麻木到用python实现高效自动化的畅快,工作效率获得指数级提升,终于实现了不加班熬夜的自由!

      大佬们也可以举一反三,参照上面的代码思路根据自己工作中的实际情况来具体问题具体分析,实现自己定制化的需求。

      结语

      当Python遇见办公,牛马打工人终于笑出了猪叫声

      【职场人必看】每天早上一睁眼,想到又要面对:

      1.📊 堆积如山的Excel表格

      2.📑 机械重复的复制粘贴

      3.✍️ 永远改不完的各类文档

      4.诸如此类的更多........

      是不是连Ctrl+Alt+Delete的心都有了?

      别慌!别急,摸鱼这位“职场外挂”已经带着Python代码来拯救你了!

      友情提示:考虑到没有python环境的朋友需要打包好的成品exe,摸鱼早已贴心打包好,本篇文章代码打包的exe截图如下:

      另外,《码海听潮》公众号所有文章码和exe程序已打包好上传绿联nas私有云,有需要的大佬扫一扫上面博主的个人微信二维码,需要的大佬需支付9.9元永久拥有公众号资源(写原创干货费时费力,属实不易),邀请您进入社区群获取下载链接!!,群内提供python办公自动化交流问题,解决问题,且码海听潮微信公众号文章发布会第一时间会更新到群里,非诚勿扰哈!

      码海听潮官方社区群如下:

      赶紧微信扫一扫下方二维码添加摸鱼君微信

      最新文章

      随机文章