compression.zstd --- 與 Zstandard 格式相容的壓縮

在 3.14 版本加入。

原始碼: Lib/compression/zstd/__init__.py


此模組提供了使用 Zstandard(或 zstd)壓縮演算法來壓縮和解壓縮資料的類和函式。zstd 手冊將 Zstandard 描述為“一種快速的無失真壓縮演算法,旨在實現 zlib 級別的即時壓縮場景和更好的壓縮率。”模組還包含一個檔案介面,支援讀寫由 zstd 工具建立的 .zst 檔案內容,以及原始的 zstd 壓縮流。

compression.zstd 模組包含:

異常

exception compression.zstd.ZstdError

當壓縮或解壓縮過程中,或在初始化(解)壓縮器狀態時發生錯誤,會引發此異常。

讀寫壓縮檔案

compression.zstd.open(file, /, mode='rb', *, level=None, options=None, zstd_dict=None, encoding=None, errors=None, newline=None)

以二進位制或文字模式開啟一個 Zstandard 壓縮檔案,返回一個 檔案物件

file 引數可以是一個檔名(以 strbytes類路徑 物件的形式給出),在這種情況下,將開啟指定的檔案;或者它也可以是一個已存在的檔案物件,用於讀取或寫入。

mode 引數可以是用於讀取的 'rb'(預設)、用於覆蓋寫入的 'wb'、用於追加的 'ab',或用於獨佔建立的 'xb'。它們也可以分別等價地表示為 'r''w''a''x'。你也可以分別使用 'rt''wt''at''xt' 以文字模式開啟。

讀取時,options 引數可以是一個提供高階解壓縮引數的字典;有關支援的引數的詳細資訊,請參見 DecompressionParameterzstd_dict 引數是一個 ZstdDict 例項,用於解壓縮過程。讀取時,如果 level 引數不為 None,將引發 TypeError

寫入時,options 引數可以是一個提供高階壓縮引數的字典;有關支援的引數的詳細資訊,請參見 CompressionParameterlevel 引數是寫入壓縮資料時使用的壓縮級別。leveloptions 中只能有一個不為 None。zstd_dict 引數是一個 ZstdDict 例項,用於壓縮過程。

在二進位制模式下,此函式等同於 ZstdFile 的建構函式:ZstdFile(file, mode, ...)。在這種情況下,不得提供 encodingerrorsnewline 引數。

在文字模式下,會建立一個 ZstdFile 物件,並將其包裝在一個 io.TextIOWrapper 例項中,該例項具有指定的編碼、錯誤處理行為和行尾符。

class compression.zstd.ZstdFile(file, /, mode='rb', *, level=None, options=None, zstd_dict=None)

以二進位制模式開啟一個 Zstandard 壓縮檔案。

一個 ZstdFile 可以包裝一個已經開啟的 檔案物件,或者直接操作一個指定名稱的檔案。file 引數指定要包裝的檔案物件,或者要開啟的檔名(作為 strbytes類路徑 物件)。如果包裝一個已存在的檔案物件,當 ZstdFile 關閉時,被包裝的檔案不會被關閉。

mode 引數可以是用於讀取的 'rb'(預設)、用於覆蓋寫入的 'wb'、用於獨佔建立的 'xb',或用於追加的 'ab'。它們也可以分別等價地表示為 'r''w''x''a'

如果 file 是一個檔案物件(而不是實際的檔名),模式 'w' 不會截斷檔案,而是等同於 'a'

讀取時,options 引數可以是一個提供高階解壓縮引數的字典;有關支援的引數的詳細資訊,請參見 DecompressionParameterzstd_dict 引數是一個 ZstdDict 例項,用於解壓縮過程。讀取時,如果 level 引數不為 None,將引發 TypeError

寫入時,options 引數可以是一個提供高階壓縮引數的字典;有關支援的引數的詳細資訊,請參見 CompressionParameterlevel 引數是寫入壓縮資料時使用的壓縮級別。leveloptions 中只能有一個被傳入。zstd_dict 引數是一個 ZstdDict 例項,用於壓縮過程。

ZstdFile 支援 io.BufferedIOBase 指定的所有成員,除了 detach()truncate()。支援迭代和 with 語句。

還提供以下方法和屬性:

peek(size=-1)

返回緩衝的資料而不移動檔案位置。除非已到達檔案末尾(EOF),否則將至少返回一個位元組的資料。返回的確切位元組數是未指定的(size 引數被忽略)。

