python 解压7z格式

Python011

python 解压7z格式,第1张

有项目用到7z的数据压缩格式,有比较高的压缩率,但在windows中解压起来也比较麻烦,先后找了几个库,有的无法在windows中使用(libarchive),有的解压起来性能比较慢(pypack、pattool),还有的是需要调用7z的exe程序,都比较麻烦。

最后找到了 py7zr ,使用起来方便多了,性能也没啥问题。

安装:

解压:

也支持生成7z文件,具体可看官网介绍。

体会:数据压缩存储最好不要使用7z格式,比较不常用,可能后续会造成一些麻烦。

1、python使用zipfile模块压缩和解压ZIP文件

2、读取zip文件

首先,通过zipfile模块打开指定zip文件,如:

zpfd = zipfile.ZipFile(path, mode='r')

对于zipfile,其标志与open所用的打开文件标志有所不同,不能识别 'rb'。

然后,读取zip文件中的内容,zipfile对象提供一个read(name)的方法,name为zip文件中的一个文件入口,执行完成之后,将返回读出的内容,如:

for filename in zpfd.namelist():

tmpcont = zpfd.read(filename)

print 'len(tmpcont)', 'tmpcont'

需要注意的是,读取zip文件时,只能读取内容

3、写入zip文件

首先,需要zipfile模块写打开或创建zip文件,如:

zpfd = zipfile.ZipFile(path, mode='w')

写打开是标志可以为'w'或'a'('a'表示写入一个zip文件), 或者传入第三个参数cmopression压缩标志

compression=zipfile.ZIP_DEFLATED 需要导入zlib模块

compression=zipfile.ZIP_STORED则表示只对文件进行打包,并不压缩

写入有两种方式,一种是直接写入一个已经存在的文件,可使用zipfile对象中write(filename, arcname, compress_type)第一个参数为文件名,第二个参数指写入zip文件中的文件名,默认与filename一致,第三个参数压缩标志可以覆盖打开zipfile时的使用参数;另一种是写入一个字符串,可使用zipfile对象中的writestr(zinfo_or_arcname, bytes),第一个参数是zipinfo对象或写到zip文件中的压缩名,第二个参数是待写入的字符串

4、最后,对于打开的zipfile对象需要进行关闭,从而使得写入内容真正写入磁盘,即:

zpfd.close()

python一堆文件解压方法如下。

压缩包解压要用的是zipfile这个包。

zip_file = zipfile.ZipFile(r'D:\数据源\XX_%s.zip'%yday)

zip_list = zip_file.namelist() # 压缩文件清单,可以直接看到压缩包内的各个文件的明细

for f in zip_list: # 遍历这些文件,逐个解压出来,

  zip_file.extract(f,r'D:\数据源')

zip_file.close() # 不能少!

print('昨日日志解压完成,请在文件夹中验收!') # 当然我是不需要查收的(*/ω\*)

这里的解压操作实际就相当于鼠标右键“解压到当前文件夹”的效果。

完成解压后运行.close()是个比较好的习惯,否则可能会导致包括但不限于:

文件会一直被占用着,可能无法重新打开;

在进程结束之前文件都删不掉;

文件内容不能即时 flush 到磁盘直到进程结束;

到此,整个流程在无需打开浏览器和文件夹的情况下便自动完成了。

为了方便日常运行代码,这里把上面的两个流程包装成一个函数,下载解压

#下载昨日日志

def download_XXlog():

yday = (date.today()+timedelta(days=-1)).strftime('%Y%m%d') # 获取昨日日期

r =  requests.get('http://XXXXXXXX/XX_%s.zip'%yday) # 获取以日期命名的压缩包信息

with open(r'D:\数据源\XX_%s.zip'%yday,'wb') as code: # 将压缩包内容写入到 "D:\数据源\" 下,并按日期命名

code.write(r.content)

print('昨日XX日志下载完成。')

  zip_file = zipfile.ZipFile(r'D:\数据源\XX_%s.zip'%yday)

zip_list = zip_file.namelist() # 压缩文件清单,可以直接看到压缩包内的各个文件的明细

for f in zip_list: # 遍历这些文件,逐个解压出来,

    zip_file.extract(f,r'D:\数据源')

zip_file.close() # 不能少!

print('昨日日志解压完成,请在文件夹中验收!')

download_XXlog()

拓展

作为拓展,这里再加一个可以根据实际情况输入(input)起始和终止日期,来下载一个特定时间段日志的函数,这里就涉及了datetime和time这两个工具包了。