在知乎有人私信问,用python对zip/rar文件进行解压缩,把得到的文件进行一定的内容替换再压缩成zip/rar是否可行。
我记得python有个zipfile模块可以做这个事,不过说实话还没试过,所以来写个例子记录下。
例子很简单,不写多的说明了,直接贴代码看注释吧。
# coding=utf-8
import os
import os.path
import zipfile
import sys
reload(sys)
sys.setdefaultencoding('gbk') # windows下编码问题
def gzip(zip_name, file_dir):
zip_name = zip_name.decode('utf-8')
file_dir = file_dir.decode('utf-8')
filelist = []
if os.path.isfile(file_dir):
filelist.append(file_dir)
else:
for root, dirs, files in os.walk(file_dir):
for file in files:
filelist.append(os.path.join(root, file))
zf = zipfile.ZipFile(zip_name, 'w', zipfile.zlib.DEFLATED)
for tar in filelist:
arcname = tar[len(file_dir):]
zf.write(tar, arcname)
zf.close()
def unzip(zip_name, unzip_dir):
unzip_dir = unzip_dir.decode('utf-8') # 不转码会乱码
zip_name = zip_name.decode('utf-8') # 不转码zipfile报错
if not os.path.exists(unzip_dir):
os.mkdir(unzip_dir)
zfobj = zipfile.ZipFile(zip_name)
for file_name in zfobj.namelist():
file_name = file_name.replace('\\', '/')
if file_name.endswith('/'):
# try:
# file_name = file_name.decode('utf-8')
# except UnicodeDecodeError:
# file_name = file_name.decode('gbk')
os.mkdir(os.path.join(unzip_dir, file_name))
else:
# try:
ext_filename = os.path.join(unzip_dir, file_name)
# except UnicodeDecodeError:
# ext_filename = os.path.join(unzip_dir, file_name.decode('gbk'))
ext_filedir = os.path.dirname(ext_filename)
if not os.path.exists(ext_filedir):
os.mkdir(ext_filedir)
data = zfobj.read(file_name)
with open(ext_filename, 'w') as f:
f.write(data)
zfobj.close()
import rarfile
def unrar(rar_file, dir_name): # rarfile需要unrar支持, linux下pip install unrar, windows下在winrar文件夹找到unrar,加到path里
rarobj = rarfile.RarFile(rar_file.decode('utf-8'))
rarobj.extractall(dir_name.decode('utf-8'))
if __name__ == '__main__':
gzip(r'E:\Project\zip_adv\zip文件.zip', r'E:\Project\zip_adv\压缩文件')
unzip(r'E:\Project\zip_adv\zip文件.zip', r'E:\Project\zip_adv\解压缩zip')
unrar(r'E:\Project\zip_adv\rar文件.rar', r'E:\Project\zip_adv\解压缩rar')
也许你会很奇怪为什么没有压缩rar的方法..看下面你就懂了:
rarfile FAQ里明确写了不支持创建rar压缩卷,让你用zip/7z.