实现一个批量解压缩并去重的功能

import os
import zipfile
import tarfile
import gzip
import hashlib
import pandas as pd

def get_file_list(dir_path):
    """获取指定目录下的所有文件列表"""
    file_list = []
    for root, dirs, files in os.walk(dir_path):
        for file in files:
            file_path = os.path.join(root, file)
            file_list.append(file_path)
    return file_list

def get_file_suffix(file_path):
    """获取文件的后缀名"""
    file_name, file_suffix = os.path.splitext(file_path)
    return file_suffix

def get_md5(file_path):
    """获取文件的 MD5 校验值"""
    md5 = hashlib.md5()
    with open(file_path, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            md5.update(chunk)
    return md5.hexdigest()

def unzip(file_path, target_dir):
    """解压缩文件"""
    suffix = get_file_suffix(file_path)
    if suffix == ".zip":
        return zipfile.ZipFile(file_path).extractall(target_dir)
    elif suffix == ".tar":
        return tarfile.open(file_path, "r:gz").extractall(target_dir)
    elif suffix == ".7z":
        return 7zfile.open(file_path, "r").extractall(target_dir)
    elif suffix == ".gz":
        with gzip.open(file_path, "rb") as f:
            return f.read().decode("utf-8")
    else:
        raise Exception(f"不支持的文件格式:{suffix}")

def is_duplicate(file_path, file_map):
    """判断文件是否重复"""
    file_size = os.path.getsize(file_path)
    file_mtime = os.path.getmtime(file_path)
    if file_path in file_map:
        if file_map[file_path]["size"] == file_size and file_map[file_path]["mtime"] == file_mtime:
            return True
    else:
        file_map[file_path] = {"size": file_size, "mtime": file_mtime}
        return False

def main():
    """主函数"""
    # 获取输入参数
    cur_dir = os.getcwd()
    input_dir = input("请输入需要解压缩的文件存放目录:")
    output_dir = input("请输入解压缩后的存放目录:")
    # 获取文件列表
    file_list = get_file_list(input_dir)
    # 创建解压缩后的存放目录
    if not os.path.exists(output_dir):
        os.mkdir(output_dir)
    # 解压缩文件
    progress_bar = ProgressBar(len(file_list))
    file_map = {}
    for file_path in file_list:
        file_path = os.path.join(input_dir, file_path)
        unzip(file_path, output_dir)
        progress_bar.update()
    # 去重复文件
    for file_path in os.listdir(output_dir):
        file_path = os.path.join(output_dir, file_path)
        if is_duplicate(file_path, file_map):
            os.remove(file_path)

class ProgressBar:
    """进度条类"""
    def __init__(self, total):
        self.total = total
        self.progress = 0

    def update(self):
        self.progress += 1
        sys.stdout.write("\r%.2f%%" % (self.progress / self.total * 100))
        sys.stdout.flush()

    @property
    def finished(self):
        return self.progress >= self.total

if __name__ == "__main__":
    main()

注意:在运行上述代码之前,您需要确保已经安装了所有必要的库,如pandas、zipfile、tarfile、gzip等。您可以使用以下命令来安装这些库:

pip install pandas zipfile tarfile gzip
此外,由于您的代码中使用了7zfile,但这个库在Python的标准库中不存在,您需要使用第三方库来处理.7z文件。您可以使用py7zr库,它是7z文件的一个Python实现。您可以使用以下命令来安装py7zr:

pip install py7zr

相关推荐

  1. 实现一个批量压缩功能

    2023-12-23 12:14:04       54 阅读
  2. 实现数组方式

    2023-12-23 12:14:04       37 阅读
  3. 前端实现数组

    2023-12-23 12:14:04       32 阅读
  4. [linux] 输出文本文件最后一列

    2023-12-23 12:14:04       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-23 12:14:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-23 12:14:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-23 12:14:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-23 12:14:04       20 阅读

热门阅读

  1. Redis小记(1)

    2023-12-23 12:14:04       41 阅读
  2. 【WPF】 使用UserControl并在XAML中赋初始值

    2023-12-23 12:14:04       33 阅读
  3. 观察者模式 Observer

    2023-12-23 12:14:04       43 阅读
  4. 渗透测试和风险评估之间的区别

    2023-12-23 12:14:04       33 阅读
  5. wpf-MVVM绑定时可能出现的内存泄漏问题

    2023-12-23 12:14:04       37 阅读
  6. P5410 【模板】扩展 KMP/exKMP(Z 函数)

    2023-12-23 12:14:04       35 阅读
  7. Vue中的插槽和自定义指令

    2023-12-23 12:14:04       33 阅读
  8. 【安全】audit的一些问题以及需要注意的地方

    2023-12-23 12:14:04       42 阅读
  9. 二分查找(红蓝染色法)

    2023-12-23 12:14:04       45 阅读