目录

一、解压缩 zip 文件

1、基本操作

解压缩

2、zipfile的其他方法

3、解决zip文件解压缩后中文乱码

二、解压缩 rar 文件

1、基本操作


一、解压缩 zip 文件

1、基本操作

基本格式:

zipfile.ZipFile(filename[,mode[,compression[,allowZip64]]])
  • filename:待解压的文件路径;
  • mode:可选 r,w,a 代表不同的打开文件的方式;r 只读;w 重写;a 添加
  • compression:指出这个 zipfile 用什么压缩方法,默认是 ZIP_STORED,另一种选择是 ZIP_DEFLATED;
  • allowZip64:bool型变量,当设置为True时可以创建大于 2G 的 zipdir 文件,默认值 True;

 

解压缩

解压一个zip中的文件,path为解压存储路径,pwd为密码

  • extract(member, path=None, pwd=None)
import zipfile

filename = './1-2009100Z024.zip'
folder_extract = './zipdir'

# 默认模式r,只读
zip = zipfile.ZipFile(filename, 'r')
# 返回压缩包里所有文件夹和文件
zip_list = zip.namelist()

for zip_file in zip_list:
    print(zip_file)
    # 循环解压文件到指定目录
    zip.extract(zip_file, folder_extract)

# 关闭文件,必须有,释放内存
zip.close()

解压zip中的所有文件

# 解压zip中的所有文件,path为解压存储路径,pwd为密码
# extractall(path[,pwd])
zipfile.ZipFile(filename).extractall('./zipdir')

 

2、zipfile的其他方法

判断文件是否是个有效的zipfile

# 判断文件是否是个有效的zipfile
result = zipfile.is_zipfile(filename)  # True

 

存储zip文件中所有子文件的path(相对于zip文件包而言的)

# 返回列表,存储zip文件中所有子文件的path(相对于zip文件包而言的)
result = zipfile.ZipFile(filename).namelist()  # ['画册.pptx', '第一PPT.url', 'www.1ppt.com.html']

 

存储每个zip文件中子文件的ZipInfo对象

# 返回列表,存储每个zip文件中子文件的ZipInfo对象
result = zipfile.ZipFile(filename).infolist()  #
print(result)  # 列表,所有ZipInfo对象
print(result[0])  # 列表中第一个ZipInfo对象
print(result[0].filename)  # 列表中第一个ZipInfo对象的文件名
print(result[0].compress_type)  # 列表中第一个ZipInfo对象的压缩方法
print(result[0].file_size)  # 列表中第一个ZipInfo对象的源文件大小
print(result[0].compress_size)  # 列表中第一个ZipInfo对象的文件压缩后大小

输出结果:

[<ZipInfo filename='画册.pptx' compress_type=deflate external_attr=0x20 file_size=1639595 compress_size=1570551>, <ZipInfo filename='第一PPT.url' compress_type=deflate external_attr=0x20 file_size=123 compress_size=120>, <ZipInfo filename='www.1ppt.com.html' compress_type=deflate external_attr=0x20 file_size=1384 compress_size=653>]
<ZipInfo filename='画册.pptx' compress_type=deflate external_attr=0x20 file_size=1639595 compress_size=1570551>
画册.pptx
8
1639595
1570551

 

打印输出zip文件的目录结构,包括每个文件的path,修改时间和大小

zipfile.ZipFile(filename).printdir()

输出结果:

File Name                                             Modified             Size
画册.pptx                                        2020-09-09 21:51:14      1639595
第一PPT.url                                      2015-12-11 14:30:12          123
www.1ppt.com.html                              2018-12-09 10:14:30         1384

 

获取一个子文件的文件对象,可以对其进行read,readline,write等操作

# 获取一个子文件的文件对象,可以对其进行read,readline,write等操作
# open(name[,mode[,pwd]])
file = zipfile.ZipFile(filename).open('www.1ppt.com.html', 'r')
print(file.readline())
file.close()

输出结果:

b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r\n'

 

为zip文件设置默认密码

# 为zip文件设置默认密码
zipfile.ZipFile(filename).setpassword(b'123456')  # 密码要是byte类型的

未生效?待研究

 

读取zip中的所有文件,验证他们的CRC校验和。

  • 返回第一个损坏文件的名称,如果所有文件都是完整的就返回None
# 读取zip中的所有文件,验证他们的CRC校验和。返回第一个损坏文件的名称,如果所有文件都是完整的就返回None
result = zipfile.ZipFile(filename).testzip()
print(result)

输出结果:

None

 

将zip外的文件filename写入到名为arcname的子文件中

  • arcname可以带有相对zip包的路径
  • 打开方式为w或a,默认是r
# 将zip外的文件filename写入到名为arcname的子文件中(当然arcname也是带有相对zip包的路径的),打开方式为w或a
# write(filename[,arcname[,compression_type]])
zipfile.ZipFile(filename, 'a').write('./test.txt')

输出结果:test.txt文件被添加到1-201026130017.zip压缩包中了

python打压缩包 python打开压缩包_解压缩

 

将zip外文件,添加到压缩包的目录中,并重命名

zipfile.ZipFile(filename, 'a').write('./test.txt', '/test/test2.txt')

输出结果:test.txt文件被添加到压缩包的test目录,并且重命名为test2.txt;test目录是自动被创建的;

python打压缩包 python打开压缩包_html_02

python打压缩包 python打开压缩包_html_03

 

3、解决zip文件解压缩后中文乱码

要修改zipfile模块的源代码

在zipfile模块中,搜索关键字"cp437",追加2行代码,然后再运行解压缩,中文乱码问题可以解决。

在搜索到的位置下面(搜索到2处),追加一行代码:

追加代码:fname_str = fname_str.encode("cp437").decode('gbk')

python打压缩包 python打开压缩包_python打压缩包_04

追加代码:filename = filename.encode("cp437").decode('gbk')

python打压缩包 python打开压缩包_解压缩_05

 

二、解压缩 rar 文件

  • Python 本身不支持 rar 文件的解压,需要先安装相关依赖才可使用;
  • 安装依赖模块:pip install --user rarfile
  •  

1、基本操作

import rarfile

filename = './1-201026130017.rar'
# mode的值只能为r
rar = rarfile.RarFile(filename, mode='r')
# 得到压缩包里所有的文件
rarfile_list = rar.namelist()
print(rarfile_list)
rar.extractall('./zipdir')
 # 关闭文件,必须有,释放内存
rar.close()