備註

雖然呼叫 peek() 不會改變 ZstdFile 的檔案位置,但它可能會改變底層檔案物件的位置(例如,如果 ZstdFile 是透過為 file 傳遞檔案物件來構造的)。

mode

讀取時為 'rb',寫入時為 'wb'

name

Zstandard 檔案的名稱。等同於底層 檔案物件name 屬性。

在記憶體中壓縮和解壓縮資料

compression.zstd.compress(data, level=None, options=None, zstd_dict=None)

壓縮 data(一個 類位元組物件),返回壓縮後的資料,為一個 bytes 物件。

level 引數是一個控制壓縮級別的整數。level 是在 options 中設定 CompressionParameter.compression_level 的替代方法。在 compression_level 上使用 bounds() 來獲取可以為 level 傳遞的值。如果需要高階壓縮選項,必須省略 level 引數,並在 options 字典中設定 CompressionParameter.compression_level 引數。

options 引數是一個包含高階壓縮引數的 Python 字典。壓縮引數的有效鍵和值在 CompressionParameter 文件中有詳細說明。

zstd_dict 引數是 ZstdDict 的一個例項,包含用於提高壓縮效率的訓練資料。可以使用 train_dict() 函式生成 Zstandard 字典。

compression.zstd.decompress(data, zstd_dict=None, options=None)

解壓縮 data(一個 類位元組物件),返回解壓縮後的資料,為一個 bytes 物件。

options 引數是一個包含高階解壓縮引數的 Python 字典。壓縮引數的有效鍵和值在 DecompressionParameter 文件中有詳細說明。

zstd_dict 引數是 ZstdDict 的一個例項,包含在壓縮過程中使用的訓練資料。這必須是壓縮時使用的同一個 Zstandard 字典。

如果 data 是多個不同壓縮幀的拼接,則解壓縮所有這些幀,並返回結果的拼接。

class compression.zstd.ZstdCompressor(level=None, options=None, zstd_dict=None)

建立一個壓縮器物件,可用於增量壓縮資料。

要以更方便的方式壓縮單個數據塊,請參閱模組級函式 compress()

level 引數是一個控制壓縮級別的整數。level 是在 options 中設定 CompressionParameter.compression_level 的替代方法。在 compression_level 上使用 bounds() 來獲取可以為 level 傳遞的值。如果需要高階壓縮選項,必須省略 level 引數,並在 options 字典中設定 CompressionParameter.compression_level 引數。

options 引數是一個包含高階壓縮引數的 Python 字典。壓縮引數的有效鍵和值在 CompressionParameter 文件中有詳細說明。

zstd_dict 引數是 ZstdDict 的一個可選例項,包含用於提高壓縮效率的訓練資料。可以使用 train_dict() 函式生成 Zstandard 字典。

compress(data, mode=ZstdCompressor.CONTINUE)

壓縮 data(一個 類位元組物件),如果可能,返回一個包含壓縮資料的 bytes 物件,否則返回一個空的 bytes 物件。部分 data 可能會被內部緩衝,以供後續呼叫 compress()flush() 時使用。返回的資料應與之前任何 compress() 呼叫的輸出拼接起來。

mode 引數是一個 ZstdCompressor 屬性,可以是 CONTINUEFLUSH_BLOCKFLUSH_FRAME

當所有資料都提供給壓縮器後,呼叫 flush() 方法來完成壓縮過程。如果以 mode 設定為 FLUSH_FRAME 呼叫 compress(),則不應呼叫 flush(),因為它會寫入一個新的空幀。

flush(mode=ZstdCompressor.FLUSH_FRAME)

完成壓縮過程,返回一個 bytes 物件,其中包含儲存在壓縮器內部緩衝區中的任何資料。

mode 引數是一個 ZstdCompressor 屬性,可以是 FLUSH_BLOCKFLUSH_FRAME

set_pledged_input_size(size)

指定將為下一幀提供的未壓縮資料量 sizesize 將被寫入下一幀的幀頭中,除非 CompressionParameter.content_size_flagFalse0。大小為 0 表示幀為空。如果 sizeNone,幀頭將省略幀大小。包含未壓縮資料大小的幀在解壓縮時需要更少的記憶體,尤其是在較高壓縮級別下。

