导入包
由于Windows文件管理器可以打开zip格式的压缩包,所以希望将所有的rar压缩包转成zip格式。在python中,需要导入zipfile
和rarfile
来处理这两种压缩文件。其中,rarfile
需要额外安装。
其调用方式都是一致的
import rarfile
import zipfile
zFile = zipfile.ZipFile("test.zip")
rFile = rarfile.RarFile("test.rar")
zFile.extractall()
rFile.extractall()
其中ZipFile
的构造函数为
ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True)
各参数含义如下
- file 文件路径或者文件对象
- mode 文件打开模式,可以为r, w, a, x,表示读、写、追加、新建写入。
- compression 压缩方案,可以是ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2或ZIP_LZMA
- allowZip64 为True时,若文件大于4GiB,zipfile将创建使用ZIP64扩展的ZIP文件;为False则引发异常。
- compresslevel 为压缩等级,在ZIP_DEFLATED时可选整数0-9,在ZIP_BZIP2时可选整数1-9,其他压缩方案不可用。
- strict_timestamps 设为False时允许压缩早于1980年以前活2108年之后的文件,但时间戳会设为1980-01-01或2107-12-31。
有关ZipFIle
的更详细的信息,可见Python处理zip压缩文件
RarFile
的构造函数则十分简单
rarfile.RarFile(file[, mode='r'])
其中file
即压缩文件,mode
为打开模式,r
表示读取,w
表示写入。
Cannot find working tool问题
在实际操作过程中,RarFile
遇到了"Cannot find working tool"
问题,这是因为并没有安装rar
的解压工具所致。之所以会有这么奇葩的问题,皆因rar
并非开源协议,所以没法用代码复现其解压逻辑,而只能去找专门的解压exe
。
其解决方案也非常简单,只需安装所谓的working tool
即可,下载并安装winrar后,将安装目录下的UnRAR.exe
添加到工作目录。
中文乱码问题
在实际操作过程中,ZipFile
遇到了中文乱码问题。
为了解决中文乱码问题,不妨看一下zipfile
在读取文件名的时候都干了个啥。打开zipfile
源代码,直接搜索decode
,果然发现了很可疑的几行代码
if flags & 0x800:
# UTF-8 file names extension
filename = filename.decode('utf-8')
else:
# Historical ZIP filename encoding
filename = filename.decode('cp437')
所以对于中文字符,读取文件之后可以通过cp437
进行encode
>>> import zipfile
>>> z = zipfile.ZipFile("test.zip")
>>> for n in z.namelist():
... n.encode("cp437").decode("GBK")
打印结果如下
‘鲁迅卷1.txt’
‘鲁迅卷2.txt’
‘鲁迅卷3.txt’
‘鲁迅卷4.txt’
‘鲁迅卷5.txt’
‘鲁迅卷6.txt’
‘鲁迅卷7.txt’
‘鲁迅卷8.txt’