看百度網盤我們會發現這么一個需求,新建一個文件夾,然后向文件夾中上傳文件,點擊文件夾可以直接下載,下載的是一個壓縮文件,將文件夾中所有文件全部打包了下載下來。
在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)