python递归解压文件夹中所有压缩包

1. 简述

递归解压文件夹中的所有压缩包到指定文件夹

2. 环境配置

python解压rar文件需要安装依赖库 (python-unrar

Windows:

  1. 在 RARLab 官方下载安装库文件 http://www.rarlab.com/rar/UnRARDLL.exe
  2. 默认路径伪 C:\Program Files (x86)\UnrarDLL\
  3. 添加环境变量 UNRAR_LIB_PATH 键值 C:\Program Files (x86)\UnrarDLL\x64\UnRAR64.dll,如果是32位就是 C:\Program Files (x86)\UnrarDLL\UnRAR.dll

Linux:

  1. 下载库文件 https://www.rarlab.com/rar/unrarsrc-5.6.8.tar.gz
  2. $ make lib
    $ make install-lib
  3. 添加环境变量  export UNRAR_LIB_PATH=/usr/lib/libunrar.so

3. 实现

代码实现

  1 #!/usr/bin/env python3
  2 # .zip .rar .tar .tgz .tar.gz .tar.bz2 .tar.bz .tar.tgz
  3 import os
  4 import zlib
  5 import unrar
  6 import shutil
  7 import zipfile
  8 import tarfile
  9 from time import sleep
 10 # from unrar import rarfile
 11
 12 filepath = "./dirname"  #relative path
 13
 14 class BaseTool(object):
 15     def __init__(self, path):
 16         self.path = path
 17         self.compress = [".tar.gz",".tar.bz2",".tar.bz",".tar.tgz",".tar",".tgz",".zip",".rar"]
 18
 19     def iszip(self,  file):
 20         for z in self.compress:
 21             if file.endswith(z):
 22                 return z
 23
 24     def zip_to_path(self, file):
 25         for i in self.compress:
 26             file = file.replace(i,"")
 27         return file
 28
 29     def error_record(self, info):
 30         with open("error.txt","a+") as r:
 31             r.write(info+"\n")
 32
 33     def un_zip(self, src, dst):
 34         """ src : aa/asdf.zip
 35             dst : unzip/aa/asdf.zip
 36         """
 37         try:
 38             zip_file = zipfile.ZipFile(src)
 39             uz_path = self.zip_to_path(dst)
 40             if not os.path.exists(uz_path):
 41                 os.makedirs(uz_path)
 42             for name in zip_file.namelist():
 43                 zip_file.extract(name, uz_path)
 44             zip_file.close()
 45         except zipfile.BadZipfile:
 46             pass
 47         except zlib.error:
 48             print("zlib error : "+src)
 49             self.error_record("zlib error : "+src)
 50
 51     def un_rar(self, src, dst):
 52         try:
 53             rar = unrar.rarfile.RarFile(src)
 54             uz_path = self.zip_to_path(dst)
 55             rar.extractall(uz_path)
 56         except unrar.rarfile.BadRarFile:
 57             pass
 58         except Exception as e:
 59             print(e)
 60             self.error_record(str(e)+src)
 61
 62     def un_tar(self, src, dst):
 63         try:
 64             tar = tarfile.open(src)
 65             uz_path = self.zip_to_path(dst)
 66             tar.extractall(path = uz_path)
 67         except tarfile.ReadError:
 68             pass
 69         except Exception as e:
 70             print(e)
 71             self.error_record(str(e)+src)
 72
 73
 74 class UnZip(BaseTool):
 75     """ UnZip files """
 76     def __init__(self, path):
 77         super(UnZip, self).__init__(self)
 78         self.path = path
 79         self.output = "unzip/"
 80         self.current_path = os.getcwd()+"/"
 81
 82     def recursive_unzip(self, repath):
 83         """recursive unzip file
 84         """
 85         for (root, dirs, files) in os.walk(repath):
 86             for filename in files:
 87                 src = os.path.join(root,filename)
 88                 if self.iszip(src) == ".zip":
 89                     print("[+] child unzip: "+src)
 90                     self.un_zip(src, src)
 91                     os.remove(src)
 92                     self.recursive_unzip(self.zip_to_path(src))
 93                     sleep(0.1)
 94                 if self.iszip(src) == ".rar":
 95                     from unrar import rarfile
 96                     print("[+] child unrar : "+src)
 97                     self.un_rar(src,src)
 98                     os.remove(src)
 99                     self.recursive_unzip(self.zip_to_path(src))
100                     sleep(0.1)
101                 if self.iszip(src) in (".tar.gz",".tar.bz2",".tar.bz",".tar.tgz",".tar",".tgz"):
102                     print("[+] child untar : "+src)
103                     self.un_tar(src,src)
104                     os.remove(src)
105                     self.recursive_unzip(self.zip_to_path(src))
106                     sleep(0.1)
107
108     def main_unzip(self):
109         for (root, dirs, files) in os.walk(self.path):
110             for filename in files:
111                 zippath = os.path.join(self.output,root)
112                 if not os.path.exists(zippath):
113                     os.makedirs(zippath)
114                 src = os.path.join(root,filename)
115                 dst = os.path.join(self.output,root,filename)
116                 if self.iszip(src) == ".zip":
117                     print("[+] main unzip : "+src)
118                     self.un_zip(src,dst)
119                 if self.iszip(src) == ".rar":
120                     from unrar import rarfile
121                     print("[+] main unrar : "+src)
122                     self.un_rar(src,dst)
123                 if self.iszip(src) in (".tar.gz",".tar.bz2",".tar.bz",".tar.tgz",".tar",".tgz"):
124                     print("[+] main untar : "+src)
125                     self.un_tar(src,dst)
126                 else:
127                     try:
128                         shutil.copyfile(src,dst)
129                     except OSError as e:
130                         print(str(e))
131                         self.error_record(str(e))
132
133         self.recursive_unzip(self.output+self.path)
134
135
136 def main():
137     z = UnZip(filepath)   #relative path
138     z.main_unzip()
139
140 if __name__ == ‘__main__‘:
141     main()

 

原文地址:https://www.cnblogs.com/trojan-z/p/10043408.html

时间: 2025-01-08 16:45:01

python递归解压文件夹中所有压缩包的相关文章

遍历文件夹及其子文件夹下的.pdf文件,并解压文件夹下所有的压缩包

List<PDFPATH> pdfpath = new List<PDFPATH>(); List<string> ziplist = new List<string>(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { FolderBrowserDialog dialog = new FolderBrows

Shell脚本递归打印指定文件夹中全部文件夹文件

#!/bin/bash #递归打印当前文件夹下的全部文件夹文件. PRINTF() { ls $1 | while read line #一次读取每一行放到line变量中 do [ -d $1/$line ] && { DIR="$1/$line" echo $DIR } DIR1=`dirname $DIR` #求路径. A=`ls -F $DIR1 | grep / | grep "\<$line\>"` #推断line是不是一个文件

python zlib 压缩 解压 文件夹

import os,os.path import zipfile def zip_dir(dirname,zipfilename): filelist = [] if os.path.isfile(dirname): filelist.append(dirname) else : for root, dirs, files in os.walk(dirname): for name in files: filelist.append(os.path.join(root, name)) zf =

跨平台的zip文件压缩处理,支持压缩解压文件夹

根据minizip改写的模块,需要zlib支持 输出的接口: 1 #define RG_ZIP_FILE_REPLACE 0 2 #define RG_ZIP_FILE_APPEND 1 3 4 //压缩文件夹目录,递归压缩 5 //szDir是需要压缩的目录,dstLevel是压缩的目录在压缩包里面的层次标识 6 //可直接指定"" 7 //szZipFile压缩包的文件名 8 //replaceFlag指定替换或者是追加进压缩包 9 int DoZipDir(const char*

【python】解压文件

参考:http://essen.iteye.com/blog/1941489 tarfile模块 具体使用方法: https://docs.python.org/2/library/tarfile.html 例子:一次性解压所有文件 import tarfile t = tarfile.open("abc.tgz", "r:gz") t.extractall(path = 'dir/') t.close() 还可以一次解压一个文件 tar = tarfile.ope

Centos7下创建文件夹 移动文件/文件夹 删除文件/文件夹 解压/文件夹打包压缩 命令整理

一.创建文件夹 1.创建本目录下文件夹 mkdir dir 2.创建其他目录下文件夹    mkdir dir/file 3.创建多级目录文件夹    mkdir -p tmp/dir 4.创建file.txt文件    mkdir dir/file.txt 二.修改文件夹名 1.文件夹重命名    mv dir dir1  2.文件重命名    mv dir/file.txt dir/files.txt 三.查看文件夹/文件 1.cd dir 2.cd dir/dir1 3.回到主目录 cd

解压文件夹python

# _*_ coding: utf-8 _*_ import zipfile import shutil import os print os.getcwd() basedir = os.path.dirname(__file__) print os.path.dirname(os.path.dirname(__file__)) def unzip_file(zipfilename,unziptodir): if not os.path.exists(unziptodir): os.mkdir(

递归返回指定文件夹中文件的路径,以及其包含文件夹中文件的路径

import os def print_directory_contents(sPath): for sChild in os.listdir(sPath): sChildPath = os.path.join(sPath,sChild) if os.path.isdir(sChildPath): print_directory_contents(sChildPath) else: print("the path is :",sChildPath) if __name__ == &qu

使用 ICSharpCode.SharpZipLib.Zip压缩解压文件

/// <summary> /// 功能:解压zip格式的文件. /// </summary> /// <param name="zipFilePath">压缩文件路径</param> /// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param> /// <returns>解压是否成功</ret