|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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()
复制代码 |
评分
-
参与人数 2 | 荣誉 +4 |
鱼币 +6 |
贡献 +6 |
收起
理由
|
不二如是
| + 2 |
+ 3 |
+ 3 |
鱼C有你更精彩^_^ |
小甲鱼
| + 2 |
+ 3 |
+ 3 |
鱼C有你更精彩^_^ |
查看全部评分
|