Python中的Zip模塊
在之前的項(xiàng)目中,遇到了一種業(yè)務(wù)場景,對于分包處理的smali文件,通過Apktool 1.5版進(jìn)行打包,只會(huì)識(shí)別smali文件下的smali文件,而從Dex并沒有導(dǎo)入到最終的apk包中,需要寫一個(gè)腳本重新將其余的smali文件打包成從Dex文件,然后寫入到apk中,這里我使用了python中的zip模塊來處理。
zipfile模塊下的ZipFile類
我們可以看一下該類中的注釋:
Class with methods to open, read, write, close, list zip files.
z = ZipFile(file, mode="r", compression=ZIP_STORED, allowZip64=True)
file: Either the path to the file, or a file-like object.
If it is a path, the file will be opened and closed by ZipFile.
mode: The mode can be either read 'r', write 'w', exclusive create 'x',
or append 'a'.
compression: ZIP_STORED (no compression), ZIP_DEFLATED (requires zlib),
ZIP_BZIP2 (requires bz2) or ZIP_LZMA (requires lzma).
allowZip64: if True ZipFile will create files with ZIP64 extensions when
needed, otherwise it will raise an exception when this would
be necessary.
參數(shù) | 意義 |
---|---|
file | zip壓縮文件路徑 |
mode | 打開模式,其中r是讀取已存在的zip文件,w表示新建一個(gè)zip或者覆蓋原有zip文件,a表示將內(nèi)容添加到現(xiàn)有的zip中 |
compression | zip文檔使用的壓縮方法,zipfile. ZIP_STORED、ZIP_DEFLATED、ZIP_BZIP2、ZIP_LZMA |
allowZip64 | 需要?jiǎng)?chuàng)建大的zip文件的時(shí)候最好設(shè)置成True |
獲取zip文件中的信息
import zipfile
import os
# -*- coding: utf-8 -*-
# 打開壓縮文件
zipFile = r'E:\Android\Android.zip'
zipTask1 = zipfile.ZipFile(zipFile,'r')
# 遍歷zip壓縮文件中的文件名稱
for name in zipTask1.namelist():
print(name)
# 遍歷zip壓縮文件中的文件信息
for info in zipTask1.infolist():
print(info)
zipTask1.close()
運(yùn)行結(jié)果:
創(chuàng)建zip文件以及添加文件
# 將一個(gè)文件寫入到zip包中
zipTask2 = zipfile.ZipFile(zipFile,'a',zipfile.ZIP_DEFLATED)
fileTxt = os.path.join(r'E:\Android',r'readme.txt')
zipTask2.write(fileTxt,r'readme2.txt')
zipTask2.close()
運(yùn)行結(jié)果:
我們可以到成功的將這個(gè)文件寫到了該zip文件中。
解壓zip文件
# 解壓文件:
targetDir = r'E:\MyBlog\Python_zip'
zipTask3 = zipfile.ZipFile(zipFile,'r',zipfile.ZIP_DEFLATED)
zipTask3.extractall(targetDir)
zipTask3.close()
設(shè)置解壓密碼
# 設(shè)置壓縮文件密碼
pwd = 'ilovepython'
zipFile = r'E:\Android\Android.zip'
zipTask4 = zipfile.ZipFile(zipFile,'r',zipfile.ZIP_DEFLATED)
zipTask4.setpassword(pwd)