zipfile --- ZIP アーカイブの処理¶
Source code: Lib/zipfile/
ZIP は一般によく知られているアーカイブ (書庫化) および圧縮の標準ファイルフォーマットです。このモジュールでは ZIP 形式のファイルの作成、読み書き、追記、書庫内のファイル一覧の作成を行うためのツールを提供します。より高度な使い方でこのモジュールを利用したいのであれば、 PKZIP Application Note に定義されている ZIP ファイルフォーマットの理解が必要になるでしょう。
このモジュールは分割された ZIP ファイルを扱えません。 ZIP64 拡張を使う ZIP ファイル (サイズが 4 GiB を超える ZIP ファイル) は扱えます。 ZIP アーカイブ内の暗号化されたファイルの復号をサポートしていますが、暗号化されたファイルの作成はできません。 復号処理は C ではなく Python で実装されているため、非常に低速です。
圧縮されたアーカイブを扱うには、zlib、bz2、lzma、compression.zstd などの オプションモジュール が必要です。
使用している CPython にこれらが含まれていない場合は、配布元 (Python を提供した組織など) のドキュメントを確認してください。
配布する立場の場合は オプションのモジュールの要件 を参照してください。
このモジュールは以下の項目を定義しています:
- exception zipfile.BadZipFile¶
正常ではない ZIP ファイルに対して送出されるエラーです。
Added in version 3.2.
- exception zipfile.BadZipfile¶
BadZipFileの別名です。過去のバージョンの Python との互換性のために用意されています。バージョン 3.2 で非推奨.
- exception zipfile.LargeZipFile¶
ZIP ファイルが ZIP64 の機能を必要としているが、その機能が有効化されていない場合に送出されるエラーです。
- class zipfile.ZipFile
ZIP ファイルの読み書きのためのクラスです。コンストラクタの詳細については、ZipFile オブジェクト 節を参照してください。
- class zipfile.Path
pathlib.Pathインターフェースの一部を実装したクラスです。importlib.resources.abc.Traversableインターフェースは完全に実装しています。Added in version 3.8.
- class zipfile.PyZipFile
Python ライブラリを含む、ZIP アーカイブを作成するためのクラスです。
- class zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))¶
アーカイブ内のメンバーの情報を表すクラスです。 このクラスのインスタンスは
ZipFileオブジェクトのgetinfo()メソッドとinfolist()メソッドが返します。zipfileモジュールの利用者のほとんどは、自分でインスタンスを作る必要はなく、モジュールが作成したものを使うだけで十分です。 filename はアーカイブ内のメンバーの完全な名前、date_time はファイルの最終更新日時を表す 6 フィールドのタプルでなければなりません。 各フィールドについては ZipInfo オブジェクト を参照してください。バージョン 3.13 で変更: これまで保護された属性だった
_compresslevelを公開するcompress_level属性を追加しました。 後方互換性のため、以前の保護された名前もプロパティとして引き続き使えます。- _for_archive(archive)¶
ZipFile.writestr()で使う適切なデフォルト値をdate_time、圧縮関連の属性、外部属性に設定します。呼び出しを連結できるように、自身を返します。
Added in version 3.14.
- zipfile.is_zipfile(filename)¶
filename が正しいマジックナンバをもつ ZIP ファイルの時に
Trueを返し、そうでない場合Falseを返します。filename にはファイルやファイルライクオブジェクトを渡すこともできます。バージョン 3.1 で変更: ファイルおよびファイルライクオブジェクトをサポートしました。
- zipfile.ZIP_STORED¶
アーカイブメンバを圧縮しない (複数ファイルを一つにまとめるだけ) ことを表す数値定数です。
- zipfile.ZIP_ZSTANDARD¶
Zstandard 圧縮を表す数値定数です。
compression.zstdモジュールが必要です。注釈
APPNOTE 6.3.7 では、Zstandard 圧縮に方式 ID
20が割り当てられました。 競合を避けるため、APPNOTE 6.3.8 で方式 ID は93に変更され、20は非推奨になりました。 互換性のため、zipfileモジュールはどちらの方式 ID も読み込めますが、書き込みには方式 ID93だけを使います。Added in version 3.14.
注釈
ZIP ファイル形式の仕様は 2001 年から bzip2 圧縮、2006 年から LZMA 圧縮、2020 年から Zstandard 圧縮をサポートしています。 ただし、古い Python のリリースを含む一部のツールはこれらの圧縮方式をサポートしておらず、ZIP ファイル全体の処理を拒否したり、個々のファイルを展開できなかったりする場合があります。
参考
- PKZIP Application Note
ZIP ファイルフォーマットおよびアルゴリズムを作成した Phil Katz によるドキュメント。
- Info-ZIP Home Page
Info-ZIP プロジェクトによる ZIP アーカイブプログラムおよびプログラム開発ライブラリに関する情報。
ZipFile オブジェクト¶
- class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True, metadata_encoding=None)¶
ZIP ファイルを開きます。 file はファイルのパス (文字列) か、ファイルライクオブジェクト、 path-like object のいずれかです。
mode 引数には、既存のファイルを読み込む場合は
'r'、内容を消去して新しいファイルとして書き込む場合は'w'、既存のファイルの末尾に追加する場合は'a'、ファイルが存在しない場合にのみファイルを作成して書き込む場合は'x'を指定します。 mode が'x'で file が既存のファイルを指している場合、FileExistsErrorが送出されます。 mode が'a'で file が既存の ZIP ファイルを指している場合、その ZIP ファイルにファイルが追加されます。 file が ZIP ファイルでない場合は、ファイルの末尾に新しい ZIP アーカイブが追加されます。 これは、既存のファイル (例えばpython.exe) に ZIP アーカイブを付け加える用途を想定したものです。 mode が'a'で file が存在しない場合は、ファイルが作成されます。 mode が'r'か'a'の場合、ファイルはシーク可能である必要があります。compression はアーカイブの書き込みに使う ZIP 圧縮方式で、
ZIP_STORED、ZIP_DEFLATED、ZIP_BZIP2、ZIP_LZMA、ZIP_ZSTANDARDのいずれかを指定します。 認識できない値を指定するとNotImplementedErrorが送出されます。ZIP_DEFLATED、ZIP_BZIP2、ZIP_LZMA、ZIP_ZSTANDARDを指定したとき、対応するモジュール (zlib、bz2、lzma、compression.zstd) が利用できなければRuntimeErrorが送出されます。 デフォルトはZIP_STOREDです。allowZip64 が
True(デフォルト) の場合、zipfile はサイズが 4 GiB を超えると ZIP64 拡張を使う ZIP ファイルを作成します。falseの場合、ZIP ファイルに ZIP64 拡張が必要になるとzipfileは例外を送出します。compresslevel 引数は、アーカイブにファイルを書き込む際の圧縮レベルを指定します。
ZIP_STOREDまたはZIP_LZMAを使う場合は効果がありません。ZIP_DEFLATEDでは0から9までの整数を指定できます (詳細はzlibを参照)。ZIP_BZIP2では1から9までの整数を指定できます (詳細はbz2を参照)。ZIP_ZSTANDARDでは通常-131072から22までの整数を指定できます (有効な値の取得方法と意味についてはCompressionParameter.compression_levelを参照)。strict_timestamps 引数を
Falseにすると、1980-01-01 より前のファイルを ZIP に格納できますが、タイムスタンプは 1980-01-01 に設定されます。 2107-12-31 より後のファイルも同様に扱われ、タイムスタンプは上限の日時に設定されます。modeが'r'の場合、metadata_encoding にコーデックの名前を設定し、メンバーの名前や ZIP コメントなどのメタデータのデコードに使うことができます。ファイルがモード
'w'、'x'または'a'で作成され、その後そのアーカイブにファイルを追加することなくクローズされた場合、空のアーカイブのための適切な ZIP 構造がファイルに書き込まれます。ZipFile はコンテキストマネージャにもなっているので、
with文をサポートしています。次の例では、myzip はwith文のブロックが終了したときに、(たとえ例外が発生したとしても) クローズされます:with ZipFile('spam.zip', 'w') as myzip: myzip.write('eggs.txt')
注釈
metadata_encoding は ZipFile インスタンス全体に適用される設定です。 メンバーごとに設定することはできません。
この属性は、現在のロケールのエンコーディングやコードページを名前に使ってアーカイブを作成する古い実装 (主に Windows) に対処するためのものです。 .ZIP 標準では、アーカイブヘッダーのフラグによってメタデータのエンコーディングを IBM コードページ (デフォルト) または UTF-8 に指定できます。 このフラグは、Python 独自の拡張である metadata_encoding よりも優先されます。
バージョン 3.2 で変更:
ZipFileをコンテキストマネージャとして使用できるようになりました。バージョン 3.4 で変更: ZIP64 拡張がデフォルトで有効になりました。
バージョン 3.5 で変更: シークできないストリームへの書き込みをサポートしました。
'x'モードをサポートしました。バージョン 3.6 で変更: 以前は、認識できない圧縮方式の値に対して単なる
RuntimeErrorが送出されていました。バージョン 3.6.2 で変更: file 引数が path-like object を受け入れるようになりました。
バージョン 3.7 で変更: compresslevel パラメータが追加されました。
バージョン 3.8 で変更: キーワード専用引数 strict_timestamps を追加しました。
バージョン 3.11 で変更: zip ファイルのディレクトリとファイルヘッダーのメタデータを読み込む際、メンバー名のエンコーディングを指定できるようになりました。
- ZipFile.close()¶
アーカイブファイルをクローズします。
close()はプログラムを終了する前に必ず呼び出さなければなりません。さもないとアーカイブ上の重要なレコードが書き込まれません。
- ZipFile.getinfo(name)¶
アーカイブメンバ name に関する情報を持つ
ZipInfoオブジェクトを返します。アーカイブに含まれないファイル名に対してgetinfo()を呼び出すと、KeyErrorが送出されます。
- ZipFile.infolist()¶
アーカイブに含まれる各メンバの
ZipInfoオブジェクトからなるリストを返します。既存のアーカイブファイルを開いている場合、リストの順番は実際の ZIP ファイル中のメンバの順番と同じになります。
- ZipFile.namelist()¶
アーカイブメンバの名前のリストを返します。
- ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)¶
アーカイブ内のメンバーに、バイナリのファイル風オブジェクトとしてアクセスします。 name にはアーカイブ内のファイル名または
ZipInfoオブジェクトを指定できます。 mode 引数を指定する場合は'r'(デフォルト) または'w'でなければなりません。 pwd は暗号化された ZIP ファイルの復号に使うパスワードを表すbytesオブジェクトです。open()はコンテキストマネージャでもあるのでwith文をサポートしています:with ZipFile('spam.zip') as myzip: with myzip.open('eggs.txt') as myfile: print(myfile.read())
mode が
'r'の場合、ファイル風オブジェクト (ZipExtFile) は読み取り専用で、read()、readline()、readlines()、seek()、tell()、__iter__()、__next__()メソッドを提供します。 これらのオブジェクトは ZipFile とは独立して動作できます。mode='w'の場合、write()メソッドをサポートする書き込み可能なファイルハンドルを返します。 書き込み可能なファイルハンドルが開いている間に、ZIP ファイル内のほかのファイルの読み書きを試みるとValueErrorが送出されます。いずれの場合も、ファイル風オブジェクトにはアーカイブ内のファイル名に等しい
name属性と、指定したモードに応じて'rb'または'wb'になるmode属性があります。書き込むファイルのサイズが事前に分からず、2 GiB を超える可能性がある場合は、
force_zip64=Trueを渡して大きなファイルに対応するヘッダー形式が使われるようにしてください。 サイズが事前に分かる場合は、file_sizeを設定したZipInfoオブジェクトを作成し、name 引数に渡してください。注釈
open()、read()、およびextract()メソッドには、ファイル名またはZipInfoオブジェクトを指定できます。これは重複する名前のメンバを含む ZIP ファイルを読み込むときにそのメリットを享受できるでしょう。バージョン 3.6 で変更:
mode='U'のサポートを削除しました。 圧縮されたテキストファイルを ユニバーサル改行 モードで読み込むにはio.TextIOWrapperを使ってください。バージョン 3.6 で変更:
mode='w'オプションを指定してZipFile.open()を呼び出し、アーカイブにファイルを書き込めるようになりました。バージョン 3.6 で変更: 閉じた ZipFile の
open()を呼び出すとValueErrorが送出されるようになりました。 以前はRuntimeErrorが送出されていました。バージョン 3.13 で変更: 書き込み可能なファイル風オブジェクトに
name属性とmode属性を追加しました。 読み取り可能なファイル風オブジェクトのmode属性の値を'r'から'rb'に変更しました。
- ZipFile.extract(member, path=None, pwd=None)¶
アーカイブ内のメンバーを現在の作業ディレクトリに展開します。 member はメンバーの完全な名前または
ZipInfoオブジェクトでなければなりません。 ファイル情報は可能な限り正確に復元されます。 path には別の展開先ディレクトリを指定します。 member にはファイル名またはZipInfoオブジェクトを指定できます。 pwd は暗号化されたファイルに使うパスワードを表すbytesオブジェクトです。作成された (ディレクトリか新ファイルの) 正規化されたパスを返します。
注釈
メンバのファイル名が絶対パスなら、ドライブ/UNC sharepoint および先頭の (バック) スラッシュは取り除かれます。 例えば、Unix で
///foo/barはfoo/barとなり、Windows でC:\foo\barはfoo\barとなります。 また、メンバのファイル名に含まれる".."というパス要素はすべて取り除かれます。 例えば、../../foo../../ba..rはfoo../ba..rとなります。 Windows では、不正な文字 (:,<,>,|,",?, および*) はアンダースコア (_) で置き換えられます。バージョン 3.6 で変更: 閉じた ZipFile の
extract()を呼び出すとValueErrorが送出されるようになりました。 以前はRuntimeErrorが送出されていました。バージョン 3.6.2 で変更: path パラメタが path-like object を受け付けるようになりました。
- ZipFile.extractall(path=None, members=None, pwd=None)¶
アーカイブ内のすべてのメンバーを現在の作業ディレクトリに展開します。 path には別の展開先ディレクトリを指定します。 members は省略可能で、指定する場合は
namelist()が返すリストの部分集合でなければなりません。 pwd は暗号化されたファイルに使うパスワードを表すbytesオブジェクトです。警告
信頼できないソースから取得したアーカイブは、事前に確認せずに展開しないでください。 例えば、絶対パスや ".." 要素を含むファイル名のメンバーがあると、path の外にファイルが作成される可能性があります。 このモジュールはそれを防ぐようにしています。
extract()の注記を参照してください。バージョン 3.6 で変更: 閉じた ZipFile の
extractall()を呼び出すとValueErrorが送出されるようになりました。 以前はRuntimeErrorが送出されていました。バージョン 3.6.2 で変更: path パラメタが path-like object を受け付けるようになりました。
- ZipFile.printdir()¶
アーカイブの内容の一覧を
sys.stdoutに出力します。
- ZipFile.read(name, pwd=None)¶
Return the bytes of the file name in the archive. name is the name of the file in the archive, or a
ZipInfoobject. The archive must be open for read or append. pwd is the password used for encrypted files as abytesobject and, if specified, overrides the default password set withsetpassword(). Callingread()on a ZipFile that uses a compression method other thanZIP_STORED,ZIP_DEFLATED,ZIP_BZIP2,ZIP_LZMA, orZIP_ZSTANDARDwill raise aNotImplementedError. An error will also be raised if the corresponding compression module is not available.バージョン 3.6 で変更: 閉じた ZipFile の
read()を呼び出すとValueErrorが送出されるようになりました。 以前はRuntimeErrorが送出されていました。
- ZipFile.testzip()¶
アーカイブ内のすべてのファイルを読み込み、CRC とファイルヘッダーを検査します。 最初に見つかった不正なファイルの名前を返し、不正なファイルがなければ
Noneを返します。バージョン 3.6 で変更: 閉じた ZipFile の
testzip()を呼び出すとValueErrorが送出されるようになりました。 以前はRuntimeErrorが送出されていました。
- ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)¶
filename で指定したファイルを、アーカイブ内の名前を arcname として書き込みます。 デフォルトの名前は filename からドライブ文字と先頭のパス区切り文字を取り除いたものです。 compress_type を指定すると、新しいエントリーにはコンストラクタの compression 引数の値よりも優先して使われます。 同様に、compresslevel を指定するとコンストラクタの値よりも優先されます。 アーカイブは
'w'、'x'、'a'のいずれかのモードで開いていなければなりません。注釈
ZIP ファイルの標準は、以前はメタデータのエンコーディングを規定していませんでしたが、相互運用性のために CP437 (初代 IBM PC のエンコーディング) を強く推奨していました。 最近のバージョンでは UTF-8 (のみ) も使えます。 このモジュールは、メンバー名に非 ASCII 文字が含まれる場合、自動的に UTF-8 で書き込みます。 ASCII または UTF-8 以外のエンコーディングでメンバー名を書き込むことはできません。
注釈
アーカイブ名はアーカイブルートに対する相対パスでなければなりません。言い換えると、アーカイブ名はパスセパレータで始まってはいけません。
注釈
もし、
arcname(arcnameが与えられない場合は、filename) が null byte を含むなら、アーカイブ中のファイルのファイル名は、null byte までで切り詰められます。注釈
ファイル名の先頭にスラッシュがあると、Windows 上の一部の zip プログラムでアーカイブを開けなくなる場合があります。
バージョン 3.6 で変更: モード
'r'で作成した ZipFile、または閉じた ZipFile のwrite()を呼び出すとValueErrorが送出されるようになりました。 以前はRuntimeErrorが送出されていました。
- ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)¶
Write a file into the archive. The contents is data, which may be either a
stror abytesinstance; if it is astr, it is encoded as UTF-8 first. zinfo_or_arcname is either the file name it will be given in the archive, or aZipInfoinstance. If it's an instance, at least the filename, date, and time must be given. If it's a name, the date and time is set to the current date and time. The archive must be opened with mode'w','x'or'a'.compress_type を指定すると、新しいエントリーにはコンストラクタの compression 引数の値、または
ZipInfoインスタンスとして渡した zinfo_or_arcname の値よりも優先して使われます。 同様に、compresslevel を指定するとコンストラクタの値よりも優先されます。注釈
ZipInfoインスタンスを引数 zinfo_or_arcname として与えた場合、与えられたZipInfoインスタンスのメンバーである compress_type で指定された圧縮方法が使われます。デフォルトでは、ZipInfoコンストラクターが、このメンバーをZIP_STOREDに設定します。バージョン 3.2 で変更: 引数 compress_type を追加しました。
バージョン 3.6 で変更: モード
'r'で作成した ZipFile、または閉じた ZipFile のwritestr()を呼び出すとValueErrorが送出されるようになりました。 以前はRuntimeErrorが送出されていました。バージョン 3.14 で変更:
SOURCE_DATE_EPOCH環境変数を参照するようになりました。 設定されている場合、ZIP アーカイブに書き込むファイルの更新タイムスタンプには現在時刻ではなくこの値を使います。
- ZipFile.mkdir(zinfo_or_directory, mode=511)¶
アーカイブ内にディレクトリを作成します。 zinfo_or_directory が文字列の場合、mode 引数で指定したモードでアーカイブ内にディレクトリを作成します。 zinfo_or_directory が
ZipInfoインスタンスの場合は mode 引数を無視します。アーカイブは
'w'、'x'、'a'のいずれかのモードで開いていなければなりません。Added in version 3.11.
以下のデータ属性も利用することができます:
- ZipFile.filename¶
ZIP ファイルの名前です。
- ZipFile.debug¶
使用するデバッグ出力レベルです。この属性は
0(デフォルト、何も出力しない) から3(最も多く出力する) までの値に設定することができます。デバッグ情報はsys.stdoutに出力されます。
Path オブジェクト¶
- class zipfile.Path(root, at='')¶
zip ファイルを表す
rootから Path オブジェクトを作成します。rootにはZipFileインスタンス、またはZipFileコンストラクタのfile引数に渡せるものを指定できます。atは zip ファイル内でのこの Path の位置を指定します。 例えば 'dir/file.txt'、'dir/'、'' などです。 デフォルトはルートを示す空文字列です。注釈
Pathクラスは ZIP アーカイブ内のファイル名を安全な形に変換しません。ZipFile.extract()メソッドやZipFile.extractall()メソッドと異なり、パストラバーサルの脆弱性を防ぐために、呼び出し側がファイル名の検証や安全な形への変換を行う必要があります (例えば絶対パスや ".." 要素を含むパスに注意してください)。 信頼できないアーカイブを扱う場合は、os.path.abspath()でファイル名を解決し、os.path.commonpath()で出力先ディレクトリと照合することを検討してください。
Path オブジェクトは pathlib.Path オブジェクトの以下の機能を提供します。
Path オブジェクトは / 演算子または joinpath でたどれます。
- Path.name¶
パスの最後の要素。
- Path.open(mode='r', *, pwd, **)¶
Invoke
ZipFile.open()on the current path. Allows opening for read or write, text or binary through supported modes: 'r', 'w', 'rb', 'wb'. Positional and keyword arguments are passed through toio.TextIOWrapperwhen opened as text and ignored otherwise.pwdis thepwdparameter toZipFile.open().バージョン 3.9 で変更: open でテキストモードとバイナリモードをサポートしました。 デフォルトはテキストモードになりました。
バージョン 3.11.2 で変更: 3.9 と同様に、
encoding引数を位置引数で渡してもTypeErrorが発生しなくなりました。 修正前の 3.10 や 3.11 との互換性が必要なコードでは、encodingを含むio.TextIOWrapperの引数をすべてキーワード引数として渡してください。
- Path.iterdir()¶
現在のディレクトリの子を列挙します。
- Path.is_dir()¶
現在の対象がディレクトリを指していれば
Trueを返します。
- Path.is_file()¶
現在の対象がファイルを指していれば
Trueを返します。
- Path.is_symlink()¶
現在の対象がシンボリックリンクを指していれば
Trueを返します。Added in version 3.12.
バージョン 3.13 で変更: 以前は
is_symlinkは無条件にFalseを返していました。
- Path.exists()¶
現在の対象が zip ファイル内のファイルまたはディレクトリを指していれば
Trueを返します。
- Path.suffix¶
パスの最後の要素にドットが含まれる場合、その最後のドットから後ろの部分です。 一般にファイル拡張子と呼ばれます。
Added in version 3.11:
Path.suffixプロパティを追加しました。
- Path.suffixes¶
パスのサフィックスのリストです。 サフィックスは一般にファイル拡張子と呼ばれます。
Added in version 3.11:
Path.suffixesプロパティを追加しました。
- Path.read_text(*, **)¶
現在のファイルを Unicode テキストとして読み込みます。 位置引数とキーワード引数は
io.TextIOWrapperに渡されます (bufferは現在の対象から決まるため除きます)。バージョン 3.11.2 で変更: 3.9 と同様に、
encoding引数を位置引数で渡してもTypeErrorが発生しなくなりました。 修正前の 3.10 や 3.11 との互換性が必要なコードでは、encodingを含むio.TextIOWrapperの引数をすべてキーワード引数として渡してください。
- Path.read_bytes()¶
現在のファイルをバイト列として読み込みます。
- Path.joinpath(*other)¶
各 other 引数を結合した新しい Path オブジェクトを返します。 次の記述は同じ意味です。
>>> Path(...).joinpath('child').joinpath('grandchild') >>> Path(...).joinpath('child', 'grandchild') >>> Path(...) / 'child' / 'grandchild'
バージョン 3.10 で変更: 3.10 より前では
joinpathはドキュメント化されておらず、引数を 1 つだけ受け付けていました。
zipp プロジェクトは、最新の Path オブジェクトの機能を古い Python にバックポートしています。
変更をいち早く利用するには、zipfile.Path の代わりに zipp.Path を使ってください。
PyZipFile オブジェクト¶
PyZipFile コンストラクタは ZipFile コンストラクタと同じパラメータに加え、optimize パラメータをとります。
- class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)¶
バージョン 3.2 で変更: optimize 引数を追加しました。
バージョン 3.4 で変更: ZIP64 拡張がデフォルトで有効になりました。
インスタンスは
ZipFileオブジェクトのメソッドの他に、追加のメソッドを 1 個持ちます:- writepy(pathname, basename='', filterfunc=None)¶
*.pyファイルを探し、対応するファイルをアーカイブに追加します。PyZipFileに optimize 引数が与えられない場合、あるいは-1が指定された場合、対応するファイルは*.pycファイルで、必要に応じてコンパイルします。PyZipFileの optimize パラメータが0、1、あるいは2の場合、それを最適化レベル (compile()参照) とするファイルのみが、必要に応じてコンパイルされアーカイブに追加されます。pathname がファイルの場合、ファイル名は
.pyで終わる必要があり、対応する*.pycファイルだけがパス情報なしで最上位に追加されます。 pathname が.pyで終わらないファイルの場合はRuntimeErrorが送出されます。 ディレクトリであって、パッケージディレクトリではない場合は、すべての*.pycファイルが最上位に追加されます。 パッケージディレクトリの場合は、パッケージ名をパスとしてその下にすべての*.pycファイルが追加されます。 サブディレクトリもパッケージディレクトリであれば、ソート順で再帰的に追加されます。basename は内部が使用するためだけのものです。
filterfunc を与える場合、単一の文字列引数を取る関数を渡してください。 これには(個々のフルパスを含む)それぞれのパスがアーカイブに加えられる前に渡されます。 filterfunc が偽を返せば、そのパスはアーカイブに追加されず、ディレクトリだった場合はその中身が無視されます。 例として、私たちのテストファイルが全て
testディレクトリの中にあるか、test_文字列で始まるとしましょう。 filterfunc を使ってそれらを除外出来ます:>>> zf = PyZipFile('myprog.zip') >>> def notests(s): ... fn = os.path.basename(s) ... return (not (fn == 'test' or fn.startswith('test_'))) ... >>> zf.writepy('myprog', filterfunc=notests)
writepy()メソッドは以下のようなファイル名でアーカイブを作成します:string.pyc # 最上位の名前 test/__init__.pyc # パッケージディレクトリ test/testall.pyc # モジュール test.testall test/bogus/__init__.pyc # サブパッケージディレクトリ test/bogus/myfile.pyc # サブモジュール test.bogus.myfile
バージョン 3.4 で変更: filterfunc 引数を追加しました。
バージョン 3.6.2 で変更: pathname 引数が path-like object を受け付けるようになりました。
バージョン 3.7 で変更: 再帰処理でディレクトリエントリーをソートするようになりました。
ZipInfo オブジェクト¶
ZipInfo クラスのインスタンスは、ZipFile オブジェクトの getinfo() および infolist() メソッドによって返されます。各オブジェクトは ZIP アーカイブ内の 1 個のメンバに関する情報を格納します。
ファイルシステム上のファイルから ZipInfo インスタンスを作成するクラスメソッドが 1 つあります。
- classmethod ZipInfo.from_file(filename, arcname=None, *, strict_timestamps=True)¶
zip ファイルに追加する準備として、ファイルシステム上のファイルに対する
ZipInfoインスタンスを作成します。filename はファイルシステム上のファイルまたはディレクトリへのパスでなければなりません。
arcname を指定した場合は、アーカイブ内の名前として使われます。 指定しない場合は filename からドライブ文字と先頭のパス区切り文字を取り除いた名前が使われます。
strict_timestamps 引数を
Falseにすると、1980-01-01 より前のファイルを ZIP に格納できますが、タイムスタンプは 1980-01-01 に設定されます。 2107-12-31 より後のファイルも同様に扱われ、タイムスタンプは上限の日時に設定されます。Added in version 3.6.
バージョン 3.6.2 で変更: filename 引数が path-like object を受け入れるようになりました。
バージョン 3.8 で変更: キーワード専用引数 strict_timestamps を追加しました。
インスタンスは以下のメソッドと属性を持ちます:
- ZipInfo.is_dir()¶
アーカイブのメンバーがディレクトリの場合に
Trueを返します。エントリーの名前で判定します。 ディレクトリの名前は常に
/で終わる必要があります。Added in version 3.6.
- ZipInfo.filename¶
アーカイブ中のファイル名。
- ZipInfo.date_time¶
アーカイブ内のメンバーの最終更新日時です。 ZIP ファイルの中央ディレクトリにある「最終更新時刻」と「最終更新日」のフィールドを表す、6 要素のタプルです。
タプルには次の値が含まれます。
インデックス
値
0西暦年 (>= 1980)
1月 (1 から始まる)
2日 (1 から始まる)
3時 (0 から始まる)
4分 (0 から始まる)
5秒 (0 から始まる)
注釈
ZIP 形式では、中央ディレクトリや NTFS/UNIX システム用の拡張フィールドなど、複数の場所にタイムスタンプのフィールドがあります。 この属性は中央ディレクトリのタイムスタンプを返します。 ZIP ファイルの中央ディレクトリのタイムスタンプ形式は、1980 年より前の日時をサポートしていません。 UNIX タイムスタンプなど、一部の拡張フィールドの形式ではそれ以前の日時も表せますが、この属性が返すのは中央ディレクトリのタイムスタンプだけです。
ほかの zip ツールの動作に合わせ、中央ディレクトリのタイムスタンプは UTC ではなくローカル時刻を表すものとして解釈されます。
- ZipInfo.compress_type¶
アーカイブメンバの圧縮形式。
- ZipInfo.extra¶
拡張フィールドデータ。この
bytesオブジェクトに含まれているデータの内部構成については、PKZIP Application Note でコメントされています。
- ZipInfo.create_system¶
ZIP アーカイブを作成したシステム。
- ZipInfo.create_version¶
このアーカイブを作成した PKZIP のバージョン。
- ZipInfo.extract_version¶
このアーカイブを展開する際に必要な PKZIP のバージョン。
- ZipInfo.reserved¶
予約領域。ゼロでなくてはなりません。
- ZipInfo.flag_bits¶
ZIP フラグビット列。
- ZipInfo.volume¶
ファイルヘッダのボリューム番号。
- ZipInfo.internal_attr¶
内部属性。
- ZipInfo.external_attr¶
外部ファイル属性。
- ZipInfo.header_offset¶
ファイルヘッダへのバイトオフセット。
- ZipInfo.CRC¶
圧縮前のファイルの CRC-32 チェックサム。
- ZipInfo.compress_size¶
圧縮後のデータのサイズ。
- ZipInfo.file_size¶
圧縮前のファイルのサイズ。
コマンドライン・インターフェース¶
zipfile モジュールは、ZIP アーカイブを操作する簡単なコマンドラインインターフェースを提供します。
新しい ZIP アーカイブを作成するには、-c オプションの直後にアーカイブ名を指定し、その後に含めるファイル名を列挙します。
$ python -m zipfile -c monty.zip spam.txt eggs.txt
ディレクトリを渡すこともできます:
$ python -m zipfile -c monty.zip life-of-brian_1979/
ZIP アーカイブを特定のディレクトリに展開したい場合、-e オプションを使用してください:
$ python -m zipfile -e monty.zip target-dir/
ZIP アーカイブ内のファイル一覧を表示するには -l を使用してください:
$ python -m zipfile -l monty.zip
コマンドラインオプション¶
展開時の注意点¶
zipfile モジュールによる展開は、以下のような問題によって失敗する場合があります。
ファイル自体の問題¶
パスワード、CRC チェックサム、ZIP 形式の誤りや、サポートされていない圧縮方式または復号方式によって展開に失敗する場合があります。
ファイルシステムの制限¶
ファイルシステムごとの制限を超えると、展開に失敗する場合があります。 ディレクトリエントリーに使用できる文字、ファイル名やパス名の長さ、単一ファイルのサイズ、ファイル数などの制限があります。
リソースの制限¶
メモリやディスク容量が不足すると展開に失敗します。 例えば、zipfile ライブラリでも展開爆弾 (別名 ZIP bomb) によってディスク容量が使い果たされる可能性があります。
中断¶
Control-C を押す、展開を行うプロセスを終了させるなど、展開中に処理が中断されると、アーカイブの展開が不完全な状態になる場合があります。
展開時のデフォルトの動作¶
展開時のデフォルトの動作を知らないと、予想外の結果になることがあります。 例えば同じアーカイブを 2 回展開すると、確認せずにファイルを上書きします。