12.12. zipfile、tarfile模块学习¶
12.12.1. 1. zipfile模块¶
定义的类和异常 class zipfile.ZipFile 模块最重要的类。用于读写ZIP文件。
class zipfile.PyZipFile 创建包含Python库的ZIP归档文件的类
class zipfile.ZipInfo(filename=‘NoName’, date_time=(1980, 1, 1, 0, 0, 0)) 用于显示ZIP文件信息的类。ZIP对象的getinfo()或infolist()方法会返回一个该类的实例。filename是ZIP文件的完整名称。date_time是一个包含6个元素的元组,描述文件最近修改时间。
zipfile.is_zipfile(filename) 如果文件是个ZIP文件则返回True,否则False。
zipfile.ZIP_STORED 未压缩的归档文件的数字常数。
zipfile.ZIP_DEFLATED 常用的ZIP压缩方法。
zipfile.ZIP_BZIP2 BZIP2压缩方法的数字常量。
zipfile.ZIP_LZMA LZMA压缩方法的数字常量。
exception zipfile.BadZipFile ZIP文件被损坏异常。3.2版本新增。
exception zipfile.LargeZipFile 当需要ZIP64功能,但未开启该功能时弹出异常。
zipfile模块其实很简单,记住下面几个重要的方法就可以了。
方法 |
用途 |
|---|---|
z = zipfile.ZipFile() |
打开或者新建一个zip文件对象 |
z.write() |
添加文件到压缩包内 |
z.infolist() |
查看压缩包内的文件信息 |
z.extract() |
解压单个文件 |
z.extractall() |
解压所有文件 |
z.close() |
关闭压缩文件 |
# 压缩zip
import zipfile,os
f = zipfile.ZipFile('filename.zip', 'w' ,zipfile.ZIP_DEFLATED) # ZIP_STORE 为默认表不压缩. ZIP_DEFLATED 表压缩
#f.write('file1.txt') # 将文件写入压缩包
for path,dir,files in os.walk("tartest"): # 递归压缩目录
for file in files:
f.write(os.path.join(path,file)) # 将文件逐个写入压缩包
f.close()
# 解压zip
if zipfile.is_zipfile('filename.zip'): # 判断一个文件是不是zip文件
f = zipfile.ZipFile('filename.zip')
for file in f.namelist(): # 返回文件列表
f.extract(file, r'/tmp/') # 解压指定文件
#f.extractall() # 解压全部
f.close()
#把zip文件解压缩
#!/usr/bin/python
import zipfile
zfile = zipfile.ZipFile('archive.zip','r')
for filename in zfile.namelist():
data = zfile.read(filename)
file = open(filename, 'w+b')
file.write(data)
file.close()
import zipfile
def meta_info(names):
with zipfile.ZipFile(names) as zf:
for info in zf.infolist():
print(info.filename)
if info.create_system == 0:
system = 'Windows'
elif info.create_system == 3:
system = 'Unix'
else:
system = 'UNKNOWN'
print("System :", system)
print("Zip Version :", info.create_version)
print("Compressed :", info.compress_size, 'bytes')
print("Uncompressed :", info.file_size, 'bytes')
print()
if __name__ == '__main__':
meta_info('work.zip'
1.1 压缩zip文件¶
代码示例
import zipfile
import glob
import os
fileZip = zipfile.ZipFile("out41.zip", "w")
for name in glob.glob("./uwsgi/*"): # 遍历当前目录uwsgi下的所有文件
# print(name)
fileZip.write(name, os.path.basename(name), zipfile.ZIP_DEFLATED)
fileZip.close()
1.2 读取zip文件¶
代码示例
import zipfile
listZipInfo = zipfile.ZipFile("out41.zip", "r")
print(listZipInfo.namelist())
print("\n")
for info in listZipInfo.infolist():
# 显示文件名,文件大小,文件压缩结果大小
print("文件名:{} 文件大小:{} 压缩后的大小:{}".format(info.filename, info.file_size, info.compress_size))
1.3 解压缩zip文件¶
import zipfile
Fileunzip = zipfile.ZipFile("out41.zip")
Fileunzip.extractall("out41")
Fileunzip.close()
12.12.2. 2. tarfile模块¶
tarfile模块看似复杂,其实也很简单,只需要掌握下面几个重点方法就可以了:
方法 |
用途 |
|---|---|
t = tarfile.open() |
打开或新建一个归档文件,返回一个TarFile类型的对象t |
t.getmembers() |
获取包内所有成员的信息 |
t.add() |
将指定文件加入包内 |
t.extract() |
解包指定文件 |
t.extractall() |
解包所有文件 |
TarFile.close() |
关闭TarFile文件 |
# 压缩tar.gz
import os
import tarfile
tar = tarfile.open("/tmp/tartest.tar.gz","w:gz") # 创建压缩包名
for path,dir,files in os.walk("/tmp/tartest"): # 递归文件目录
for file in files:
fullpath = os.path.join(path,file)
tar.add(fullpath) # 创建压缩包
tar.close()
def tar_gz(fname, pwd):
"""
把当前目录下的fname,打成fname.tar.gz
:param fname:
:return:
"""
t = tarfile.open(fname + ".tar.gz", "w:gz")
for root, dir, files in os.walk(fname):
for file in files:
fullpath = os.path.join(root, file)
t.add(fullpath)
t.close()
# 解压tar.gz
import tarfile
tar = tarfile.open("/tmp/tartest.tar.gz")
#tar.extract("/tmp") # 全部解压到指定路径
names = tar.getnames() # 包内文件名
for name in names:
tar.extract(name,path="./") # 解压指定文件
tar.close()
代码示例
import tarfile
tar_file = tarfile.open("work.tar.gz", "w:gz")
for name in ["welcome.py", "hello.py", "hello.txt", "sample.txt", "sample1.txt"]:
tar_file.add(name)
tar_file.close()