应对多种压缩包格式的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解压文件中哪个是安装包_python解压文件格式的基本方法相关推荐

  1. R软件中 文本分析安装包 Rjava 和 Rwordseg 傻瓜式安装方法四部曲

    这两天,由于要做一个文本分析的内容,所以搜索了一天R语言中的可以做文本分析的加载包,但是在安装包的过程,真是被虐千百遍,总是安装不成功.特此专门写一篇博文,把整个心塞史畅快的释放一下. ------- ...

  2. python如何读取文件中第一行的元素_python txt读取第一行数据库

    带你读<Python数据分析与数据化运营(第2版)>之一:Python和数据化运营 点击查看第二章点击查看第三章Python数据分析与数据化运营(第2版) 宋天龙 著 第1章 Python ...

  3. python读取文件按行分割字符串_python在TXT文件中按照某一字符串取出该字符串所在的行方法...

    python在TXT文件中按照某一字符串取出该字符串所在的行方法 主要流程:读取文件数据--将每一行数据分成不同的字符段--在判断 在某个字否段是否含与某个字符.(只是其中一种办法) 代码如下: wi ...

  4. python怎么读取csv的一部分数据_python批量读取csv文件 如何用python将csv文件中的数据读取成数组...

    如何用python把多个csv文件数据处理后汇总到新csv文件你看这月光多温柔,小编转头还能看见你,一切从未坍塌. 可以用pandas读取数据,首先把文件方同一个文件价里,然后对当前文件价的所有内容循 ...

  5. python读json文件中不同的数据类型_怎么使用python提取json文件中的字段

    python中为什么用json有什么作用 python的json模块中如何将变量添加到里面 python的json模块第一个是要打开的文件,第二个是打开的操作,为什么会如果你早认清你在别人心中没那么重 ...

  6. linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(上传安装包并解压_05)

    接上一篇:linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(oracle基础配置_04) 静默安装Oracle11GR2数据库上传数据库安装包并解压 按提示选择文件,添加确 ...

  7. 使用Python获取Excel文件中单元格公式的计算结果

    假设有如下Excel文件,其中第二个WorkSheet中数据如下: 其中D列为公式,现在要求输出该列公式计算的数值结果,代码如下: 代码运行结果: ----------相关阅读---------- 1 ...

  8. Python检查Word文件中包含特定关键字的所有页码

    推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情: 配套资源: 用书教师可以联系董老师获取教学大纲.课件.源码.教案. ...

  9. python打开excel的函数-Python读取excel文件中带公式的值的实现

    在进行excel文件读取的时候,我自己设置了部分直接从公式获取单元格的值 但是用之前的读取方法进行读取的时候,返回值为空 import os import xlrd from xlutils.copy ...

最新文章

  1. 激光雷达与摄影测量相结合如何提高点云质量?
  2. 3D显示Cell效果
  3. 第十七届智能车竞赛英飞凌专题培训 ——四轮摄像头组入门讲解
  4. Windows Server 2008标准证书使用记录
  5. 【存储知识学习】第五章-5.1-5.3 RAID磁盘阵列-《大话存储》 阅读笔记
  6. linux-basic(12)正则表达式与文件格式化处理
  7. REVERSE-PRACTICE-BUUCTF-11
  8. fileinputstream_Java I/O 流之 FileInputStream
  9. php 设置agent,限制某个目录禁止解析php及user_agent、php相关配置
  10. Docker PHP 扩展配置
  11. 光线求交加速算法:边界体积层次结构(Bounding Volume Hierarchies)3-LBVH(Linear Bounding Volume Hierarchies)
  12. Linux下部署LVS(DR)+keepalived+Nginx负载均衡
  13. 特斯拉接连出闹剧?一次比一次渗人...
  14. raster | R语言中的空间栅格对象及其基本处理方法(Ⅳ):数据聚合、重采样
  15. 利用递归统一化函数参数的不固定数据类型
  16. 确定两个日期范围是否重叠
  17. matlab最速下降法例子,matlab 最速下降法 steepest descent (实例并附有详细说明)
  18. 编译jemalloc以及报错解决
  19. 龙卷风路径_【龙卷风的防范措施】龙卷风的易发地点_龙卷风如何分级 - 妈妈网百科...
  20. 树莓派第一次使用WIN10电脑远程连接(无显示器)

热门文章

  1. mac numbers 计算两个日期时间天数 DUR2DAYS
  2. vant2-上拉加载、下拉刷新
  3. 面试28k职位,老乡面试官从HashCode到HashMap给我讲了一下午!「回家赶忙整理出1.6万字的面试材料」
  4. 衡水二中2021清华北大高考成绩查询,衡水中学2020高考成绩多少人考上清华北大...
  5. matlab 多项式拟合EXCEL中复杂数据
  6. 使用NHibernate 3.2实现Repository(ORuM)(三)NHibernate、Mapping、Mapping-By-Code
  7. 2022情人节最适合送的礼物
  8. 美团、大众点评 token最新算法——宇宙第一简洁版
  9. python判别分析_二次判别分析Quadratic Discriminant Analysis(QDA)
  10. java实现求最小公倍数_使用Java代码进行因数分解和求最小公倍数的示例