python 打包下载 zipfile & tarfile
看百度网盘我们会发现这么一个需求,新建一个文件夹,然后向文件夹中上传文件,点击文件夹可以直接下载,下载的是一个压缩文件,将文件夹中所有文件全部打包了下载下来。
在python中,我们要做文件打包下载,需要用到模块 zipfile
一、python自带zipfile 模块用来读写压缩文件(可处理除了zip类型之类,还可以处理rat,war,jar等类型)
zipfile常见模考和方法:
1、is_zipfile:判断是否路径是压缩文件
zipfile.is_zipfile(filePath)
2、ZipFile
zf = zipfile.ZipFile(path, mode, zipfile.compression, allowZip64)
path:压缩文件路径
mode:文件打开模式--> r:读;w:写;a:添加
compression:zipfile用什么压缩方式
ZIP_STORE:默认方式,只是存储模式,不压缩
ZIP_DEFLATED:压缩
allowZip64:当压缩文件大于2G时,需要设置为True。
3、ZipFile对象的方法:
1)zf.infolist()
返回一个list列表,内容是zip文件中子文件的ZipInfo对象。
包含的字段有:文件名,压缩方式,文件权限模式(读写),文件大小等
2)zf.getinfo(name)
获取压缩文件中某个具体的文件的信息,name:压缩文件中的文件名
3)zf.namelist()
获取压缩文件在中所有文件名称列表
4)zf.printdir()
打印出压缩文件中所有文件信息
5)zf.write(filename,actname)
将文件添加到压缩文件中。
filename:要添加到压缩文件中的文件路径
actname:添加到压缩文件中的保存的文件名称
如下:
结果如下:
6)zf.read(filename [, pwd])
获取压缩文件内指定文件的二进制数据。
要压缩某路径path下的所有文件及文件夹,实现过程如下:
import zipfile
import os
def ZipFile(path, destPath):
try:
zf = zipfile.ZipFile(destPath, "w", zipfile.ZIP_DEFLATED)
for dirpath,dirnames,filenames in os.walk(path):
fpath = dirpath.replace(path, "") # 将当前目录替换为空,即以当前目录为相对目录,如果当前目录下面还存在文件夹,则fpath为 【/子目录】
fpath = fpath and fpath + os.sep or ""
for file in filenames:
zf.write(os.path.join(dirpath, file), fpath+file)
zf.close()
except Exception as e:
print(e)
解压:
1、解压压缩文件中的某个特定文件:
zf.extract(members,path)
2、解压全部文件到指定路径
zf.extractall(path)
二、tarfile
Linux上常用的tar类型不被zipfile支持,所以要处理这种常用的压缩文件,需要用到另一个模块tarfile来处理。
和zipfile一样,也有以下方法:
is_tarfile(filename):检查是否是有效的tar文件
tarObj = open(name[,mode]):打开文件
tarObj对象包含以下方法和属性:
.add(path[,file]):path是文件路径,file是想要在压缩文件中的路径,如果不写的话,压缩文件会从根目录开始压缩
.close():操作完成,一定要记得关闭文件
.extract(filepath[, path]):将压缩文件中的某个文件解压到指定目录
.extractfile(filepath):将压缩文件中的某个文件提取出来,返回值是一个文件对象,可以通过read,write等方法操作
.ignore_zeros:若这一属性设置为True,读取tar包时会跳过空快;如果设置为False,则空快表示tar包结束。这个属性的设置有利于读取损坏的tar包
.list():类似于zipfile的printdir(),但是list()列出的信息更加详细,如果不需要这么详细,可以加上参数False
.getmembers():返回一个列表,包含所有压缩文件信息。
import tarfile
import os
def compress_files(tarpath,filepath):
with tarfile.open(tarpath, "w") as tar:
if os.path.isfile(filepath) :
tar.add(filename)
else:
for dirpath, paths, files in os.walk(tarpath):
fpath = dirpath.replace(tarpath, "")
fpath = fpath and fpath + os.sep or ""
for file in files:
tar.add(os.path.join(dirpath, file), fpath+file)
最新文章
- php中判断字符串是否全是中文或含有中文的实现代码
- bzoj1458 士兵占领
- 【转】mysql忘记root密码的解决方法
- Android图形基础
- Redis操作字符串工具类封装,Redis工具类封装
- eclipse如何运行maven项目
- asp.net C# 导出EXCEL数据
- Linux编程C/C++
- Nginx修改配置实现图片防盗链
- 科尔尼咨询公司 - MBA智库百科
- WEB网页输入框的默认键盘类型控制
- input输入自动大写
- ASP.NET.Core中使用AutoMapper
- JVM进程占用CPU过高问题排查
- Java基础--面向对象编程1(类与对象)
- vs关于“当前不会命中断点 还没有为该文档加载任何符号”的解决方法
- 到底什么是哈希Hash?
- Anaconda 使用指南
- MS17-010漏洞检测
- js拼接table查询信息部分
热门文章
- 产品经理说| AIOps 让告警变得更智能 (下)
- LeetCode题解之 Intersection of Two Arrays
- [20190321]smem的显示缺陷.txt
- Mybatis 学习---${ }与#{ }获取输入参数的区别、Foreach的用法
- Lua代码规范
- python字符串处理以及字符串格式化
- 阿里云ECS Ubuntu16.0 安装 uwsgi 失败解决方案
- VS2017 + QT5 + C++开发环境搭建和计算器Demo测试
- JavaScript原型链和继承
- 在模态框(Modal)中使用UEditor全屏显示的一个坑