相干引荐:《python视频》
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解压文件花样的基础要领的细致内容,更多请关注ki4网别的相干文章!