如果 last_mode 不是 FLUSH_FRAME,會引發 ValueError,因為壓縮器不在幀的起始位置。如果承諾的大小與提供給 compress() 的實際資料大小不匹配,未來對 compress()flush() 的呼叫可能會引發 ZstdError,並且最後的資料塊可能會丟失。

在呼叫 flush()compress() 並將模式設為 FLUSH_FRAME 後,除非再次呼叫 set_pledged_input_size(),否則下一幀的幀頭將不包含幀大小。

CONTINUE

收集更多資料進行壓縮,可能不會立即生成輸出。此模式透過最大化每個塊和幀的資料量來最佳化壓縮率。

FLUSH_BLOCK

完成並將一個塊寫入資料流。目前為止返回的資料可以立即解壓縮。過去的資料仍然可以在後續呼叫 compress() 生成的塊中被引用,從而提高壓縮效果。

FLUSH_FRAME

完成並寫出一個幀。後續提供給 compress() 的資料將被寫入一個新幀,並且 不能 引用過去的資料。

last_mode

最後一次傳遞給 compress()flush() 的模式。值可以是 CONTINUEFLUSH_BLOCKFLUSH_FRAME。初始值為 FLUSH_FRAME,表示壓縮器處於新幀的開始。

class compression.zstd.ZstdDecompressor(zstd_dict=None, options=None)

建立一個解壓縮器物件,可用於增量解壓縮資料。

要以更方便的方式一次性解壓縮整個壓縮流,請參閱模組級函式 decompress()

options 引數是一個包含高階解壓縮引數的 Python 字典。壓縮引數的有效鍵和值在 DecompressionParameter 文件中有詳細說明。

zstd_dict 引數是 ZstdDict 的一個例項,包含在壓縮過程中使用的訓練資料。這必須是壓縮時使用的同一個 Zstandard 字典。

備註

decompress() 函式和 ZstdFile 類不同,此類不會透明地處理包含多個壓縮幀的輸入。要解壓縮多幀輸入,應使用 decompress(),如果處理 檔案物件 則使用 ZstdFile,或者使用多個 ZstdDecompressor 例項。

decompress(data, max_length=-1)

解壓縮 data(一個 類位元組物件),返回解壓縮後的位元組資料。部分 data 可能會被內部緩衝,以供後續呼叫 decompress() 時使用。返回的資料應與之前任何 decompress() 呼叫的輸出拼接起來。

如果 max_length 為非負數,則該方法最多返回 max_length 位元組的解壓縮資料。如果達到此限制並且可以產生更多輸出,needs_input 屬性將設定為 False。在這種情況下,下一次呼叫 decompress() 時可以提供 datab'' 來獲取更多輸出。

如果所有輸入資料都已解壓縮並返回(因為其小於 max_length 位元組,或者因為 max_length 為負數),則 needs_input 屬性將設定為 True

試圖在幀結束後解壓縮資料會引發 ZstdError。在幀結束後找到的任何資料都將被忽略並儲存在 unused_data 屬性中。

eof

如果已到達流末尾標記,則為 True

unused_data

壓縮流結束後發現的資料。

在到達流末尾之前,此屬性將為 b''

needs_input

如果 decompress() 方法在需要新的壓縮輸入之前可以提供更多解壓縮資料,則為 False

Zstandard 字典

compression.zstd.train_dict(samples, dict_size)

訓練一個 Zstandard 字典,返回一個 ZstdDict 例項。Zstandard 字典可以更有效地壓縮小資料,這些資料傳統上由於重複性較少而難以壓縮。如果你要壓縮多個相似的資料組(例如相似的檔案),Zstandard 字典可以顯著提高壓縮率和速度。

samples 引數(一個 bytes 物件的可迭代物件),是用於訓練 Zstandard 字典的樣本總體。

dict_size 引數是一個整數,表示 Zstandard 字典的最大尺寸(以位元組為單位)。Zstandard 文件建議絕對最大值不超過 100 KB,但根據資料的不同,最大值通常可以更小。較大的字典通常會減慢壓縮速度,但能提高壓縮率。較小的字典壓縮速度更快,但會降低壓縮率。

compression.zstd.finalize_dict(zstd_dict, /, samples, dict_size, level)

一個高階函式,用於將“原始內容”Zstandard 字典轉換為常規 Zstandard 字典。“原始內容”字典是一個位元組序列,不需要遵循普通 Zstandard 字典的結構。

