当前位置: 代码网 > it编程>前端脚本>Python > Python实现一键批量解压文件夹内的所有ZIP/RAR并自动分类

Python实现一键批量解压文件夹内的所有ZIP/RAR并自动分类

2026年08月26日 Python 我要评论
场景引入收到同事发来的 30 个 zip 压缩包,每个都要手动右键 → 解压到此处 → 整理文件。如果遇到 rar 格式,windows 自带的解压还不支持,要装第三方软件。本节用

场景引入

收到同事发来的 30 个 zip 压缩包,每个都要手动右键 → 解压到此处 → 整理文件。如果遇到 rar 格式,windows 自带的解压还不支持,要装第三方软件。

本节用 python 实现一键批量解压,自动创建对应文件夹,并分类管理。

技术原理

压缩格式python 库说明
zipzipfile(内置)原生支持
rarrarfile需安装 + 配置 unrar
tar/gztarfile(内置)原生支持
7zpy7zr需安装

目录中的所有压缩包
  ↓ 逐个检测格式
zip → zipfile 解压
rar → rarfile 解压
  ↓ 创建同名文件夹
解压内容放入 文件名/ 目录
  ↓ 分类管理
按文件类型归类解压后的文件

环境准备

# zip/tar 使用内置库,无需安装
pip install rarfile py7zr

