python 數據壓縮


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


免責聲明!

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



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