zstd_dict 引數是一個 ZstdDict 例項,其 dict_content 包含原始字典內容。

samples 引數(一個 bytes 物件的可迭代物件),包含用於生成 Zstandard 字典的樣本資料。

dict_size 引數是一個整數,表示 Zstandard 字典的最大尺寸(以位元組為單位)。有關最大字典大小的建議,請參見 train_dict()

level 引數(一個整數)是期望傳遞給使用此字典的壓縮器的壓縮級別。字典資訊因每個壓縮級別而異,因此針對適當的壓縮級別進行調整可以使壓縮更有效。

class compression.zstd.ZstdDict(dict_content, /, *, is_raw=False)

Zstandard 字典的包裝器。字典可用於提高許多小資料塊的壓縮效果。如果需要從樣本資料中訓練新字典,請使用 train_dict()

dict_content 引數(一個 類位元組物件)是已經訓練好的字典資訊。

is_raw 引數是一個布林值,是一個控制 dict_content 含義的高階引數。True 表示 dict_content 是一個“原始內容”字典,沒有任何格式限制。False 表示 dict_content 是一個普通的 Zstandard 字典,由 Zstandard 函式建立,例如 train_dict() 或外部 zstd 命令列工具。

當向函式傳遞一個 ZstdDict 時,可以透過將 as_digested_dictas_undigested_dict 屬性作為 zstd_dict 引數傳遞來控制字典的載入方式,例如 compress(data, zstd_dict=zd.as_digested_dict)。消化字典是在載入 Zstandard 字典時發生的一項耗時操作。當多次呼叫壓縮或解壓縮時,傳遞一個已消化的字典將減少載入字典的開銷。

壓縮時的區別

已消化的字典

未消化的字典

可能會被字典引數覆蓋的壓縮器高階引數

window_log, hash_log, chain_log, search_log, min_match, target_length, strategy, enable_long_distance_matching, ldm_hash_log, ldm_min_match, ldm_bucket_size_log, ldm_hash_rate_log 以及一些非公開引數。

None

ZstdDict 內部快取字典

是。當再次使用相同壓縮級別載入已消化的字典時速度更快。

否。如果你希望多次載入一個未消化的字典,請考慮重用一個壓縮器物件。

如果傳遞一個不帶任何屬性的 ZstdDict,壓縮時預設傳遞一個未消化的字典,解壓縮時如果需要則會生成並預設傳遞一個已消化的字典。

dict_content

Zstandard 字典的內容,一個 bytes 物件。它與 __init__ 方法中的 dict_content 引數相同。它可以與其他程式一起使用,例如 zstd 命令列程式。

dict_id

Zstandard 字典的識別符號,一個非負整數值。

非零值表示該字典是普通的,由 Zstandard 函式建立並遵循 Zstandard 格式。

0 表示一個“原始內容”字典,沒有任何格式限制,供高階使用者使用。

備註

ZstdDict.dict_id0 的含義不同於 get_frame_info() 函式的 dictionary_id 屬性。

as_digested_dict

作為已消化的字典載入。

as_undigested_dict

作為未消化的字典載入。

高階引數控制

class compression.zstd.CompressionParameter

一個 IntEnum,包含可在壓縮資料時使用的高階壓縮引數鍵。

可以在任何屬性上使用 bounds() 方法來獲取該引數的有效值。

引數是可選的;任何省略的引數將自動選擇其值。

獲取 compression_level 上下限的示例:

lower, upper = CompressionParameter.compression_level.bounds()

window_log 設定為最大尺寸的示例:

_lower, upper = CompressionParameter.window_log.bounds()
options = {CompressionParameter.window_log: upper}
compress(b'venezuelan beaver cheese', options=options)
bounds()

返回一個壓縮引數的整數邊界元組 (lower, upper)。此方法應在你希望檢索其邊界的屬性上呼叫。例如,要獲取 compression_level 的有效值,可以檢查 CompressionParameter.compression_level.bounds() 的結果。

上下限都是包含性的。

compression_level

一種高階方式,用於設定影響資料壓縮速度和壓縮率的其他壓縮引數。

常規壓縮級別大於 0。大於 20 的值被認為是“超”壓縮,並且比其他級別需要更多記憶體。負值可用於以較差的壓縮率換取更快的壓縮速度。

將級別設定為零將使用 COMPRESSION_LEVEL_DEFAULT

window_log