rar 解压还需要安装 unrar 程序(windows 可从 https://www.rarlab.com/rar_add.htm 下载)。

完整代码

import os
import zipfile
import tarfile
from pathlib import path
from datetime import datetime

# ==================== zip 解压 ====================
def extract_zip(zip_path, extract_dir=none):
    """
    解压 zip 文件

    参数:
        zip_path: zip 文件路径
        extract_dir: 解压目录(默认在 zip 同级目录创建同名文件夹)
    """
    zip_file = path(zip_path)
    if extract_dir is none:
        extract_dir = zip_file.parent / zip_file.stem

    extract_dir.mkdir(parents=true, exist_ok=true)

    with zipfile.zipfile(zip_file, 'r') as zf:
        # 检查是否有密码
        has_password = any(zinfo.flag_bits & 0x1 for zinfo in zf.infolist())

        if has_password:
            password = input(f"请输入 {zip_file.name} 的密码: ").encode()
        else:
            password = none

        zf.extractall(extract_dir, pwd=password)

    print(f"[zip解压] {zip_file.name} → {extract_dir}/")
    return extract_dir


# ==================== tar/gz 解压 ====================
def extract_tar(tar_path, extract_dir=none):
    """解压 tar/tar.gz/tar.bz2 文件"""
    tar_file = path(tar_path)
    if extract_dir is none:
        extract_dir = tar_file.parent / tar_file.stem

    extract_dir.mkdir(parents=true, exist_ok=true)

    # 自动检测压缩类型
    mode = 'r:*'  # 自动检测
    with tarfile.open(tar_file, mode) as tf:
        tf.extractall(extract_dir)

    print(f"[tar解压] {tar_file.name} → {extract_dir}/")
    return extract_dir


# ==================== 批量解压 ====================
def batch_extract_all(search_dir, extract_base=none):
    """
    批量解压目录中的所有压缩包

    参数:
        search_dir: 包含压缩包的目录
        extract_base: 解压根目录(默认在源目录下创建"已解压"文件夹)
    """
    search_path = path(search_dir)

    if extract_base is none:
        extract_base = search_path / "已解压"
    extract_base.mkdir(parents=true, exist_ok=true)

    stats = {'success': 0, 'failed': 0, 'skipped': 0}

    for file_path in search_path.rglob('*'):
        if not file_path.is_file():
            continue

        suffix = file_path.suffix.lower()
        extract_dir = extract_base / file_path.stem

        # 跳过已经解压过的
        if extract_dir.exists() and any(extract_dir.iterdir()):
            stats['skipped'] += 1
            continue

        try:
            if suffix == '.zip':
                extract_zip(file_path, extract_dir)
                stats['success'] += 1

            elif suffix in ('.tar', '.gz', '.bz2', '.tgz'):
                extract_tar(file_path, extract_dir)
                stats['success'] += 1

            elif suffix == '.rar':
                try:
                    import rarfile
                    with rarfile.rarfile(file_path, 'r') as rf:
                        extract_dir.mkdir(parents=true, exist_ok=true)
                        rf.extractall(extract_dir)
                    print(f"[rar解压] {file_path.name} → {extract_dir}/")
                    stats['success'] += 1
                except importerror:
                    print(f"[跳过] {file_path.name}: 需要安装 rarfile 库")
                    stats['failed'] += 1

            elif suffix == '.7z':
                try:
                    import py7zr
                    with py7zr.sevenzipfile(file_path, 'r') as sz:
                        extract_dir.mkdir(parents=true, exist_ok=true)
                        sz.extractall(extract_dir)
                    print(f"[7z解压] {file_path.name} → {extract_dir}/")
                    stats['success'] += 1
                except importerror:
                    print(f"[跳过] {file_path.name}: 需要安装 py7zr 库")
                    stats['failed'] += 1

        except exception as e:
            print(f"[失败] {file_path.name}: {e}")
            stats['failed'] += 1

    # 汇总
    print(f"\n{'='*50}")
    print(f"批量解压完成!")
    print(f"成功: {stats['success']}")
    print(f"失败: {stats['failed']}")
    print(f"跳过: {stats['skipped']}")


# ==================== 解压后文件分类 ====================
def classify_extracted_files(extract_dir):
    """
    对解压后的文件按类型分类整理
    """
    from shutil import move

    classify_rules = {
        '.jpg': '图片', '.jpeg': '图片', '.png': '图片', '.gif': '图片',
        '.doc': '文档', '.docx': '文档', '.pdf': '文档', '.txt': '文档',
        '.xls': '表格', '.xlsx': '表格', '.csv': '表格',
        '.mp4': '视频', '.avi': '视频', '.mkv': '视频',
        '.mp3': '音频', '.wav': '音频',
    }

    extract_path = path(extract_dir)

    for file_path in extract_path.rglob('*'):
        if file_path.is_file():
            suffix = file_path.suffix.lower()
            category = classify_rules.get(suffix)

            if category:
                category_dir = extract_path / category
                category_dir.mkdir(exist_ok=true)

                dest = category_dir / file_path.name
                if not dest.exists():
                    move(str(file_path), str(dest))

    print(f"文件分类完成: {extract_dir}/")


# ==================== 使用示例 ====================
if __name__ == "__main__":
    # 批量解压
    batch_extract_all(r"d:\downloads\压缩包")

    # 分类解压后的文件
    # classify_extracted_files(r"d:\downloads\压缩包\已解压")

常见问题

q1:rar 解压报错rarcannotexec: cannot find unpacked unrar

需要安装 unrar 可执行文件:

  1. 下载:https://www.rarlab.com/rar_add.htm
  2. unrar.exe 放到系统 path 中,或指定路径:
import rarfile
rarfile.unrar_tool = r"c:\program files\winrar\unrar.exe"

q2:加密 zip 怎么办?

代码已自动检测密码文件。也可以手动指定:

zf.extractall(extract_dir, pwd=b'your_password')

q3:解压路径过长导致失败?

windows 路径最大长度为 260 字符。可以:

  1. 解压到更短的路径(如 d:\tmp\
  2. 或在注册表中启用长路径支持

总结

格式解压函数
zipzipfile(内置)zipfile.extractall()
rarrarfilerarfile.extractall()
tartarfile(内置)tarfile.extractall()
7zpy7zrsevenzipfile.extractall()

到此这篇关于python实现一键批量解压文件夹内的所有zip/rar并自动分类的文章就介绍到这了,更多相关python批量解压文件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com