看百度网盘我们会发现这么一个需求,新建一个文件夹,然后向文件夹中上传文件,点击文件夹可以直接下载,下载的是一个压缩文件,将文件夹中所有文件全部打包了下载下来。

在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)

    

python 打包下载 zipfile & tarfile的更多相关文章

  1. flask BytesIO() 多个文件打包下载 zipfile

    使用zipfile模块可以将多个文件打包成zip文件进行下载,但是常规的操作方式会在服务器磁盘上生成一个zip文件占用磁盘空间. 后引入BytesIO将文件写入到内存中然后下载: def dl_pla ...

  2. Python第二十天 shutil 模块 zipfile tarfile 模块

    Python第二十天  shutil 模块  zipfile   tarfile 模块 os文件的操作还应该包含移动 复制  打包 压缩 解压等操作,这些os模块都没有提供 shutil 模块shut ...

  3. Python的压缩文件处理 zipfile & tarfile

    本文从以下两个方面, 阐述Python的压缩文件处理方式: 一. zipfile 二. tarfile 一. zipfile 虽然叫zipfile,但是除了zip之外,rar,war,jar这些压缩( ...

  4. Python打包文件夹的方法小结(zip,tar,tar.gz等)

    本文实例讲述了Python打包文件夹的方法.分享给大家供大家参考,具体如下: 一.zip ? 1 2 3 4 5 6 7 8 9 10 11 import os, zipfile #打包目录为zip文 ...

  5. python版本下载时时,官方目录web-based与executable和embeddable 的区别

    背景:安装python时不知道选择哪个版本以及他们之间的意思. 1.X86和X86-64的区别:系統是32 bit 的版本还是 64bit 的 2.web-based ,executable , em ...

  6. ASP.NET五步打包下载Zip文件

    本文版权归博客园和作者吴双共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws 首先分享几个振奋人心的新闻: 1.谷歌已经宣布加入.NET基金会 2.微软加入Linux基金会, ...

  7. python打包成exe

    目前有三种方法可以实现python打包成exe,分别为 py2exe Pyinstaller cx_Freeze 其中没有一个是完美的 1.py2exe的话不支持egg类型的python库 2.Pyi ...

  8. ASP.NET多文件批量打包下载

    在对多文件打包中用到了 DotNetZip 的方法来实现对多文件压缩打包.需要到http://dotnetzip.codeplex.com/处下载该文件,然后引用即可. Default.aspx: & ...

  9. 反编译python打包的exe文件

    目录 1.前言 2.使用环境 3.还原过程 4.号外 5.exe文件和所用到的反编译工具 6.参考 7.去签名(补漏) 前言 拿到了利用驱动人生进行传播的病毒样本,发现是python打包成的exe文件 ...

随机推荐

  1. asp.net core 发布到 docker 容器时文件体积过大及服务端口的配置疑问

    在 asp.net core 发布时,本人先后产生了3个疑问. 1.发布的程序为什么不能在docker容器中运行 当时在window开发环境中发布后,dotnet xxx.dll可以正常运行:但放入d ...

  2. 最简单的java浏览器

    /** * Created by Admin on 2017/3/27. */ import java.awt.BorderLayout; import java.awt.Container; imp ...

  3. SQL Server -- 回忆笔记(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询

    SQL Server知识点回忆篇(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询 1. insert 如果sql server设置的排序规则不是简体中文,必须在简体中文字符串前加N, ...

  4. Windows Server 2016-清理残留域控信息

    本章紧接上文,当生产环境中域控出现问题无法修复以后,一方面我们需要考虑抢夺FSMO角色,另一方面我们需要考虑的问题是清理当前域控的残留信息,以防止残留数据信息导致用户验证或者解析异常等问题.本章讲到如 ...

  5. 将web项目部署到阿里云服务器上

    一.用eclipse将写好的项目打成war包 1.右键点击项目,选择Export 选择打包之后的路径,点击Finsh. 2.购买阿里云服务器 按下图选择 3.设置云服务器防火墙 4.远程连接云服务器 ...

  6. js对WebApi请求的基本操作

    在WebAPI对外提供的,大概有4种接口,get,post,delete,put,现在,我就简单的来说一下js请求webApi的方式和大概的作用: get:在webApi中,get方法通常是用来获取数 ...

  7. February 18th, 2018 Week 8th Sunday

    Don't cry for what is lost. Smile for what still remains. 别为失去的哭泣,为还留在你身边的一切微笑吧. I have been told th ...

  8. 【项目 · Wonderland】立项报告

    [软件工程实践 · 团队项目] 第二次作业 团 队 作 业 原 文:http://www.cnblogs.com/andwho/p/7598662.html Part 0 · 简 要 目 录 Part ...

  9. JavaScript数组对象详情

    Array 数组概述 Array 类型是 ECMAScript 最常用的类型.javaScript 中的 Array 类型和其他语言中的数组有着很大的区别. 虽然数组都是有序排列,但 javaScri ...

  10. Alex网络

    alexNet共有八层网络卷积层1:输入224*224*3 卷积核11*11*3*96 步长为4 然后是ReLU.局部归一化.3*3步长为2的最大值池化卷积层2:输入为28*28*96 卷积核5*5* ...