马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 zltzlt 于 2020-1-27 13:12 编辑
Python 操作 .zip 文件
.zip 文件格式是一种数据压缩和文档储存的文件格式。Python 提供了一个名为 zipfile 的内置模块,它用于操作 .zip 文件。
zipfile 提供了创建、读取、写入、添加及访问压缩包文件的工具。
zipfile 的简单使用
请参考 Python 小技巧 059:操作 .zip 压缩文件。
判断 .zip 文件是否有效
当打开了无效的 .zip 文件时,zipfile 会抛出 BadZipFile 异常。要想在打开 .zip 文件之前就判断 .zip 文件是否有效,可以使用 zipfile 提供的 is_zipfile() 函数。
例如,我们创建一个安全打开 .zip 文件的函数 safe_open():
def safe_open(filename, mode="r"):
import zipfile
if not zipfile.is_zipfile(filename):
print("无法打开文件!")
else:
return zipfile.ZipFile(filename, mode=mode)
使用这个函数,当 .zip 文件无效时不会报错,而是打印提示信息。
safe_open("E:/1.py") # 输出:无法打开文件!
注:之后的示例均使用 safe_open() 函数打开压缩包。
解压指定的文件
想要解压一部分文件而不是全部,可以使用 zipfile.ZipFile 提供的 extract() 方法。例如:
f = safe_open("E:/1.zip")
# 第一个参数是要解压的文件在压缩包中的完整路径;第二个参数指定解压到哪个文件夹(为 None 则解压到当前工作目录)
f.extract("demo.txt") # 解压 demo.txt 到当前工作目录
f.extract("demo.txt", "E:/") # 解压 demo.txt 到 E 盘
f.close()
打印压缩包文件目录
有时我们想知道 .zip 的大体结构,可以使用 ZipFile 对象提供的 printdir() 方法。例如:
f = safe_open("E:/1.zip")
f.printdir() # 打印压缩包的目录
f.close()
执行效果:
不错,打印得很漂亮
说明:其中的 File Name 是文件名,Modified 是最后修改日期,Size 是文件大小(以字节为单位)。
将文件写入压缩包
我们终于要来学习如何将文件写入压缩包了将文件写入压缩包有两种方法:使用 writestr() 或 write() 方法。例如,写入内容为 '1234567890'、文件名为 '1.txt' 的文件到压缩包,可以使用这样的代码:
f = safe_open("E:/1.zip", mode="a") # 使用追加模式
# 第一个参数指定文件名,第二个参数指定要写入的内容
f.writestr("1.txt", "1234567890")
f.close()
f = safe_open("E:/1.zip")
f.printdir() # 打印压缩包目录
f.close()
执行效果:
File Name Modified Size
demo/1.txt 2020-01-25 16:12:22 22
demo.txt 2020-01-25 16:02:34 18
demo/ 2020-01-25 16:12:16 0
1.txt 2020-01-25 20:45:28 10
write() 大多应用在将磁盘上的文件拷贝到压缩包中的情况。假设有这样一个文件:E:/a.txt,那么我可以使用这样的代码,将 E:/a.txt 拷贝到压缩包中:
f = safe_open("E:/1.zip", mode="a") # 使用追加模式
# 第一个参数指定文件名
f.write("E:/a.txt")
f.close()
f = safe_open("E:/1.zip")
f.printdir() # 打印压缩包目录
f.close()
执行效果:
File Name Modified Size
demo/1.txt 2020-01-25 16:12:22 22
demo.txt 2020-01-25 16:02:34 18
demo/ 2020-01-25 16:12:16 0
1.txt 2020-01-25 20:45:28 10
a.txt 2020-01-25 20:47:44 0
获取压缩包中文件的信息
获取压缩包中指定文件的 info 可以使用 ZipFile 的 getinfo() 方法。getinfo() 方法返回的是 ZipInfo 对象,ZipInfo 对象有许多包含文件信息的属性。例如:
f = safe_open("E:/1.zip")
info = f.getinfo("demo.txt") # 获取压缩包中 demo.txt 的 info
print(info.filename) # 文件名
print(info.date_time) # 上次修改的时间,是一个元组:(年, 月, 日, 时, 分, 秒)
print(info.file_size) # 文件大小(以字节为单位)
print(info.is_dir()) # 该文件是否为文件夹
f.close()
执行效果:
demo.txt
(2020, 1, 25, 16, 2, 34)
18
更便捷地读取文件
使用先 open() 再 read() 的方法有点繁琐ZipFile 对象提供了更便捷的方法,读取压缩包中的文件。例如:
f = safe_open("E:/1.zip")
# 使用 ZipFile 对象的 read() 方法读取 demo.txt
print(f.read("demo.txt").decode()) # 由于 read() 返回的是 bytes,因此我们需要将它解码
f.close()
打印的就是压缩包中 demo.txt 文件中的内容。
打开带密码的压缩包
zipfile 虽然能打开带密码的压缩包,但是前提是需要知道密码打开了带密码的压缩包后,使用 setpassword() 设置压缩包的密码。例如:
f = safe_open("E:/1.zip")
# 设置密码为 123456
f.setpassword(b"123456") # 密码必须为 bytes 类型
print(f.read("demo.txt").decode()) # 不设置解压密码,读取会报错
f.close()
|