python 实现文件的批量压缩为.zip格式+.zip格式文件的解析

python 实现文件的批量压缩为.zip格式+.zip格式文件的解析

python 实现文件的批量压缩为.zip格式

绪论:

zipfile模块是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的.zip格式,所以这个模块使用频率也是比较高的。

zipfile里有两个常用的class, 分别是ZipFileZipInfo。其中,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()支持将二进制数据直接写入到压缩文档。

猜你喜欢

转载自blog.csdn.net/weixin_42782150/article/details/107867075