12.4. zipfile — ZIPアーカイブの操作—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/zipfile
移動先:案内検索

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で変更: modeaで、ファイルがまったく存在しない場合は、作成されます。

Compression は、アーカイブの書き込み時に使用するZIP圧縮方式であり、 ZIP_STORED または ZIP_DEFLATED である必要があります。 認識されない値により、RuntimeErrorが発生します。 ZIP_DEFLATED が指定されているが、 zlib モジュールが使用できない場合、RuntimeErrorも発生します。 デフォルトは ZIP_STORED です。 allowZip64Trueの場合、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/barfoo/barになり、C:\foo\barは次のようになります。 Windowsではfoo\bar。 また、メンバーファイル名のすべての".."コンポーネントが削除されます。たとえば、../../foo../../ba..rfoo../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 が追加され、 nameZipInfo オブジェクトにできるようになりました。

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(またはfilenamearcnameが指定されていない場合)にヌルバイトが含まれている場合、アーカイブ内のファイルの名前はヌルバイトで切り捨てられます。

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 パラメーターとして渡す場合、使用される圧縮方法は、指定された ZipInfocompress_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ファイルが有効かどうかをテストします。