zlib 壓縮
import zlib import this s = this.s.encode('utf8')*10 for i in range(10): data = zlib.compress(s,i) #compress 接收兩個參數分別是要壓縮的字節和壓縮等級。 de_data = zlib.decompress(data) #解壓縮 print(f"data:{len(data)},s:{len(s)}")
結果如下:
data:8571,s:8560 data:562,s:8560 data:560,s:8560 data:558,s:8560 data:519,s:8560 data:511,s:8560 #可以看出壓縮到極限以后無法在繼續壓縮 data:511,s:8560 data:511,s:8560 data:511,s:8560 data:511,s:8560
這個壓縮方法有一個明顯的缺陷:需要有足夠大的內存去存儲待壓縮數據和壓縮后的數據。那我們是否可以每次壓縮一部分呢,也是可以的
import zlib import this s = this.s*10 with open('a.txt','w') as t: t.write(s) com = zlib.compressobj() with open('a.txt', 'rb') as f: while True: a = f.read(64) if not a: break data = com.compress(a) if data: print(f"data:{len(data)}") else: print("doing....") result = com.flush() print(f"result:{len(result)}")
結果如下:
doing....
doing....
doing....
doing....
doing....
doing....
doing....
doing....
result:515
gzip 壓縮數據
gzip 和 zlib都有compress和deconpress方法,用法也是一樣的,說說文件的操作把
讀取壓縮文件示例
import gzip with gzip.open('file.txt.gz', 'rb') as f: file_content = f.read()
創建壓縮GZIP文件的示例:
import gzip content = "Lots of content here" with gzip.open('file.txt.gz', 'wb') as f: f.write(content)
GZIP壓縮現有文件的示例:
import gzip import shutil with open('file.txt', 'rb') as f_in, gzip.open('file.txt.gz', 'wb') as f_out: shutil.copyfileobj(f_in, f_out)
bz2壓縮
bz2.compress
bz2.decompress
基本與zlib一樣不多說
tarfile 壓縮數據
如何將整個tar存檔解壓縮到當前工作目錄:
import tarfile tar = tarfile.open("sample.tar.gz") tar.extractall() tar.close()
如何TarFile.extractall()使用生成器函數而不是列表來提取tar存檔的子集:
import os import tarfile def py_files(members): for tarinfo in members: if os.path.splitext(tarinfo.name)[1] == ".py": yield tarinfo tar = tarfile.open("sample.tar.gz") tar.extractall(members=py_files(tar)) tar.close()
如何從文件名列表創建未壓縮的tar存檔:
import tarfile tar = tarfile.open("sample.tar", "w") for name in ["foo", "bar", "quux"]: tar.add(name) tar.close()
使用with語句的相同示例:
import tarfile with tarfile.open("sample.tar", "w") as tar: for name in ["foo", "bar", "quux"]: tar.add(name)
如何閱讀gzip壓縮的tar存檔並顯示一些成員信息:
import tarfile tar = tarfile.open("sample.tar.gz", "r:gz") for tarinfo in tar: print tarinfo.name, "is", tarinfo.size, "bytes in size and is", if tarinfo.isreg(): print "a regular file." elif tarinfo.isdir(): print "a directory." else: print "something else." tar.close()
如何使用以下過濾器 參數創建存檔並重置用戶信息TarFile.add():
import tarfile def reset(tarinfo): tarinfo.uid = tarinfo.gid = 0 tarinfo.uname = tarinfo.gname = "root" return tarinfo tar = tarfile.open("sample.tar.gz", "w:gz") tar.add("foo", filter=reset) tar.close()
