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)

 

 

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM