網站首頁 編程語言 正文
一、gzip
GZIP概念
Gzip是若干種文件壓縮程序的簡稱,通常指GNU計劃的實現,此處的gzip代表GNU zip。也經常用來表示gzip這種文件格式。
GZIP最早由Jean-loup Gailly和Mark Adler創建,用于UNⅨ系統的文件壓縮。我們在Linux中經常會用到后綴為.gz的文件,它們就是GZIP格式的。現今已經成為Internet 上使用非常普遍的一種數據壓縮格式,或者說一種文件格式。
HTTP協議的GZIP編碼是一種用來改進WEB應用程序性能的技術。大流量的WEB站點常常使用GZIP壓縮技術來讓用戶感受更快的速度。這一般是指WWW服務器中安裝的一個功能,當有人來訪問這個服務器中的網站時,服務器中的這個功能就將網頁內容壓縮后傳輸到來訪的電腦瀏覽器中顯示出來.一般對純文本內容可壓縮到原大小的40%.這樣傳輸就快了,效果就是你點擊網址后會很快的顯示出來.當然這也會增加服務器的負載. 一般服務器中都安裝有這個功能模塊的。
文件格式
gzip的基礎是DEFLATE,DEFLATE是LZ77與哈夫曼編碼的一個組合體。盡管這種文件格式允許多個這樣的數據拼接在一起,在解壓時也能認出它們是拼接在一起的數據,但通常gzip僅用來壓縮單個文件。多個文件的壓縮歸檔通常是首先將這些文件合并成一個tar文件,然后再使用gzip進行壓縮,最后生成的.tar.gz或者.tgz文件就是所謂的“tar壓縮包”或者“tarball”。
注意不要將gzip和ZIP壓縮格式混淆。ZIP也使用DEFLATE算法,而且可移植性更好,不需要一個外部的歸檔工具就可以包容多個文件。但是,由于ZIP對每個文件進行單獨壓縮而沒有利用文件間的冗余信息(即固實壓縮),所以ZIP的壓縮率會稍遜于tar壓縮包。
二、Python gzip庫
gzip庫是python的標準庫,此模塊提供的簡單接口幫助用戶壓縮和解壓縮文件,功能類似于 GNU 應用程序 gzip 和 gunzip。數據壓縮由 zlib
模塊提供。
gzip模塊提供 GzipFile
類和 open()
、compress()
、decompress()
幾個便利的函數。GzipFile
類可以讀寫 gzip 格式的文件,還能自動壓縮和解壓縮數據,這讓操作壓縮文件如同操作普通的 file object 一樣方便。
注意,此模塊不支持部分可以被 gzip 和 gunzip 解壓的格式,如利用 compress 或 pack 壓縮所得的文件。
gzip.open
gzip.open( filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)
以二進制方式或者文本方式打開一個 gzip 格式的壓縮文件,返回一個 file object。
參數說明:
filename:參數可以是一個實際的文件名(一個str 對象或者bytes對象), 或者是一個用來讀寫的已存在的文件對象。
mode:參數可以是二進制模式'r'
, 'rb'
, 'a'
, 'ab'
, 'w'
, 'wb'
, 'x'
or 'xb'
, 或者是文本模式 'rt'
, 'at'
, 'wt'
, or 'xt'
。默認值是 'rb'
。它的默認值是'r',表示以文本模式打開閱讀。其他常見的值有:'w'用于寫入(如果文件已經存在,則截斷它),'x'用于獨占創建,'a'用于追加(在一些Unix系統上,這意味著所有的寫入都追加到文件的末尾,不管當前的尋址位置如何)。在文本模式下,如果沒有指定編碼,使用的編碼是與平臺有關的:調用locale.getpreferredencoding(False)來獲得當前的locale編碼。(對于讀寫原始字節,使用二進制模式,不指定編碼。) 可用的模式。
compresslevel參數是從0到9的整數,壓縮等級; 壓縮格式分類。
import gzip # 創建一個gzip文件 content = "Hello world!" f = gzip.open('file.txt.gz', 'wb') f.write(content.encode()) f.close()
其中'wb'就是寫入,若沒有該路徑文件將會自動生成一個文件。
gzip.GzipFile壓縮和解壓
class gzip.GzipFile( filename=None, mode=None, compresslevel=9, fileobj=None, mtime=None)
?GzipFile
類的構造器支持 truncate()
的異常,與 file object 的大多數方法非常相似。fileobj和 filename至少有一個不為空。
新的實例基于 fileobj,它可以是一個普通文件,一個 io.BytesIO
對象,或者任何一個與文件相似的對象。當 filename 是一個文件對象時,它的默認值是 None
。
當 fileobj 為 None
時, filename 參數只用于 gzip 文件頭中,這個文件有可能包含未壓縮文件的源文件名。如果文件可以被識別,默認 fileobj 的文件名;否則默認為空字符串,在這種情況下文件頭將不包含源文件名。
需要注意的是,文件默認使用二進制模式打開。如果要以文本模式打開文件一個壓縮文件,應該使用 open()
方法(或者使用 io.TextIOWrapper
包裝 GzipFile
)。
調用 GzipFile
的 close()
方法不會關閉 fileobj,可以將一個 io.BytesIO
對象作為 fileobj,也可以使用 io.BytesIO
的 getvalue()
方法從內存緩存中恢復數據。
GzipFile
支持 io.BufferedIOBase
類的接口, 包括迭代和 with
語句。只有 truncate()
方法沒有實現。
import gzip # 創建GzipFile實例 zf = gzip.GzipFile('file_1.txt.gz', mode = 'wb') contents = "Hello world!Friend!" zf.write(contents.encode()) # 寫文件 zf.close() # 關閉
gzip.comress()壓縮數據
另外一種方法是用gzip.comress()方法將從文件中讀出的數據進行壓縮,再將壓縮后的數據寫入到文件中。
import gzip contents = "Hello world!Friend!" pf = gzip.open('file_2.txt.gz', 'wb') data_comp = gzip.compress(contents.encode()) # 壓縮數據 pf.write(data_comp) # 寫文件 pf.close() # 關閉
從壓縮文件看該方法和前2種效果是一樣的。
下面這種方法更簡便、更安全:
import gzip with open('file_3.txt.gz', 'wb') as pw, open('file_3.txt','rb') as pr: pw.write(gzip.compress(pr.read()) )
解壓數據
第一種
直接open就可以了:
import gzip zip_filename = 'file.txt.gz' with open('./file_1.txt','wb') as pw: zf = gzip.open(zip_filename, mode = 'rb') pw.write(zf.read()) # 寫文件 zf.close()
第二種
和壓縮方法的順序是一樣的,使用GzipFile就好了:
zip_filename = 'file_2.txt.gz' with open('./file_2.txt','wb') as pw: zf = gzip.GzipFile(zip_filename, mode = 'rb') pw.write(zf.read()) # 寫文件 zf.close()
第三種
zip_filename = 'file_3.txt.gz' with open(zip_filename, 'rb') as pr, open('./file_3.txt','wb') as pw: pw.write(gzip.decompress(pr.read()) )
集體解壓
import os import gzip def unzip_gz_file(path, new_path): count = 0 try: for f_path in os.listdir(path): if '.gz' in f_path: try: with gzip.GzipFile(fileobj=open(path + "/" + f_path, 'rb'), mode='rb') as g: with open(new_path + "/" + f_path.replace(".gz", ""), "wb") as f: f.write(g.read()) print(count, f"文件{f_path} 解壓完成...") except Exception as e: print(f_path, e) count += 1 except Exception as e: print(e) else: print("文件全部解壓完成!") path = './' new_path = './unzip_file' unzip_gz_file(path, new_path)
原文鏈接:https://blog.csdn.net/master_hunter/article/details/127860581
相關推薦
- 2022-06-19 C++深入探究引用的本質與意義_C 語言
- 2022-08-19 python查看自己安裝的所有庫并導出的命令_python
- 2023-04-02 Python使用conda如何安裝requirement.txt的擴展包_python
- 2022-07-09 Redis中Bitmap的使用示例_Redis
- 2021-12-09 Jenkins+GitLab+Docker持續集成LNMP
- 2022-06-12 3種Python?實現酷炫進度條的實用方法_python
- 2023-01-08 利用C#實現批量圖片格式轉換功能_C#教程
- 2022-04-11 springboot上傳文件到Nginx代理的FTP文件服務器
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支