python 实现文件的批量压缩为.zip格式+.zip格式文件的解析
python 实现文件的批量压缩为.zip格式
绪论:
zipfile模块
是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的.zip格式,所以这个模块使用频率也是比较高的。
zipfile里有两个常用的class, 分别是ZipFile
和ZipInfo
。其中,ZipFile
用来创建和读取zip文件,而ZipInfo
是存储关于.zip文件中每个文件的信息。
通过Python实现文件的批量压缩——具体操作:
1. 创建zip压缩对像
官方语法:
class zipfile.ZipFile(file, mode=’r’, compression=ZIP_STORED, allowZip64=True)
参数说明:
compressPathName
:生成的.zip压缩文件的绝对路径。mode
:指示打开zip文件的模式。默认值为’r’,表示读已经存在的zip文件,也可以为’w’或’a’。
备注:mode的三种取值情况:
mode=‘r’,表示读已经存在的zip文件;
mode=‘w’,表示新建一个zip文档或覆盖一个已经存在的zip文档;
mode=‘a’,表示将数据附加到一个现存的zip文档中。
compression
:表示在写zip文档时使用的压缩方法,它的值可以是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。如果要操作的zip文件大小超过2G,应该将allowZip64设置为True。
使用范例:
zip_file = zipfile.ZipFile(compressPathName, 'w', zipfile.ZIP_DEFLATED) # 创建的压缩对象用于执行后续操作
2. 将文件写入zip压缩文件
# (1)将文件直接写入压缩文件——生成的.zip压缩文件包含多层目录
zip_file.write(filepath)
# (2)将文件打包成一个文件夹进行压缩——生成的.zip压缩文件不存在多层目录,仅在一个指定文件夹dstdir下
zip_file.write(filepath,dstdir+filename)
3. 关闭zip对象
zip_file.close()
批量压缩文件——完整代码:
import os
import zipfile
import time
# 准备压缩的目标文件所在的文件夹路径
file_dir = r'/Users/edz/Documents/train_xml/'
# 新生成的压缩文件.zip的存放路径
compressPathName = file_dir + 'train_xml_1402.zip'
# (1)创建zip压缩对像
zip_file = zipfile.ZipFile(compressPathName, 'w', zipfile.ZIP_DEFLATED)
for file in os.listdir(file_dir):
if file.endswith('.xml'):
file_path = os.path.join(file_dir,file) # 会返回压缩包内所有文件名的列表。
zip_file.write(file_path, file) # (2)将文件写入zip压缩文件——正常压缩,不出现多层目录
# zip_file.write(file_path) # (2)将文件写入zip压缩文件——直接压缩,出现多层目录
zip_file.close() # (3)关闭zip对象
time.sleep(5)
print('压缩完成')
Python解析.zip文件的常见函数
# 读入的.zip格式文件的绝对路径
zip_name = r'/Users/edz/Desktop/未命名文件夹/train_xml_1045.zip'
# 创建zip压缩对像,只读模式
zip_file = zipfile.ZipFile(zip_name, 'r') # zip_file存放准备解析的.zip文件
对于上述创建的zip压缩对象,即:zip_file还提供了如下常用的方法和属性:
- zip_file
.getinfo(name)
——获取.zip文档内指定文件(如:name为指定的文件名称)的信息。返回一个zipfile.ZipInfo对象,它包括文件的详细信息。 - zip_file
.infolist()
——获取.zip文档内所有文件的信息,返回一个zipfile.ZipInfo的列表。 - zip_file
.namelist()
——获取zip文档内所有文件的名称列表。 - zip_file
.extract(member[, path[, pwd]])
—— 将zip文档内的指定文件解压到当前目录。参数member指定要解压的文件名称或对应的ZipInfo对象;参数path指定了解析文件保存的文件夹; - zip_file
.extractall([path[, members[, pwd]]])
——解压zip文档中的所有文件到当前目录。参数members的默认值为zip文档内的所有文件名称列表,也可以自己设置,选择要解压的文件名称。 - zip_file
.printdir()
——将zip文档内的信息打印到控制台上。 - zip_file
.setpassword(pwd)
——设置zip文档的密码。 - zip_file
.read(name[, pwd])
——获取zip文档内指定文件的二进制数据。
下面的例子演示了.read()
的使用,zip文档内包括一个duoduo.txt的文本文件,使用read()方法读取其二进制数据,然后保存到/Users/edz/Desktop/未命名文件夹/duoduo.txt。
import zipfile, os
zipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'duoduo.zip')) # os.getcwd() 方法用于返回当前工作目录
data = zipFile.read('duoduo.txt')
# (lambda f, d: (f.write(d), f.close()))(open(r'd:/duoduo.txt', 'wb'), data) #一行语句就完成了写文件操作。仔细琢磨哦~_~
with open(r'/Users/edz/Desktop/未命名文件夹/duoduo.txt','wb') as f:
for d in data:
f.write(d)
zipFile.close()
- zip_file
.write(filename[, arcname[, compress_type]])
——将指定文件添加到zip文档中。filename为文件路径,arcname为添加到zip文档之后保存的名称, 参数compress_type表示压缩方法,它的值可以是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。下面的例子演示了如何创建一个zip文档,并将文件/Users/edz/Desktop/test.doc添加到压缩文档/Users/edz/Desktop/未命名文件夹/train_xml_1045.zip当中。
import zipfile, os
zipFile = zipfile.ZipFile(r'/Users/edz/Desktop/未命名文件夹/train_xml_1045.zip', 'w') # 必须以'w'格式读入
zipFile.write(r'/Users/edz/Desktop/test.doc', '保存的名字', zipfile.ZIP_DEFLATED)
zipFile.close()
- ZipFile
.writestr(zinfo_or_arcname, bytes)
——writestr()支持将二进制数据直接写入到压缩文档。