壓縮器在壓縮資料時可以使用的最大允許反向引用距離,表示為2的冪,即 1 << window_log 位元組。此引數極大地影響壓縮的記憶體使用。更高的值需要更多記憶體,但能獲得更好的壓縮值。

值為零會導致該值被自動選擇。

hash_log

初始探測表的大小,表示為2的冪。最終的記憶體使用量為 1 << (hash_log+2) 位元組。對於 <= dfast 的策略,較大的表能提高壓縮率;對於 > dfast 的策略,能提高壓縮速度。

值為零會導致該值被自動選擇。

chain_log

多探測搜尋表的大小,表示為2的冪。最終的記憶體使用量為 1 << (chain_log+2) 位元組。較大的表能帶來更好但更慢的壓縮效果。此引數對 fast 策略無效。在使用 dfast 策略時仍然有用,此時它定義了一個次級探測表。

值為零會導致該值被自動選擇。

search_log

搜尋嘗試次數,表示為2的冪。更多的嘗試會帶來更好但更慢的壓縮效果。此引數對 fastdfast 策略無用。

值為零會導致該值被自動選擇。

min_match

搜尋匹配的最小尺寸。較大的值會提高壓縮和解壓縮速度,但會降低壓縮率。請注意,Zstandard 仍然可以找到更小尺寸的匹配,它只是調整其搜尋演算法以尋找此尺寸及更大的匹配。對於所有 < btopt 的策略,有效最小值為 4;對於所有 > fast 的策略,有效最大值為 6

值為零會導致該值被自動選擇。

target_length

此欄位的影響取決於所選的 Strategy

對於策略 btoptbtultrabtultra2,該值是被認為“足夠好”以停止搜尋的匹配長度。較大的值會使壓縮率更好,但壓縮速度更慢。

對於策略 fast,它是匹配取樣的距離。較大的值會使壓縮更快,但壓縮率更差。

值為零會導致該值被自動選擇。

strategy

所選策略的值越高,zstd 使用的壓縮技術就越複雜,從而導致更高的壓縮率但更慢的壓縮速度。

參見

策略

enable_long_distance_matching

長距離匹配可用於透過在更遠距離處找到大型匹配來提高大輸入的壓縮效果。它會增加記憶體使用量和視窗大小。

True1 啟用長距離匹配,而 False0 停用它。

啟用此引數會增加預設的 window_log 至 128 MiB,除非明確設定為不同值。如果 window_log >= 128 MiB 且壓縮策略 >= btopt(壓縮級別 16+),則預設啟用此設定。

ldm_hash_log

長距離匹配表的大小,表示為2的冪。較大的值會增加記憶體使用量和壓縮率,但會降低壓縮速度。

值為零會導致該值被自動選擇。

ldm_min_match

長距離匹配器的最小匹配尺寸。過大或過小的值通常會降低壓縮率。

值為零會導致該值被自動選擇。

ldm_bucket_size_log

長距離匹配器(long distance matcher)雜湊表中用於解決衝突的每個桶(bucket)大小的對數值。值越大,衝突解決能力越強,但會降低壓縮速度。

值為零會導致該值被自動選擇。

ldm_hash_rate_log

向長距離匹配器雜湊表中插入/查詢條目的頻率。值越大,壓縮速度越快。與預設值偏離過大可能會導致壓縮率下降。

值為零會導致該值被自動選擇。

content_size_flag

在壓縮前已知待壓縮資料大小時,將其寫入 Zstandard 幀頭。

此標誌僅在以下情況下生效:

所有其他壓縮呼叫可能不會將大小資訊寫入幀頭。

True1 啟用內容大小標誌,而 False0 則停用它。

checksum_flag

在每個幀的末尾寫入一個四位元組的校驗和,該校驗和使用 XXHash64 演算法計算未壓縮內容的雜湊值。Zstandard 的解壓程式碼會驗證此校驗和。如果不匹配,則會引發 ZstdError 異常。

True1 啟用校驗和生成,而 False0 則停用它。

dict_id_flag

使用 ZstdDict 進行壓縮時,會將字典的 ID 寫入幀頭。

True1 啟用儲存字典 ID,而 False0 則停用它。

nb_workers

選擇要生成的並行壓縮執行緒數。當 nb_workers > 0 時,啟用多執行緒壓縮。值為 1 表示“單執行緒的多執行緒模式”。更多的執行緒可以提高速度,但也會增加記憶體使用量並輕微降低壓縮率。

