テクノロジー · 実用ガイド

ZIPの一覧は見えるのに読めない?メンバーごとにPythonの対応方式を確認

4つの自作ZIPで、一覧表示の成功、未対応方式、CRCエラーを切り分けました。

オリジナル概念図:Python 3.12.14で4つの自作2メンバーZIPを試し、一覧表示、未対応方式、CRCエラーを区別。
オリジナル概念図:Python 3.12.14で4つの自作2メンバーZIPを試し、一覧表示、未対応方式、CRCエラーを区別。 Watch at Ease

zipfileでファイル一覧を表示できても、特定ファイルの読み取りがNotImplementedErrorになる場合は、そのメンバーと実際に動作するPythonを確認します。一覧や先頭のメンバーが読めても、すべての圧縮・暗号化機能に対応するとは限りません。

Python 3.12.14で小さな2メンバー構成の自作ZIPを4つ試しました。すべて一覧表示とreadme.txtの読み取りは成功しましたが、data.csvでは成功、未対応方式の例外、CRCエラーに分かれました。次に調べる対象は結果によって異なります。

実際の読み取り環境と全メンバーを記録する

失敗するプロセスでsys.versionとzipfile.__file__を記録します。作業用コピーを読み取り専用で開き、z.infolist()から各filename、compress_type、flag_bits、file_size、compress_sizeを確認してください。スケジューラー、環境、同名モジュールの優先読み込みにより、別の場所で確認した読み取り環境と異なることがあります。

これは一覧の調査であり、内容の復号・展開試験ではありません。先頭ファイルの方式を全体に当てはめたり、is_zipfile()の成功を全内容の可読性と見なしたりしないでください。PKWAREの表ではDeflate64(9)とAE-x暗号化マーカー(99)も区別されます。Zstandardへの対応だけでは、その問題は解消しません。

3種類の結果を混同しない

各ZIPには無圧縮のreadme.txtと、同じ24バイトのdata.csvを格納しました。無圧縮+Deflate(0/8)は期待したCSVを返し、testzip()はNoneでした。無圧縮+Zstandard(0/93)と旧Zstandard番号(0/20)はreadmeを読めましたが、CSVとtestzip()はNotImplementedErrorを送出しました。

4つ目はDeflateのCRCメタデータを意図的に誤らせたものです。data.csvの読み取りはBadZipFileとなり、testzip()はそのファイル名を返しました。例外、問題ファイル名、Noneを別々に記録してください。デコーダー未対応ではCRCは未検証であり、破損しているとも正常とも判定できません。

追加パッケージと標準ライブラリの対応を分ける

インストール済みのzstandard 0.25.0は自作Zstandardフレームを単独で展開できました。しかしインポートしてもPython 3.12.14のzipfileにZIP_ZSTANDARDは増えませんでした。別のコーデックが使えることは、ZIP読み取り器がそれを利用する証拠ではありません。実際のインタープリター、モジュール、ビルドの文書を確認します。

Python 3.14のリファレンスではZIP_ZSTANDARDは3.14で追加され、compression.zstdが必要です。方式20と93の読み取り、93での書き込みが文書化されています。これは特定バージョンの仕様であり、今回3.14を実行した結果でも、更新すればすべての圧縮・暗号化・ZIP機能に対応するという保証でもありません。

対応する経路を選び、必要な内容を検証する

必要な各メンバーの圧縮・暗号化方式に、具体的な読み取り器の文書上の対応を照合します。必要なら対応が明記された読み取り器を使うか、作成者に互換形式の別コピーを依頼し、原本は保存します。ヘッダーの方式番号を書き換えたり、暗号化を弱めたりしてはいけません。ApacheのZIPガイドもメンバー単位の対応確認を説明し、方式9・99の既存議論はそれぞれ別の機能を扱っています。

適切な制限のある環境で必要な全メンバーを読み、CRCの結果とアプリケーションが期待する内容を確認します。4つの小さな非暗号化ZIPで12項目の検証が通り、ファイル展開は行っていません。信頼できないZIPの安全性やZIP64、分割ZIP、全Pythonビルドを検証したものではありません。関連する一般ZIPガイドで構造、CRC、必須内容の各段階を確認できます。

オリジナル概念図:実際の実行環境、必要な各メンバー、文書上の対応を確認してから内容を検証する手順。
オリジナル概念図:実際の実行環境、必要な各メンバー、文書上の対応を確認してから内容を検証する手順。 Watch at Ease