源代碼:?Lib/gzip.py
此模塊提供的簡單接口幫助用戶壓縮和解壓縮文件,功能類似于 GNU 應用程序?gzip?和?gunzip。
數據壓縮由?zlib?模塊提供。
gzip?模塊提供?GzipFile?類和?open()、compress()、decompress()?幾個便利的函數。GzipFile?類可以讀寫?gzip?格式的文件,還能自動壓縮和解壓縮數據,這讓操作壓縮文件如同操作普通的?file object?一樣方便。
注意,此模塊不支持部分可以被?gzip?和?gunzip?解壓的格式,如利用?compress?或?pack?壓縮所得的文件。
這個模塊定義了以下內容:
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'
。
The?compresslevel?argument is an integer from 0 to 9, as for the?GzipFile?constructor.
對于二進制模式,這個函數等價于?GzipFile?構造器:GzipFile(filename,?mode,?compresslevel)
。在這個例子中,encoding,?errors?和?newline?三個參數一定不要設置。
對于文本模式,將會創建一個?GzipFile?對象,并將它封裝到一個?io.TextIOWrapper?實例中, 這個實例默認了指定編碼,錯誤抓獲行為和行。
在 3.3 版更改:?支持?filename?為一個文件對象,支持文本模式和?encoding,?errors?和?newline?參數。
在 3.4 版更改:?支持?'x'
,?'xb'
?和?'xt'
?三種模式。
在 3.6 版更改:?接受一個?path-like object。
exception?gzip.BadGzipFile
針對無效 gzip 文件引發的異常。 它繼承自?OSError。 針對無效 gzip 文件也可能引發?EOFError?和?zlib.error。
3.8 新版功能.
class?gzip.GzipFile(filename=None,?mode=None,?compresslevel=9,?fileobj=None,?mtime=None)
GzipFile?類的構造器,它模擬了?file object?的大部分方法,但?truncate()?方法除外。?fileobj?和?filename?中至少有一個必須為非空值。
新的實例基于?fileobj,它可以是一個普通文件,一個?io.BytesIO?對象,或者任何一個與文件相似的對象。當?filename?是一個文件對象時,它的默認值是?None
。
當?fileobj?為?None
?時,?filename?參數只用于?gzip?文件頭中,這個文件有可能包含未壓縮文件的源文件名。如果文件可以被識別,默認?fileobj?的文件名;否則默認為空字符串,在這種情況下文件頭將不包含源文件名。
mode?參數可以是?'r'
,?'rb'
,?'a'
,?'ab'
,?'w'
,?'wb'
,?'x'
?或?'xb'
?中的一個,具體取決于文件將被讀取還是被寫入。 如果可識別則默認為?fileobj?的模式;否則默認為?'rb'
。 在未來的 Python 發布版中將不再使用?fileobj?的模式。 最好總是指定?mode?為寫入模式。
需要注意的是,文件默認使用二進制模式打開。 如果要以文本模式打開一個壓縮文件,請使用?open()?方法 (或者使用?io.TextIOWrapper?包裝?GzipFile)。
compresslevel?參數是一個從?0
?到?9
?的整數,用于控制壓縮等級;1
?最快但壓縮比例最小,9
?最慢但壓縮比例最大。?0
?不壓縮。默認為?9
。
mtime?參數是一個可選的數字時間戳用于寫入流的最后修改字段,。mtime?只在壓縮模式中使用。如果省略或者值為?None
,則使用當前時間。更多細節,詳見?mtime?屬性。
調用?GzipFile?對象的?close()
?方法不會關閉?fileobj,因為你可能希望增加其它內容到已經縮的數據中。 你還可以傳入一個?io.BytesIO?對象作為?fileobj?打開,并使用?io.BytesIO?對象的?getvalue()?方法提取所得到的內存緩沖區數據。
GzipFile?支持?io.BufferedIOBase?接口,包括迭代和?with?語句。 只有?truncate()?方法未被實現。
GzipFile?還提供了以下的方法和屬性:
peek(n)
在不移動文件指針的情況下讀取?n?個未壓縮字節。最多只有一個單獨的讀取流來服務這個方法調用。返回的字節數不一定剛好等于要求的數量。
備注
調用?peek()?并沒有改變?GzipFile?的文件指針,它可能改變潛在文件對象(例如:?GzipFile?使用?fileobj?參數進行初始化)。
3.2 新版功能.
mtime
在解壓的過程中,最后修改時間字段的值可能來自于這個屬性,以整數的形式出現。在讀取任何文件頭信息前,初始值為?None
。
所有?gzip?東方壓縮流中必須包含時間戳這個字段。以便于像?gunzip這樣的程序可以使用時間戳。格式與?time.time()?的返回值和?os.stat()?對象的?st_mtime?屬性值一樣。
name
指向磁盤上 gzip 文件的路徑,為?str?或?bytes?對象。 等價于原始輸入路徑上?os.fspath()?的輸出,不帶其他標準化、解析或擴展。
在 3.1 版更改:?支持?with?語句,構造器參數?mtime?和?mtime?屬性。
在 3.2 版更改:?添加了對零填充和不可搜索文件的支持。
在 3.3 版更改:?實現?io.BufferedIOBase.read1()?方法。
在 3.4 版更改:?支持?'x'
?and?'xb'
?兩種模式。
在 3.5 版更改:?支持寫入任意?bytes-like objects。read()?方法可以接受?None
?為參數。
在 3.6 版更改:?接受一個?path-like object。
在 3.12 版更改:?移除?filename
?屬性,改用?name?屬性。
3.9 版后已移除:?打開?GzipFile?用于寫入而不指定?mode?參數的做法已被棄用。
gzip.compress(data,?compresslevel=9,?*,?mtime=None)
壓縮?data,返回一個包含已壓縮數據的?bytes?對象。?compresslevel?和?mtime?與上述?GzipFile?構造器的對應參數含義相同。 當?mtime?設為?0
?時,此函數將等價于?zlib.compress()?的?wbits?設為?31
。 zlib 函數速度更快一些。
3.2 新版功能.
在 3.8 版更改:?添加了?mtime?形參用于可重復的輸出。
在 3.11 版更改:?通過一次性壓縮全部數據而不是通過流方式提高了速度。 將?mtime?設為?0
?的調用將被委托給?zlib.compress()?以提高速度。
gzip.decompress(data)
解壓縮?data,返回一個包含已解壓數據的?bytes?對象。 此函數可以解壓縮多成員的 gzip 數據(即多個 gzip 塊拼接在一起)。 當數據確定只包含一個成員時則?wbits?設為 31 的?zlib.decompress()?函數更快一些。
3.2 新版功能.
在 3.11 版更改:?通過一次性解壓縮全部數據而不是通過流方式提高了速度。
用法示例
讀取壓縮文件示例:
import gzip with gzip.open('/home/joe/file.txt.gz', 'rb') as f:file_content = f.read()
創建GZIP 文件示例:
import gzip content = b"Lots of content here" with gzip.open('/home/joe/file.txt.gz', 'wb') as f:f.write(content)
使用 GZIP 壓縮已有的文件示例:
import gzip import shutil with open('/home/joe/file.txt', 'rb') as f_in:with gzip.open('/home/joe/file.txt.gz', 'wb') as f_out:shutil.copyfileobj(f_in, f_out)
使用 GZIP 壓縮二進制字符串示例:
import gzip s_in = b"Lots of content here" s_out = gzip.compress(s_in)
參見
模塊?zlib
支持?gzip?格式所需要的基本壓縮模塊。
命令行界面
gzip?模塊提供了簡單的命令行界面用于壓縮和解壓縮文件。
在執行后?gzip?模塊會保留輸入文件。
在 3.8 版更改:?添加一個帶有用法說明的新命令行界面命令。 默認情況下,當你要執行 CLI 時,默認壓縮等級為 6。
命令行選項
file
如果未指定?file,則從?sys.stdin?讀取。
--fast
指明最快速的壓縮方法(較低壓縮率)。
--best
指明最慢速的壓縮方法(最高壓縮率)。
-d,?--decompress
解壓縮給定的文件。
-h,?--help
顯示幫助消息。