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

在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. VsCode中使用Emmet神器快速编写HTML代码

    一.Emmet简述 Emmet (前身为 Zen Coding) 是一个能大幅度提高前端开发效率的一个工具. 在前端开发的过程中,一大部分的工作是写 HTML.CSS 代码.特别是手动编写 HTML ...

  2. SQL Server 一致性读

    我们在Oracle和MySQL数据库中已经对一致性读的概念比较熟悉了,但是在SQL Server中却鲜少提及,但SQL Server自2005版本以来其实也实现了一致性读,几乎所有关系型数据库产品的一 ...

  3. 什么是JDK?什么是JRE?JDK与JRE的区别和用途

    一.编程环境与运行环境 JDK(Java Development Kit)称为Java开发包或Java开发工具.是一个编写Java的Applet小程序和应用程序的程序开发环境.JDK是整个Java的核 ...

  4. numpy中stack、hstack,vstack,dstack函数功能解释

    https://blog.csdn.net/Riverhope/article/details/78922006 https://blog.csdn.net/ygys1234/article/deta ...

  5. MATLAB求马氏距离(Mahalanobis distance)

    MATLAB求马氏距离(Mahalanobis distance) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.马氏距离计算公式 d2(xi,  ...

  6. JDK版本更换,Eclipse中所有的项目报错

    我将JDK10切换成JDK8版本以后,原先在eclipse中写的项目全部都报错了.解决方案如下: 1.设置eclipse中的JDK版本和JRE环境:window-preference-java-Com ...

  7. 《生命》第四集:Fish (鱼类)

    旗鱼,是游动最快的鱼,他们不仅速度快,背上的鱼鳍还能吓唬成群的沙丁鱼,他们依靠速度与技巧结队捕食. 飞鱼,继续讲述了一下,飞鱼可以飞起来,把捕食者远远甩掉:飞鱼保护后代的方式是把卵产在水中的树叶上,很 ...

  8. MySQL大小写敏感的解决方案

    前言:对于MySQL的大小写敏感的影响,笔者在一个小项目中深刻的体会到:当想要查询一条数据时,总是出来两条或多条,后来发现是大小写敏感造成的原因,本文就该问题提出解决方案. 1.MySQL大小写敏感的 ...

  9. MySQL高级知识(六)——索引优化

    前言:索引优化的目的主要是让索引不失效,本篇通过相关案例对索引优化进行讲解. 0.准备 创建经典的tb_emp表. DROP TABLE IF EXISTS `tb_emp`; CREATE TABL ...

  10. php面试题整理(二)

    索引,desc 和explain unset只是删除了变量名