Python 3.14で.zstファイルを読み書きする方法|compression.zstdとzlibの違い

Python 3.14で追加されたoptional moduleのcompression.zstdを使い、.zstのテキストはrt・wtと文字コード、バイナリはrb・wbで扱う案内。

Python 3.14以降では、標準ライブラリのcompression.zstdでZstandard形式の.zstファイルを読み書きできます。標準APIのimportはfrom compression import zstdです。UTF-8などのテキストはrt・wtとencoding、バイナリはrb・wbを使います。zlibはDEFLATE系の別形式であり、wbitsを変えてもZstandardの読込みAPIにはなりません。

compression.zstdはPython 3.14で追加済みです。公式資料には、bytes向けcompress()・decompress()と、ファイル向けopen()・ZstdFileがあります。

以下は2026年10月4日時点のPython 3.14固定版の公式資料に基づきます。

目次

最初にPythonとモジュールを確認する

import sys

print(sys.version)
print(sys.executable)

from compression import zstd

print(zstd.__name__)

Python 3.13以下では標準のcompression.zstdは使えません。また、3.14でもこれはoptional moduleです。利用中のCPython配布に含まれない場合は、Pythonを提供したディストリビューターの資料を確認してください。PEP 784では、libzstdがない環境ではモジュールを利用できないと説明されています。

import zstandardやimport zstdは外部パッケージの名前で、標準APIとは別です。PEP 784では、名前衝突を避けるためcompression.zstdが採用されています。

UTF-8テキストを書き込み、読み戻す最小例

既存ファイルを誤って上書きしないよう、一時ディレクトリで往復を確認する例です。

from compression import zstd
from pathlib import Path
from tempfile import TemporaryDirectory


text = 'Hello, Zstandard!\n'

with TemporaryDirectory() as directory:
    path = Path(directory) / 'sample.txt.zst'

    with zstd.open(path, 'wt', encoding='utf-8') as output:
        output.write(text)

    with zstd.open(path, 'rt', encoding='utf-8') as source:
        restored = source.read()

    assert restored == text
    print(restored, end='')

wt・wbに出力先のパスを指定すると既存ファイルを上書きするため、出力先を確認してください。encoding、errors、newlineはテキストモード用です。

Python版とimportを確認し、テキストならrt・wtとencoding、バイナリならrb・wbでbytesを扱う判断フロー。import失敗、ZstdError、UnicodeDecodeErrorを分け、zlibのwbits変更ではZstandardを読めないことを示す。
UTF-8は例です。実際の文字コードに合わせ、バイナリではencodingを指定しません。

既存の.zstを読む

テキストを行単位で読む

from compression import zstd


with zstd.open('input.txt.zst', 'rt', encoding='utf-8') as source:
    for line in source:
        print(line, end='')

実データがUTF-8とは限りません。展開には成功してもUnicodeDecodeErrorになる場合は、圧縮破損だけでなく、元テキストの文字コード指定を確認します。JSONやCSVとしての解析エラーは、Zstandard展開後の別の層です。

バイナリをチャンクで読む

from compression import zstd


with zstd.open('input.bin.zst', 'rb') as source:
    while chunk := source.read(1024 * 1024):
        print(len(chunk))

画像、モデル、独自形式などはrbでbytesとして扱い、バイナリモードではencodingを指定しません。大きなファイルを常にread()で一括取得するのではなく、利用側の処理に合わせてチャンクや行単位で読みます。

少量のbytesならcompress・decompressを使う

from compression import zstd


original = b'Hello, Zstandard!\n'
packed = zstd.compress(original)
restored = zstd.decompress(packed)

assert restored == original

このAPIはbytes-likeな入力をまとめて処理し、bytesを返します。ファイルを逐次扱う用途ではzstd.open()を選びます。

読めないときの切り分け

症状確認すること
ModuleNotFoundError・ImportError実行中のPythonが3.14以降か、同じ実行ファイルにoptional moduleが含まれるか
ZstdError実データがZstandardか、ダウンロードが完全か、必要なZstandard辞書があるか
UnicodeDecodeError展開後データが本当にテキストか、指定した文字コードが正しいか
zlib.errorやheader関連エラーZstandardデータをzlibへ渡していないか、元の圧縮形式が何か

zlib公式資料のwbitsは、zlib、gzip、raw DEFLATEのheaderやwindowを選ぶ引数です。Zstandardは別形式なので、wbitsの変更や拡張子の付け替えでは変換できません。また、header関連エラーだけで「必ずZstandardファイル」「必ず破損」と断定することもできません。

圧縮辞書を使って作られたデータは、対応するZstandard辞書をzstd_dictへ渡す必要があります。提供元の仕様を確認してください。

.zstと.tar.zstは同じ扱いではない

sample.txt.zstは単一データをZstandard圧縮したものとして扱えますが、archive.tar.zstはZstandardを展開した後にtarアーカイブが残ります。Python 3.14のtarfileにはZstandard対応モードもありますが、単一テキストの読込みとは処理目的が異なります。

よくある質問

Python 3.14ならpipは必ず不要ですか?

標準APIなので通常は外部パッケージを前提としませんが、optional moduleが含まれないCPython配布もあります。その場合にpip install compressionを標準APIの導入手順として案内することはできません。配布元の対応を確認します。

.gzもcompression.zstdで読めますか?

読めません。.gzはgzip形式、.zstはZstandard形式です。拡張子だけでなく、生成元が示す実際の形式に合うモジュールを使います。

まとめ

Python 3.14で.zstを扱うときは、from compression import zstdを使い、テキストとバイナリのモードを分けます。エラー時はimport環境、圧縮形式、辞書、文字コードを別々に確認し、zlibの設定変更でZstandardを読もうとしないでください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次