值為零則停用多執行緒。

job_size

一個壓縮作業的大小,以位元組為單位。該值僅在 nb_workers >= 1 時強制執行。每個壓縮作業都是並行完成的,因此該值可以間接影響活動執行緒的數量。

值為零會導致該值被自動選擇。

overlap_log

設定從先前作業(執行緒)中重新載入多少資料,以供新作業在壓縮期間通過後向查詢視窗(look behind window)使用。此值僅在 nb_workers >= 1 時使用。可接受的值範圍為 0 到 9。

  • 0 表示動態設定重疊量

  • 1 表示不重疊

  • 9 表示使用前一個作業的完整視窗大小

每增加一,重疊大小減半/加倍。“8”表示 window_size/2 的重疊,“7”表示 window_size/4 的重疊,以此類推。

class compression.zstd.DecompressionParameter

一個 IntEnum,包含解壓資料時可使用的高階解壓引數鍵。引數是可選的;任何省略的引數將自動選擇其值。

可以在任何屬性上使用 bounds() 方法來獲取該引數的有效值範圍。

window_log_max 設定為最大值的示例

data = compress(b'Some very long buffer of bytes...')

_lower, upper = DecompressionParameter.window_log_max.bounds()

options = {DecompressionParameter.window_log_max: upper}
decompress(data, options=options)
bounds()

返回一個解壓引數的整數邊界元組 (lower, upper)。應在你希望檢索其邊界的屬性上呼叫此方法。

上下限都是包含性的。

window_log_max

解壓期間使用的視窗最大尺寸的以 2 為底的對數。這對於限制解壓資料時使用的記憶體量很有用。較大的最大視窗尺寸可帶來更快的解壓速度。

值為零會導致該值被自動選擇。

class compression.zstd.Strategy

一個包含壓縮策略的 IntEnum。編號越高的策略對應越複雜和越慢的壓縮。

備註

Strategy 屬性的值在不同的 zstd 版本之間不一定穩定。唯一可以依賴的是屬性的順序。下面按順序列出了這些屬性。

可用的策略如下:

fast
dfast
greedy
lazy
lazy2
btlazy2
btopt
btultra
btultra2

雜項

compression.zstd.get_frame_info(frame_buffer)

檢索一個包含 Zstandard 幀元資料的 FrameInfo 物件。幀包含與其所持有的壓縮資料相關的元資料。

class compression.zstd.FrameInfo

與 Zstandard 幀相關的元資料。

decompressed_size

幀解壓後內容的大小。

dictionary_id

一個整數,表示解壓該幀所需的 Zstandard 字典 ID。0 表示字典 ID 未記錄在幀頭中。這可能意味著不需要 Zstandard 字典,或者所需字典的 ID 沒有被記錄。

compression.zstd.COMPRESSION_LEVEL_DEFAULT

Zstandard 的預設壓縮級別:3

compression.zstd.zstd_version_info

執行時 zstd 庫的版本號,為一個整數元組 (主版本號, 次版本號, 修訂號)。

示例

讀取壓縮檔案

from compression import zstd

with zstd.open("file.zst") as f:
    file_content = f.read()

建立壓縮檔案

from compression import zstd

data = b"Insert Data Here"
with zstd.open("file.zst", "w") as f:
    f.write(data)

在記憶體中壓縮資料

from compression import zstd

data_in = b"Insert Data Here"
data_out = zstd.compress(data_in)

增量壓縮

from compression import zstd

comp = zstd.ZstdCompressor()
out1 = comp.compress(b"Some data\n")
out2 = comp.compress(b"Another piece of data\n")
out3 = comp.compress(b"Even more data\n")
out4 = comp.flush()
# Concatenate all the partial results:
result = b"".join([out1, out2, out3, out4])

將壓縮資料寫入已開啟的檔案

from compression import zstd

with open("myfile", "wb") as f:
    f.write(b"This data will not be compressed\n")
    with zstd.open(f, "w") as zstf:
        zstf.write(b"This *will* be compressed\n")
    f.write(b"Not compressed\n")

使用壓縮引數建立壓縮檔案

from compression import zstd

options = {
   zstd.CompressionParameter.checksum_flag: 1
}
with zstd.open("file.zst", "w", options=options) as f:
    f.write(b"Mind if I squeeze in?")