Python解压ZIP、RAR等常用压缩格式的方法
解压大杀器
首先祭出可以应对多种压缩包格式的python库:patool。如果平时只用基本的解压、打包等操作,也不想详细了解各种压缩格式对应的python库,patool应该是个不错的选择。
patool库支持的格式包括:
7z (.7z, .cb7), ACE (.ace, .cba), ADF (.adf), ALZIP (.alz), APE (.ape), AR (.a), ARC (.arc), ARJ (.arj), BZIP2 (.bz2), CAB (.cab), COMPRESS (.Z), CPIO (.cpio), DEB (.deb), DMS (.dms), FLAC (.flac), GZIP (.gz), ISO (.iso), LRZIP (.lrz), LZH (.lha, .lzh), LZIP (.lz), LZMA (.lzma), LZOP (.lzo), RPM (.rpm), RAR (.rar, .cbr), RZIP (.rz), SHN (.shn), TAR (.tar, .cbt), XZ (.xz), ZIP (.zip, .jar, .cbz) and ZOO (.zoo)
patool的基本使用方法:
import patoolib
# 解压缩
patoolib.extract_archive("archive.zip", outdir="/tmp")
# 测试压缩包是否完整
patoolib.test_archive("dist.tar.gz", verbosity=1)
# 列出压缩包内的文件
patoolib.list_archive("package.deb")
# 创建压缩包
patoolib.create_archive("/path/to/myfiles.zip", ("file1.txt", "dir/"))
# 比较压缩包内文件的差异
patoolib.diff_archives("release1.0.tar.gz", "release2.0.zip")
# 搜索
patoolib.search_archive("def urlopen", "python3.3.tar.gz")
# 修改压缩包的压缩格式
patoolib.repack_archive("linux-2.6.33.tar.gz", "linux-2.6.33.tar.bz2")
但是,patool的正常运行依赖于其他解压软件,例如,我平时用patool来解压文件时它主要调用了我电脑的7z、Rtools两个程序,如果电脑上没有能够处理相应压缩文件的软件,则会报错:
patoolib.util.PatoolError: could not find an executable program to extract format rar; candidates are (rar,unrar,7z)
另外,patool无法处理具有密码保护的压缩文件。
与patool类似的库还有pyunpack、easy-extract:pyunpack库依赖zipfile和patool,支持两库所支持的所有压缩格式,需提前安装;easy-extract库依赖解压软件unrar、7z、par2,需提前安装,同样支持多种解压格式。
常见压缩格式的处理
如果电脑上并未安装相应的压缩软件,只想使用python进行压缩解压操作,可以使用其他的下面来具体介绍几种常见的
zip格式
可以处理zip格式的python库包括python标准库zipfile,以及第三方库python-archive等,下面主要介绍一下zipfile库的基本使用方法:
首先创建ZipFile对象:
# 导入ZipFile类
from zipfile import ZipFile
# ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None)
# 默认模式是读取,该模式提供read(), readline(), readlines(), __iter__(), __next__()等方法
解压缩文件包,解压函数共有两个:extract()、extractall(),前者可解压单个文件,默认解压至当前目录,后者可批量解压多个文件,默认解压所有文件。extract()、extractall()均有参数pwd,可处理具有密码的压缩包。
with ZipFile('test.zip') as myzip:
myzip.extract(member='1.txt',path='tmp')
myzip.extractall(path='tmp',members=['1.txt','2.txt'],pwd='password')
制作压缩文件:zipfile共有四种压缩文件的方法分别为:zipfile.ZIP_STORED(默认)、zipfile.ZIP_DEFLATED、zipfile.ZIP_BZIP2、zipfile.ZIP_LZMA
# 添加文件的mode有'w', 'a', 'x'
# 'w'表示覆盖或写入一个新文件;'a'表示在已有文件后追加;'x'表示新建文件并写入。
# 在三种mode下,如果未写入认识数据,则会生成空的ZIP文件。
with ZipFile('test.zip',mode='w') as myzip:
for file in ['1.txt', '2.txt']: # 需压缩的文件列表
myzip.write(file,compress_type=zipfile.ZIP_DEFLATED)
压缩整个文件夹
# 方法一
def addToZip(zf, path, zippath):
if os.path.isfile(path):
zf.write(path, zippath, zipfile.ZIP_DEFLATED) # 以zlib压缩方法写入文件
elif os.path.isdir(path):
if zippath:
zf.write(path, zippath)
for nm in os.listdir(path):
addToZip(zf, os.path.join(path, nm), os.path.join(zippath, nm))
with zipfile.ZipFile('tmp4.zip', 'w') as zip_file:
addToZip(zip_file,'tmp','tmp')
#方法二
class ZipFolder:
def toZip(self, file, zipfilename):
# 首先创建zipfile对象
with zipfile.ZipFile(zipfilename, 'w') as zip_file:
if os.path.isfile(file): # 判断写入的是文件还是文件夹,是文件的话直接写入
zip_file.write(file)
else: # 否则调用写入文件夹的函数assFolderToZip()
self.addFolderToZip(zip_file, file)
def addFolderToZip(self, zip_file, folder):
for file in os.listdir(folder): # 依次遍历文件夹内的文件
full_path = os.path.join(folder, file)
if os.path.isfile(full_path): # 判断是文件还是文件夹,是文件的话直接写入
print('File added: ', str(full_path))
zip_file.write(full_path)
elif os.path.isdir(full_path):
# 如果是文件夹的话再次调用addFolderToZip函数,写入文件夹
print('Entering folder: ', str(full_path))
self.addFolderToZip(zip_file, full_path)
directory = 'tmp' # 需压缩的文件目录
zipfilename = 'tmp1.zip' #压缩后的文件名
ZipFolder().toZip(directory, zipfilename)
rar格式
rar格式没有对应的python标准库,需依赖第三方库rarfile、python-unrar、pyUnRAR2等,上述库的共同点在于依赖RARLAB的UnRAR library的支持,下面主要介绍一下rarfile库:
- 安装及其配置
安装命令:pip install rarfile
但配置颇费了些时间。首先要下载安装UnRAR。因为我的电脑操作系统是Windows,所以去RARLAB官网下载UnRarDLL即可,安装至默认路径C:\Program Files (x86)\UnrarDLL。
然后是添加环境变量,先是将C:\Program Files (x86)\UnrarDLL\x64(我的系统是64位)添加至系统变量中的Path变量(计算机右键>属性>高级系统设置>高级 >环境变量),但重启PyCharm后仍然报错:LookupError: Couldn't find path to unrar library.
然后尝试在系统变量中新建变量,变量名输入 UNRAR_LIB_PATH,变量值为 C:\Program Files (x86)\UnrarDLL\x64\UnRAR64.dll(32位系统下的变量值为C:\Program Files (x86)\UnrarDLL\UnRAR.dll)。重启PyCharm,问题解决。
- 基本使用方法
rarfile库的使用方法与zipfile十分类似,同样包含extract(), extractall(), namelist(), infolist(), getinfo(), open(), read(), printdir()等函数,最主要的区别在于,RarFile对象只支持读取模式,无法写入文件。# mode的值只能为'r'
class rarfile.RarFile(rarfile, mode='r', charset=None, info_callback=None, crc_check=True, errors='stop')
利用rarfile库去解压rar压缩包,与利用zipfile库解压zip格式压缩包的方法相同,可参考zipfile库的使用方法。
另外,python-unrar库的安装、设置和使用方法与rarfile库十分类似,但python-unrar库不支持with语句,如果想使用with语句,可在python-unrar库安装目录下的rarfile.py文件中添加如下语句:
def __enter__(self):
"""Open context."""
return self
def __exit__(self, typ, value, traceback):
"""Exit context"""
self.close()
def close(self):
"""Release open resources."""
pass
tar格式
tar格式是Unix系统下常见的打包文件的格式,搭配不同的压缩方法可形成不同的压缩文件格式,如:.tar.gz(.tgz)、.tar.bz2(.tbztb2)、.tar.Z(.taz)、.tar.lzma(.tlz)、.tar.xz(.txz)等。tar格式对应的有python标准库tarfile,支持的格式包括:tar, tar.gz, tar.bz2, tar.xz, .tar.lzma等。
tarfile库的基本使用方法:
创建tarfile对象
tarfile库创建对象使用tarfile.open(),而不是使用tarfile.TarFile()。tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs)
其中,mode可取的值比较多,主要包括'r', 'w', 'a', 'x'四种模式(在zipfile库的使用中简单介绍过),以及这四种模式与'gz', 'bz2', 'xz'三种压缩方法的组合模式,具体取值如下表所示:
模式 含义 'r'or'r:*' 自动解压并打开文件(推荐模式) 'r:' 只打开文件不解压 'r:gz' 采用gzip格式解压并打开文件 'r:bz2' 采用bz2格式解压并打开文件 'r:xz' 采用lzma格式解压并打开文件 'x'or'x:' 仅创建打包文件,不压缩 'x:gz' 采用gzip方式压缩并打包文件 'x:bz2' 采用bzip2方式压缩并打包文件 'x:xz' 采用lzma方式压缩并打包文件 'a'or'a:' 打开文件,并以不压缩的方式追加内容。如果文件不存在,则新建 'w'or'w:' 以不压缩的方式写入 'w:gz' 以gzip的方式压缩并写入 'w:bz2' 以bzip2的方式压缩并写入 'w:xz' 以lzma的方式压缩并写入 但是,不支持'a'与三种压缩方法的组合模式('a:gz', 'a:bz2'、'a:xz')
基本使用方法
解压缩至指定的目录with tarfile.open("test.tar.gz") as tar:
tar.extractall(path='.')
解压符合某些条件的文件
# 解压后缀名为py的文件
def py_files(members):
for tarinfo in members:
if os.path.splitext(tarinfo.name)[1] == ".py":
yield tarinfo
with tarfile.open("sample.tar.gz") as tar:
tar.extractall(members=py_files(tar))
创建不压缩的打包文件
with tarfile.open("sample.tar", "w") as tar:
for name in ["foo", "bar", "quux"]:
tar.add(name)
创建压缩的打包文件
with tarfile.open("sample.tar", "w:gz") as tar:
for name in ["foo", "bar", "quux"]:
tar.add(name)
压缩并打包整个文件夹,较之zipfile库简单得多,可使用add()函数进行添加
tar = tarfile.open('test.tar','w:gz')
for root ,dir,files in os.walk(os.getcwd()):
for file in files:
fullpath = os.path.join(root,file)
tar.add(fullpath)
其他压缩格式
Python原生的数据压缩打包的标准库还包括:bz2、gzip、zlib、lzma以及建立在zipfile和tarfile库基础上的shutil库,以后有机会再详细介绍。
Python解压ZIP、RAR等常用压缩格式的方法的更多相关文章
- 文件压缩、解压工具类。文件压缩格式为zip
package com.JUtils.file; import java.io.BufferedOutputStream; import java.io.File; import java.io.Fi ...
- 使用Python解压zip、rar文件
解压 zip 文件 基本解压操作 import zipfile ''' 基本格式:zipfile.ZipFile(filename[,mode[,compression[,allowZip64]]]) ...
- python 解压zip压缩包
在当前路径解压zip压缩包,生成同名文件夹,内部目录结构与压缩包一致 import zipfile import os def un_zip(file_name): """ ...
- 如何通过python代码解压zip包
转载至https://www.cnblogs.com/flyhigh1860/p/3884842.html 很多人在Google上不停的找合适自己的压缩,殊不知Py的压缩很不错.可以试试.当然C#,J ...
- python解压压缩包的几种方法
这里讨论使用Python解压例如以下五种压缩文件: .gz .tar .tgz .zip .rar 简单介绍 gz: 即gzip.通常仅仅能压缩一个文件.与tar结合起来就能够实现先打包,再压缩. ...
- Ubuntu 14 如何解压 .zip、.rar 文件?
.zip 和 .rar 是Windows下常用的压缩文件,在Ubuntu中如何解压? [解压.zip文件] Ubuntu中貌似已经安装了unzip软件,解压命令如下: unzip ./FileName ...
- Ubuntu 14 如何解压 .zip、.rar 文件
.zip 和 .rar 是Windows下常用的压缩文件,在Ubuntu中如何解压. [解压.zip文件] Ubuntu中貌似已经安装了unzip软件,解压命令如下: unzip ./FileName ...
- python-批量解压zip、rar文件
这是一个用python写解压大量zip脚本的说明,本人新手一个,希望能对各位有所启发. GitHub:https://github.com/lgf133214/Windows-python3- 首先要 ...
- linux下压缩与解压(zip、unzip、tar)详解
linux下压缩与解压(zip.unzip.tar)详解 2012-05-09 13:58:39| 分类: linux | 标签:linux zip unzip tar linux命令详解 |举报|字 ...
随机推荐
- jquery-validate插件
jQuery Validation 插件 优点:1.表单验证非常简单方便,并且提供了许多配置项目2.国际化,可以自定义提示信息 命令行安装 //初始化bowerbower init //使用bower ...
- 将Android工程打成jar包之后对资源的调用。
Android工程不能完整的打包成jar包.这个主要是R文件导致的,但是我们可以将除了资源文件中的所有东西都打到jar包中.Activity.View等等类. 提供jar包的同时,还需要提供资源文件. ...
- 关于android项目的习惯
编码使用UTF-8. 布局中多写style,常用字号颜色尺寸写进values对应文件 如中号 小号 大号 下部按钮颜色 上标题颜色 左边距,右边距,等. 任何文件类型通用名放在最前 如item_a;i ...
- 夜色的 cocos2d-x 开发笔记 04
本章会把游戏的基本功能结束,前面实现了子弹发射,产生敌人. 接下来我们要,检测子弹与敌人碰撞,让玩家移动,实现这个游戏的基本功能. 于是多出了这几个方法,当然还是写在.h文件里 首先实现触摸监听的方法 ...
- Python基础学习之标识符
1.合法的Python标识符 Python标识符字符串规则和其他大部分用C编写的高级语言相似: 第一个字符必须是字母或下划线(_) 剩下的字符可以是字母和数字或下滑线 大小写敏感 标识符不能以数字开头 ...
- cs231n 17-18 assignment2 出现 No module named 'past' 解决方法
解决方法: pip install future
- 判断团队适不适合使用node
1.要不要用 2.历史包袱 3.跟进升级 看完scott创业公司使用node,对于一个团队要不要使用node,第一个就是如果承接的项目有很多历史迭代,线上也在稳定的抛,不要轻易的替换,比如很多老代码, ...
- 2017.10.12 Java的计数器的开发
//我们用一个合成的applet/application来简单显示出一个计数器的结果/** * Created by qichunlin on 2017/10/12. */ /*简单的计数器*/ im ...
- 剑指offer28 字符串的排列
1.全局变量可以在最后去定义并初始化,不一定非要在开头 2.此题有一种特殊情况需要考虑,比如字符串是“aa”,那输出应该是“aa”,而不是“aa,aa”,即相同的不输出.实现这个处理用了c++中的容器 ...
- 在VS中使用Boost库出现Macro redefinition错误的解决方法(warning C4005)
最近使用Boost库做多线程开发,可视在vs中编译工程师总是遇到Macro redefinition错误,类似下面的错误描述 1>c:\program files (x86)\microsoft ...