- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
9.3 用 zipfile 模块压缩文件
你可能熟悉ZIP文件(带有.zip文件扩展名),它可以包含许多其他文件的压缩内容。压缩一个文件会减少它的大小,这在因特网上传输时很有用。因为一个ZIP文件可以包含多个文件和子文件夹,所以它是一种很方便的方式,将多个文件打包成一个文件。这个文件叫做“归档文件”,然后可以用作电子邮件的附件,或其他用途。
利用zipfile模块中的函数,Python程序可以创建和打开(或解压)ZIP文件。假定你有一个名为example.zip的zip文件,它的内容如图9-2所示。
图9-2 example.zip的内容
可以从http://nostarch.com/automatestuff/下载这个ZIP文件,或者利用计算机上已有的一个ZIP文件,接着完成下面的操作。
9.3.1 读取ZIP文件
要读取ZIP文件的内容,首先必须创建一个ZipFile对象(请注意大写首字母Z和F)。ZipFile对象在概念上与File对象相似,你在第8章中曾经看到open()函数返回File对象:它们是一些值,程序通过它们与文件打交道。要创建一个ZipFile对象,就调用zipfile.ZipFile()函数,向它传入一个字符串,表示.zip文件的文件名。请注意,zipfile是Python模块的名称,ZipFile()是函数的名称。
例如,在交互式环境中输入以下代码:
>>> import zipfile, os >>> os.chdir('C:\\') # move to the folder with example.zip >>> exampleZip = zipfile.ZipFile('example.zip') >>> exampleZip.namelist() ['spam.txt', 'cats/', 'cats/catnames.txt', 'cats/zophie.jpg'] >>> spamInfo = exampleZip.getinfo('spam.txt') >>> spamInfo.file_size 13908 >>> spamInfo.compress_size 3828 ❶ >>> 'Compressed file is %sx smaller!' % (round(spamInfo.file_size / spamInfo .compress_size, 2)) 'Compressed file is 3.63x smaller!' >>> exampleZip.close()
ZipFile对象有一个namelist()方法,返回ZIP文件中包含的所有文件和文件夹的字符串的列表。这些字符串可以传递给ZipFile对象的getinfo()方法,返回一个关于特定文件的ZipInfo对象。ZipInfo对象有自己的属性,诸如表示字节数的file_size和compress_size,它们分别表示原来文件大小和压缩后文件大小。ZipFile对象表示整个归档文件,而ZipInfo对象则保存该归档文件中每个文件的有用信息。
❶处的命令计算出example.zip压缩的效率,用压缩后文件的大小除以原来文件的大小,并以%s字符串格式打印出这一信息。
9.3.2 从ZIP文件中解压缩
ZipFile对象的extractall()方法从ZIP文件中解压缩所有文件和文件夹,放到当前工作目录中。
>>> import zipfile, os >>> os.chdir('C:\\') # move to the folder with example.zip >>> exampleZip = zipfile.ZipFile('example.zip') ❶ >>> exampleZip.extractall() >>> exampleZip.close()
运行这段代码后,example.zip的内容将被解压缩到C:\。或者,你可以向extractall()传递的一个文件夹名称,它将文件解压缩到那个文件夹,而不是当前工作目录。如果传递给extractall()方法的文件夹不存在,它会被创建。例如,如果你用exampleZip.extractall('C:\ delicious')取代❶处的调用,代码就会从example.zip中解压缩文件,放到新创建的C:\delicious文件夹中。
ZipFile对象的extract()方法从ZIP文件中解压缩单个文件。继续交互式环境中的例子:
>>> exampleZip.extract('spam.txt') 'C:\\spam.txt' >>> exampleZip.extract('spam.txt', 'C:\\some\\new\\folders') 'C:\\some\\new\\folders\\spam.txt' >>> exampleZip.close()
传递给extract()的字符串,必须匹配namelist()返回的字符串列表中的一个。或者,你可以向extract()传递第二个参数,将文件解压缩到指定的文件夹,而不是当前工作目录。如果第二个参数指定的文件夹不存在,Python就会创建它。extract()的返回值是被压缩后文件的绝对路径。
9.3.3 创建和添加到ZIP文件
要创建你自己的压缩ZIP文件,必须以“写模式”打开ZipFile对象,即传入'w'作为第二个参数(这类似于向open()函数传入'w',以写模式打开一个文本文件)。
如果向ZipFile对象的write()方法传入一个路径,Python就会压缩该路径所指的文件,将它加到ZIP文件中。write()方法的第一个参数是一个字符串,代表要添加的文件名。第二个参数是“压缩类型”参数,它告诉计算机使用怎样的算法来压缩文件。可以总是将这个值设置为zipfile.ZIP_DEFLATED(这指定了deflate压缩算法,它对各种类型的数据都很有效)。在交互式环境中输入以下代码:
>>> import zipfile >>> newZip = zipfile.ZipFile('new.zip', 'w') >>> newZip.write('spam.txt', compress_type=zipfile.ZIP_DEFLATED) >>> newZip.close()
这段代码将创建一个新的ZIP文件,名为new.zip,它包含spam.txt压缩后的内容。
要记住,就像写入文件一样,写模式将擦除ZIP文件中所有原有的内容。如果只是希望将文件添加到原有的ZIP文件中,就要向zipfile.ZipFile()传入'a'作为第二个参数,以添加模式打开ZIP文件。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论