12.4。 ZIPファイル —ZIPアーカイブを操作する
バージョン1.6の新機能。
ソースコード: :source: `Lib / zipfile.py`
ZIPファイル形式は、一般的なアーカイブおよび圧縮の標準です。 このモジュールは、ZIPファイルを作成、読み取り、書き込み、追加、および一覧表示するためのツールを提供します。 このモジュールを高度に使用するには、 PKZIPアプリケーションノートで定義されている形式を理解している必要があります。
このモジュールは現在、マルチディスクZIPファイルを処理しません。 ZIP64拡張子を使用するZIPファイル(つまり、サイズが4ギガバイトを超えるZIPファイル)を処理できます。 ZIPアーカイブ内の暗号化されたファイルの復号化をサポートしていますが、現在、暗号化されたファイルを作成することはできません。 復号化は、CではなくネイティブPythonで実装されているため、非常に低速です。
このモジュールは、次の項目を定義します。
- exception zipfile.BadZipfile
- 不正なZIPファイル(古い名前:
zipfile.error
)で発生したエラー。
- exception zipfile.LargeZipFile
- ZIPファイルにZIP64機能が必要であるが、それが有効になっていない場合に発生するエラー。
- class zipfile.ZipFile
- ZIPファイルを読み書きするためのクラス。 コンストラクターの詳細については、セクション ZipFileオブジェクトを参照してください。
- class zipfile.PyZipFile
- Pythonライブラリを含むZIPアーカイブを作成するためのクラス。
- class zipfile.ZipInfo([filename[, date_time]])
- アーカイブのメンバーに関する情報を表すために使用されるクラス。 このクラスのインスタンスは、 ZipFile オブジェクトの getinfo()および infolist()メソッドによって返されます。 zipfile モジュールのほとんどのユーザーは、これらを作成する必要はありませんが、このモジュールによって作成されたもののみを使用します。 filename はアーカイブメンバーのフルネームである必要があり、 date_time はファイルへの最後の変更の時刻を説明する6つのフィールドを含むタプルである必要があります。 フィールドについては、セクション ZipInfoオブジェクトで説明されています。
- zipfile.is_zipfile(filename)
filename がマジックナンバーに基づく有効なZIPファイルである場合は、
True
を返します。それ以外の場合は、False
を返します。 filename は、ファイルまたはファイルのようなオブジェクトの場合もあります。バージョン2.7で変更:ファイルおよびファイルのようなオブジェクトのサポート。
- zipfile.ZIP_STORED
- 非圧縮アーカイブメンバーの数値定数。
- zipfile.ZIP_DEFLATED
- 通常のZIP圧縮方式の数値定数。 これには、 zlib モジュールが必要です。 現在、他の圧縮方法はサポートされていません。
も参照してください
- PKZIPアプリケーションノート
- 使用されたフォーマットとアルゴリズムの作成者であるPhilKatzによるZIPファイルフォーマットに関するドキュメント。
- 情報-ZIPホームページ
- Info-ZIPプロジェクトのZIPアーカイブプログラムと開発ライブラリに関する情報。
12.4.1。 ZipFileオブジェクト
- class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])
ZIPファイルを開きます。 file は、ファイルへのパス(文字列)またはファイルのようなオブジェクトのいずれかです。 mode パラメーターは、既存のファイルを読み取る場合は
'r'
、新しいファイルを切り捨てて書き込む場合は'w'
、既存のファイルに追加する場合は'a'
である必要があります。 。 mode が'a'
で、 file が既存のZIPファイルを参照している場合、追加のファイルが追加されます。 file がZIPファイルを参照していない場合、新しいZIPアーカイブがファイルに追加されます。 これは、ZIPアーカイブを別のファイル(python.exe
など)に追加するためのものです。バージョン2.6で変更: mode が
a
で、ファイルがまったく存在しない場合は、作成されます。Compression は、アーカイブの書き込み時に使用するZIP圧縮方式であり、 ZIP_STORED または ZIP_DEFLATED である必要があります。 認識されない値により、
RuntimeError
が発生します。 ZIP_DEFLATED が指定されているが、 zlib モジュールが使用できない場合、RuntimeError
も発生します。 デフォルトは ZIP_STORED です。 allowZip64 がTrue
の場合、zipファイルが2 GBより大きい場合、zipfileはZIP64拡張子を使用するZIPファイルを作成します。 false(デフォルト)の場合、 zipfile は、ZIPファイルにZIP64拡張子が必要な場合に例外を発生させます。 Unixのデフォルトの zip および unzip コマンド(InfoZIPユーティリティ)はこれらの拡張機能をサポートしていないため、ZIP64拡張機能はデフォルトで無効になっています。バージョン2.7.1で変更:ファイルがモード
'a'
または'w'
で作成され、アーカイブにファイルを追加せずにクローズされた場合、空のアーカイブに適切なZIP構造がファイルに書き込まれます。ZipFileはコンテキストマネージャーでもあるため、 with ステートメントをサポートします。 この例では、 myzip は、 with ステートメントのスイートが終了した後、例外が発生した場合でも閉じられます。
with ZipFile('spam.zip', 'w') as myzip: myzip.write('eggs.txt')
バージョン2.7の新機能: ZipFile をコンテキストマネージャーとして使用する機能が追加されました。
- ZipFile.close()
- アーカイブファイルを閉じます。 プログラムを終了する前に close()を呼び出す必要があります。そうしないと、重要なレコードが書き込まれません。
- ZipFile.getinfo(name)
- アーカイブメンバー name に関する情報を含む ZipInfo オブジェクトを返します。 現在アーカイブに含まれていない名前に対して getinfo()を呼び出すと、
KeyError
が発生します。
- ZipFile.infolist()
- アーカイブの各メンバーの ZipInfo オブジェクトを含むリストを返します。 既存のアーカイブが開かれている場合、オブジェクトはディスク上の実際のZIPファイルのエントリと同じ順序になります。
- ZipFile.namelist()
アーカイブメンバーのリストを名前で返します。
- ZipFile.open(name[, mode[, pwd]])
アーカイブからファイルのようなオブジェクト(ZipExtFile)としてメンバーを抽出します。 name は、アーカイブ内のファイルの名前、または ZipInfo オブジェクトです。 mode パラメーターが含まれている場合は、
'r'
(デフォルト)、'U'
、または'rU'
のいずれかである必要があります。'U'
または'rU'
を選択すると、読み取り専用オブジェクトでユニバーサル改行のサポートが有効になります。 pwd は、暗号化されたファイルに使用されるパスワードです。 閉じたZipFileで open()を呼び出すと、RuntimeError
が発生します。ノート
ファイルのようなオブジェクトは読み取り専用であり、次のメソッドを提供します: read()、 readline()、 readlines()、 [X134X ]、
next()
。ノート
コンストラクターへの最初の引数としてファイルのようなオブジェクトを渡すことによってZipFileが作成された場合、 open()によって返されるオブジェクトはZipFileのファイルポインターを共有します。 このような状況では、 open()によって返されるオブジェクトは、ZipFileオブジェクトに対して追加の操作が実行された後は使用しないでください。 コンストラクターに最初の引数として文字列(ファイル名)を渡すことによってZipFileが作成された場合、 open()は、ZipExtFileによって保持される新しいファイルオブジェクトを作成し、操作できるようにします。 ZipFileとは独立して。
ノート
open()、 read()、および extract()メソッドは、ファイル名または ZipInfo オブジェクトを受け取ることができます。 名前が重複しているメンバーを含むZIPファイルを読み込もうとすると、これに感謝します。
バージョン2.6の新機能。
- ZipFile.extract(member[, path[, pwd]])
アーカイブから現在の作業ディレクトリにメンバーを抽出します。 member は、そのフルネームまたは ZipInfo オブジェクトである必要があります)。 そのファイル情報は可能な限り正確に抽出されます。 path は、抽出先の別のディレクトリを指定します。 member は、ファイル名または ZipInfo オブジェクトにすることができます。 pwd は、暗号化されたファイルに使用されるパスワードです。
作成された正規化されたパス(ディレクトリまたは新しいファイル)を返します。
バージョン2.6の新機能。
ノート
メンバーファイル名が絶対パスの場合、ドライブ/ UNC共有ポイントと先頭(バック)スラッシュは削除されます。たとえば、Unixでは
///foo/bar
はfoo/bar
になり、C:\foo\bar
は次のようになります。 Windowsではfoo\bar
。 また、メンバーファイル名のすべての".."
コンポーネントが削除されます。たとえば、../../foo../../ba..r
はfoo../ba..r
になります。 Windowsの不正な文字(:
、<
、>
、|
、"
、?
、および[X107X ] )はアンダースコア(_
)に置き換えられました。
- ZipFile.extractall([path[, members[, pwd]]])
アーカイブから現在の作業ディレクトリにすべてのメンバーを抽出します。 path は、抽出先の別のディレクトリを指定します。 members はオプションであり、 namelist()によって返されるリストのサブセットである必要があります。 pwd は、暗号化されたファイルに使用されるパスワードです。
警告
事前の検査なしに、信頼できないソースからアーカイブを抽出しないでください。 ファイルがパスの外部で作成される可能性があります。
"/"
で始まる絶対ファイル名または2つのドット".."
で始まるファイル名を持つメンバー。バージョン2.7.4で変更: zipfileモジュールはそれを防止しようとします。 extract()の注を参照してください。
バージョン2.6の新機能。
- ZipFile.printdir()
- アーカイブの目次を
sys.stdout
に印刷します。
- ZipFile.setpassword(pwd)
pwd をデフォルトのパスワードとして設定して、暗号化されたファイルを抽出します。
バージョン2.6の新機能。
- ZipFile.read(name[, pwd])
アーカイブ内のファイル name のバイトを返します。 name は、アーカイブ内のファイルの名前、または ZipInfo オブジェクトです。 アーカイブは、読み取りまたは追加のために開いている必要があります。 pwd は暗号化されたファイルに使用されるパスワードであり、指定されている場合、 setpassword()で設定されたデフォルトのパスワードを上書きします。 閉じたZipFileで read()を呼び出すと、
RuntimeError
が発生します。バージョン2.6での変更: pwd が追加され、 name を ZipInfo オブジェクトにできるようになりました。
- ZipFile.testzip()
- アーカイブ内のすべてのファイルを読み取り、それらのCRCとファイルヘッダーを確認します。 最初の不良ファイルの名前を返すか、
None
を返します。 閉じたZipFileで testzip()を呼び出すと、RuntimeError
が発生します。
- ZipFile.write(filename[, arcname[, compress_type]])
filename という名前のファイルをアーカイブに書き込み、アーカイブ名 arcname を付けます(デフォルトでは、これは filename と同じですが、ドライブ文字はありません先行パス区切り文字が削除されています)。 指定した場合、 compress_type は、 Compression パラメーターに指定された値を新しいエントリーのコンストラクターにオーバーライドします。 アーカイブはモード
'w'
または'a'
で開く必要があります–モード'r'
で作成されたZipFileで write()を呼び出すと、 [が発生しますX143X]。 閉じたZipFileで write()を呼び出すと、RuntimeError
が発生します。ノート
ZIPファイルの正式なファイル名エンコーディングはありません。 Unicodeファイル名がある場合は、 write()に渡す前に、目的のエンコーディングのバイト文字列に変換する必要があります。 WinZipは、すべてのファイル名をCP437(DOSラテン語とも呼ばれる)でエンコードされたものとして解釈します。
ノート
アーカイブ名は、アーカイブルートを基準にする必要があります。つまり、パス区切り文字で始めることはできません。
ノート
arcname
(またはfilename
、arcname
が指定されていない場合)にヌルバイトが含まれている場合、アーカイブ内のファイルの名前はヌルバイトで切り捨てられます。
- ZipFile.writestr(zinfo_or_arcname, bytes[, compress_type])
文字列 bytes をアーカイブに書き込みます。 zinfo_or_arcname は、アーカイブで指定されるファイル名、または ZipInfo インスタンスのいずれかです。 インスタンスの場合は、少なくともファイル名、日付、時刻を指定する必要があります。 名前の場合、日付と時刻は現在の日付と時刻に設定されます。 アーカイブはモード
'w'
または'a'
で開く必要があります–モード'r'
で作成されたZipFileで writestr()を呼び出すと、 [が発生しますX150X]。 閉じたZipFileで writestr()を呼び出すと、RuntimeError
が発生します。指定された場合、 compress_type は、新しいエントリのコンストラクター、または zinfo_or_arcname (の場合)の compression パラメーターに指定された値をオーバーライドします。 ZipInfo インスタンス)。
ノート
ZipInfo インスタンスを zinfo_or_arcname パラメーターとして渡す場合、使用される圧縮方法は、指定された ZipInfo の compress_type メンバーで指定された方法になります。実例。 デフォルトでは、 ZipInfo コンストラクターはこのメンバーを ZIP_STORED に設定します。
バージョン2.7で変更: compress_type 引数。
次のデータ属性も使用できます。
- ZipFile.debug
- 使用するデバッグ出力のレベル。 これは、
0
(デフォルト、出力なし)から3
(最大出力)まで設定できます。 デバッグ情報はsys.stdout
に書き込まれます。
- ZipFile.comment
- ZIPファイルに関連付けられたコメントテキスト。 モード「a」または「w」で作成された ZipFile インスタンスにコメントを割り当てる場合、これは65535バイト以下の文字列である必要があります。 これより長いコメントは、 close()が呼び出されたときに、書き込まれたアーカイブで切り捨てられます。
12.4.2。 PyZipFileオブジェクト
PyZipFile コンストラクターは、 ZipFile コンストラクターと同じパラメーターを取ります。 インスタンスには、 ZipFile オブジェクトのメソッドに加えて1つのメソッドがあります。
- PyZipFile.writepy(pathname[, basename])
ファイル
*.py
を検索し、対応するファイルをアーカイブに追加します。 対応するファイルは、利用可能な場合は*.pyo
ファイル、それ以外の場合は*.pyc
ファイルであり、必要に応じてコンパイルされます。 パス名がファイルの場合、ファイル名は.py
で終わる必要があり、(対応する*.py[co]
)ファイルだけがトップレベルに追加されます(パス情報なし)。 パス名が.py
で終わらないファイルの場合、RuntimeError
が発生します。 それがディレクトリであり、そのディレクトリがパッケージディレクトリでない場合、すべてのファイル*.py[co]
が最上位に追加されます。 ディレクトリがパッケージディレクトリの場合、すべての*.py[co]
がパッケージ名の下にファイルパスとして追加され、サブディレクトリがパッケージディレクトリの場合、これらはすべて再帰的に追加されます。 basename は、内部使用のみを目的としています。 writepy()メソッドは、次のようなファイル名でアーカイブを作成します。string.pyc # Top level name test/__init__.pyc # Package directory test/test_support.pyc # Module test.test_support test/bogus/__init__.pyc # Subpackage directory test/bogus/myfile.pyc # Submodule test.bogus.myfile
12.4.3。 ZipInfoオブジェクト
ZipInfo クラスのインスタンスは、 ZipFile オブジェクトの getinfo()および infolist()メソッドによって返されます。 各オブジェクトには、ZIPアーカイブの単一メンバーに関する情報が格納されます。
インスタンスには次の属性があります。
- ZipInfo.filename
- アーカイブ内のファイルの名前。
- ZipInfo.date_time
アーカイブメンバーへの最後の変更の日時。 これは6つの値のタプルです。
索引
価値
0
年(> = 1980)
1
月(1ベース)
2
曜日(1ベース)
3
時間(ゼロベース)
4
分(ゼロベース)
5
秒(ゼロベース)
ノート
ZIPファイル形式は、1980年より前のタイムスタンプをサポートしていません。
- ZipInfo.compress_type
- アーカイブメンバーの圧縮のタイプ。
- ZipInfo.comment
- 個々のアーカイブメンバーへのコメント。
- ZipInfo.extra
- 拡張フィールドデータ。 PKZIPアプリケーションノートには、この文字列に含まれるデータの内部構造に関するコメントが含まれています。
- ZipInfo.create_system
- ZIPアーカイブを作成したシステム。
- ZipInfo.create_version
- ZIPアーカイブを作成した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
- 圧縮されていないファイルのサイズ。
12.4.4。 コマンドラインインターフェイス
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
12.4.4.1。 コマンドラインオプション
- -l <zipfile>
- zipファイル内のファイルを一覧表示します。
- -c <zipfile> <source1> ... <sourceN>
- ソースファイルからzipファイルを作成します。
- -e <zipfile> <output_dir>
- zipfileをターゲットディレクトリに抽出します。
- -t <zipfile>
- zipファイルが有効かどうかをテストします。