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

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

zipfile —ZIPアーカイブを操作する

ソースコード: :source: `Lib / zipfile.py`



ZIPファイル形式は、一般的なアーカイブおよび圧縮の標準です。 このモジュールは、ZIPファイルを作成、読み取り、書き込み、追加、および一覧表示するためのツールを提供します。 このモジュールを高度に使用するには、 PKZIPアプリケーションノートで定義されている形式を理解している必要があります。

このモジュールは現在、マルチディスクZIPファイルを処理しません。 ZIP64拡張子を使用するZIPファイル(つまり、サイズが4 GiBを超えるZIPファイル)を処理できます。 ZIPアーカイブ内の暗号化されたファイルの復号化をサポートしていますが、現在、暗号化されたファイルを作成することはできません。 復号化は、CではなくネイティブPythonで実装されているため、非常に低速です。

このモジュールは、次の項目を定義します。

exception zipfile.BadZipFile

不正なZIPファイルに対して発生したエラー。

バージョン3.2の新機能。

exception zipfile.BadZipfile

古いPythonバージョンとの互換性のための BadZipFile のエイリアス。

バージョン3.2以降非推奨。

exception zipfile.LargeZipFile
ZIPファイルにZIP64機能が必要であるが、それが有効になっていない場合に発生するエラー。
class zipfile.ZipFile
ZIPファイルを読み書きするためのクラス。 コンストラクターの詳細については、セクション ZipFileオブジェクトを参照してください。
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オブジェクトで説明されています。
zipfile.is_zipfile(filename)

filename がマジックナンバーに基づく有効なZIPファイルである場合は、Trueを返します。それ以外の場合は、Falseを返します。 filename は、ファイルまたはファイルのようなオブジェクトの場合もあります。

バージョン3.1で変更:ファイルおよびファイルのようなオブジェクトのサポート。

zipfile.ZIP_STORED
非圧縮アーカイブメンバーの数値定数。
zipfile.ZIP_DEFLATED
通常のZIP圧縮方式の数値定数。 これには、 zlib モジュールが必要です。
zipfile.ZIP_BZIP2

BZIP2圧縮方式の数値定数。 これには、 bz2 モジュールが必要です。

バージョン3.3の新機能。

zipfile.ZIP_LZMA

LZMA圧縮方式の数値定数。 これには、 lzma モジュールが必要です。

バージョン3.3の新機能。

ノート

ZIPファイル形式の仕様には、2001年以降のbzip2圧縮、および2006年以降のLZMA圧縮のサポートが含まれています。 ただし、一部のツール(古いPythonリリースを含む)はこれらの圧縮方法をサポートしておらず、ZIPファイルの処理を完全に拒否するか、個々のファイルの抽出に失敗する可能性があります。

も参照してください

PKZIPアプリケーションノート
使用されたフォーマットとアルゴリズムの作成者であるPhilKatzによるZIPファイルフォーマットに関するドキュメント。
情報-ZIPホームページ
Info-ZIPプロジェクトのZIPアーカイブプログラムと開発ライブラリに関する情報。


ZipFileオブジェクト

class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None)

ZIPファイルを開きます。ファイルは、ファイル(文字列)、ファイルのようなオブジェクト、またはパスのようなオブジェクトへのパスです。

mode パラメーターは、既存のファイルを読み取る場合は'r'、新しいファイルを切り捨てて書き込む場合は'w'、既存のファイルに追加する場合は'a'である必要があります。または'x'を使用して、新しいファイルを排他的に作成および書き込みます。 mode'x'で、 file が既存のファイルを参照している場合、 FileExistsError が発生します。 mode'a'で、 file が既存のZIPファイルを参照している場合、追加のファイルが追加されます。 file がZIPファイルを参照していない場合、新しいZIPアーカイブがファイルに追加されます。 これは、ZIPアーカイブを別のファイル(python.exeなど)に追加するためのものです。 モード'a'で、ファイルがまったく存在しない場合は、ファイルが作成されます。 モード'r'または'a'の場合、ファイルはシーク可能である必要があります。

Compression は、アーカイブの書き込み時に使用するZIP圧縮方式であり、 ZIP_STOREDZIP_DEFLATEDZIP_BZIP2 、または ZIP_LZMAである必要があります。 ; 認識されない値により、 NotImplementedError が発生します。 ZIP_DEFLATEDZIP_BZIP2 または ZIP_LZMA が指定されているが、対応するモジュール( zlibbz2 または lzma )は使用できず、 RuntimeError が発生します。 デフォルトは ZIP_STORED です。

allowZip64True(デフォルト)の場合、zipファイルが4 GiBより大きい場合、zipfileはZIP64拡張子を使用するZIPファイルを作成します。 falseの場合、 zipfile は、ZIPファイルにZIP64拡張子が必要な場合に例外を発生させます。

compresslevel パラメーターは、ファイルをアーカイブに書き込むときに使用する圧縮レベルを制御します。 ZIP_STORED または ZIP_LZMA を使用した場合、効果はありません。 ZIP_DEFLATED を使用する場合、整数0から9が受け入れられます(詳細については、 zlib を参照してください)。 ZIP_BZIP2 を使用する場合、整数1から9が受け入れられます(詳細については、 bz2 を参照してください)。

ファイルがモード'w''x'、または'a'で作成され、アーカイブにファイルを追加せずにクローズされた場合、空のアーカイブがファイルに書き込まれます。

ZipFileはコンテキストマネージャーでもあるため、 with ステートメントをサポートします。 この例では、 myzip は、withステートメントのスイートが終了した後、例外が発生した場合でも閉じられます。

with ZipFile('spam.zip', 'w') as myzip:
    myzip.write('eggs.txt')

バージョン3.2の新機能: ZipFile をコンテキストマネージャーとして使用する機能が追加されました。

バージョン3.3で変更: bzip2 および lzma 圧縮のサポートが追加されました。

バージョン3.4で変更: ZIP64拡張機能はデフォルトで有効になっています。

バージョン3.5で変更:シークできないストリームへの書き込みのサポートが追加されました。 'x'モードのサポートが追加されました。

バージョン3.6で変更:以前は、認識されない圧縮値に対してプレーンな RuntimeError が発生していました。

バージョン3.6.2で変更: file パラメーターは、パスのようなオブジェクトを受け入れます。

バージョン3.7で変更: compresslevel パラメーターを追加します。

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ファイルを復号化するために使用されるパスワードです。

open()はコンテキストマネージャーでもあるため、 with ステートメントをサポートします。

with ZipFile('spam.zip') as myzip:
    with myzip.open('eggs.txt') as myfile:
        print(myfile.read())

モード 'r'では、ファイルのようなオブジェクト(ZipExtFile)は読み取り専用であり、次のメソッドを提供します: read()readline()readlines()seek()tell()__iter__()__ next __() 。 これらのオブジェクトは、ZipFileとは独立して動作できます。

mode='w'を使用すると、 write()メソッドをサポートする書き込み可能なファイルハンドルが返されます。 書き込み可能なファイルハンドルが開いているときに、ZIPファイル内の他のファイルを読み書きしようとすると、 ValueError が発生します。

ファイルを書き込むときに、ファイルサイズが事前にわからないが、2 GiBを超える可能性がある場合は、force_zip64=Trueを渡して、ヘッダー形式が大きなファイルをサポートできることを確認します。 ファイルサイズが事前にわかっている場合は、 file_size を設定して ZipInfo オブジェクトを作成し、それを name パラメーターとして使用します。

ノート

open()read()、および extract()メソッドは、ファイル名または ZipInfo オブジェクトを受け取ることができます。 名前が重複しているメンバーを含むZIPファイルを読み込もうとすると、これに感謝します。

バージョン3.6で変更: mode='U'のサポートを削除しました。 ユニバーサルニューラインモードで圧縮テキストファイルを読み取るには、 io.TextIOWrapper を使用します。

バージョン3.6での変更: open()を使用して、mode='w'オプションを使用してファイルをアーカイブに書き込むことができるようになりました。

バージョン3.6で変更:閉じたZipFileで open()を呼び出すと、 ValueError が発生します。 以前は、 RuntimeError が発生していました。

ZipFile.extract(member, path=None, pwd=None)

アーカイブから現在の作業ディレクトリにメンバーを抽出します。 member は、そのフルネームまたは ZipInfo オブジェクトである必要があります。 そのファイル情報は可能な限り正確に抽出されます。 path は、抽出先の別のディレクトリを指定します。 member は、ファイル名または ZipInfo オブジェクトにすることができます。 pwd は、暗号化されたファイルに使用されるパスワードです。

作成された正規化されたパス(ディレクトリまたは新しいファイル)を返します。

ノート

メンバーファイル名が絶対パスの場合、ドライブ/ UNC共有ポイントと先頭(バック)スラッシュは削除されます。たとえば、Unixでは///foo/barfoo/barになり、C:\foo\barは次のようになります。 Windowsではfoo\bar。 また、メンバーファイル名のすべての".."コンポーネントが削除されます。たとえば、../../foo../../ba..rfoo../ba..rになります。 Windowsの不正な文字(:<>|"?、および[X107X ] )はアンダースコア(_)に置き換えられました。

バージョン3.6で変更:閉じたZipFileで extract()を呼び出すと、 ValueError が発生します。 以前は、 RuntimeError が発生していました。

バージョン3.6.2で変更: path パラメーターは、 pathのようなオブジェクトを受け入れます。

ZipFile.extractall(path=None, members=None, pwd=None)

アーカイブから現在の作業ディレクトリにすべてのメンバーを抽出します。 path は、抽出先の別のディレクトリを指定します。 members はオプションであり、 namelist()によって返されるリストのサブセットである必要があります。 pwd は、暗号化されたファイルに使用されるパスワードです。

警告

事前の検査なしに、信頼できないソースからアーカイブを抽出しないでください。 ファイルがパスの外部で作成される可能性があります。 "/"で始まる絶対ファイル名または2つのドット".."で始まるファイル名を持つメンバー。 このモジュールはそれを防ごうとします。 extract()の注を参照してください。

バージョン3.6で変更:閉じたZipFileで extractall()を呼び出すと、 ValueError が発生します。 以前は、 RuntimeError が発生していました。

バージョン3.6.2で変更: path パラメーターは、 pathのようなオブジェクトを受け入れます。

ZipFile.printdir()
アーカイブの目次をsys.stdoutに印刷します。
ZipFile.setpassword(pwd)
pwd をデフォルトのパスワードとして設定して、暗号化されたファイルを抽出します。
ZipFile.read(name, pwd=None)

アーカイブ内のファイル name のバイトを返します。 name は、アーカイブ内のファイルの名前、または ZipInfo オブジェクトです。 アーカイブは、読み取りまたは追加のために開いている必要があります。 pwd は暗号化されたファイルに使用されるパスワードであり、指定されている場合、 setpassword()で設定されたデフォルトのパスワードを上書きします。 ZIP_STOREDZIP_DEFLATEDZIP_BZIP2 、または ZIP_LZMA 以外の圧縮方法を使用するZipFileで read()を呼び出す]は NotImplementedError を発生させます。 対応する圧縮モジュールが利用できない場合にもエラーが発生します。

バージョン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'で開いている必要があります。

ノート

アーカイブ名は、アーカイブルートを基準にする必要があります。つまり、パス区切り文字で始めることはできません。

ノート

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

バージョン3.6で変更:モード'r'で作成されたZipFileまたは閉じたZipFileで write()を呼び出すと、 ValueError が発生します。 以前は、 RuntimeError が発生していました。

ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)

アーカイブにファイルを書き込みます。 内容は data で、 str または bytes インスタンスのいずれかです。 str の場合、最初にUTF-8としてエンコードされます。 zinfo_or_arcname は、アーカイブで指定されるファイル名、または ZipInfo インスタンスのいずれかです。 インスタンスの場合は、少なくともファイル名、日付、時刻を指定する必要があります。 名前の場合、日付と時刻は現在の日付と時刻に設定されます。 アーカイブは、モード'w''x'、または'a'で開く必要があります。

指定された場合、 compress_type は、新しいエントリのコンストラクター、または zinfo_or_arcnameの場合)の compression パラメーターに指定された値をオーバーライドします。 ZipInfo インスタンス)。 同様に、 compresslevel は、指定された場合、コンストラクターをオーバーライドします。

ノート

ZipInfo インスタンスを zinfo_or_arcname パラメーターとして渡す場合、使用される圧縮方法は、指定された ZipInfocompress_type メンバーで指定された方法になります。実例。 デフォルトでは、 ZipInfo コンストラクターはこのメンバーを ZIP_STORED に設定します。

バージョン3.2で変更: compress_type 引数。

バージョン3.6で変更:モード'r'で作成されたZipFileまたは閉じたZipFileで writestr()を呼び出すと、 ValueError が発生します。 以前は、 RuntimeError が発生していました。

次のデータ属性も使用できます。

ZipFile.filename
ZIPファイルの名前。
ZipFile.debug
使用するデバッグ出力のレベル。 これは、0(デフォルト、出力なし)から3(最大出力)まで設定できます。 デバッグ情報はsys.stdoutに書き込まれます。
ZipFile.comment
bytes オブジェクトとしてZIPファイルに関連付けられたコメント。 モード'w''x'、または'a'で作成された ZipFile インスタンスにコメントを割り当てる場合は、65535バイトを超えないようにする必要があります。 これより長いコメントは切り捨てられます。


PyZipFileオブジェクト

PyZipFile コンストラクターは、 ZipFile コンストラクターと同じパラメーターを取り、さらに1つのパラメーター 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ファイルであり、必要に応じてコンパイルされます。

PyZipFileoptimize パラメーターが01、または2の場合、その最適化レベルのファイルのみ([X141Xを参照] ] compile())がアーカイブに追加され、必要に応じてコンパイルされます。

pathname がファイルの場合、ファイル名は.pyで終わる必要があり、(対応する*.pyc)ファイルのみがトップレベルに追加されます(パス情報なし)。 パス名.pyで終わらないファイルの場合、 RuntimeError が発生します。 それがディレクトリであり、そのディレクトリがパッケージディレクトリでない場合、すべてのファイル*.pycが最上位に追加されます。 ディレクトリがパッケージディレクトリの場合、すべての*.pycがパッケージ名の下にファイルパスとして追加され、サブディレクトリがパッケージディレクトリの場合、これらはすべて再帰的にソートされた順序で追加されます。

basename は、内部使用のみを目的としています。

filterfunc は、指定されている場合、単一の文字列引数を取る関数である必要があります。 アーカイブに追加される前に、各パス(個々のフルファイルパスを含む)が渡されます。 filterfunc がfalse値を返した場合、パスは追加されず、ディレクトリの場合、その内容は無視されます。 たとえば、テストファイルがすべて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                   # Top level name
test/__init__.pyc            # Package directory
test/testall.pyc             # Module test.testall
test/bogus/__init__.pyc      # Subpackage directory
test/bogus/myfile.pyc        # Submodule test.bogus.myfile

バージョン3.4の新機能: filterfunc パラメーター。

バージョン3.6.2で変更: pathname パラメーターは、 path-likeオブジェクトを受け入れます。

バージョン3.7で変更:再帰はディレクトリエントリをソートします。


ZipInfoオブジェクト

ZipInfo クラスのインスタンスは、 ZipFile オブジェクトの getinfo()および infolist()メソッドによって返されます。 各オブジェクトには、ZIPアーカイブの単一メンバーに関する情報が格納されます。

ファイルシステムファイルの ZipInfo インスタンスを作成するクラスメソッドが1つあります。

classmethod ZipInfo.from_file(filename, arcname=None)

ファイルシステム上のファイルの ZipInfo インスタンスを作成し、zipファイルに追加する準備をします。

filename は、ファイルシステム上のファイルまたはディレクトリへのパスである必要があります。

arcname が指定されている場合、アーカイブ内の名前として使用されます。 arcname が指定されていない場合、名前は filename と同じになりますが、ドライブ文字と先頭のパス区切り文字が削除されます。

バージョン3.6の新機能。

バージョン3.6.2で変更: filename パラメーターは、パスのようなオブジェクトを受け入れます。

インスタンスには、次のメソッドと属性があります。

ZipInfo.is_dir()

このアーカイブメンバーがディレクトリの場合は、Trueを返します。

これはエントリの名前を使用します。ディレクトリは常に/で終わる必要があります。

バージョン3.6の新機能。

ZipInfo.filename
アーカイブ内のファイルの名前。
ZipInfo.date_time

アーカイブメンバーへの最後の変更の日時。 これは6つの値のタプルです。

索引

価値

0

年(> = 1980)

1

月(1ベース)

2

曜日(1ベース)

3

時間(ゼロベース)

4

分(ゼロベース)

5

秒(ゼロベース)

ノート

ZIPファイル形式は、1980年より前のタイムスタンプをサポートしていません。

ZipInfo.compress_type
アーカイブメンバーの圧縮のタイプ。
ZipInfo.comment
bytes オブジェクトとしての個々のアーカイブメンバーへのコメント。
ZipInfo.extra
拡張フィールドデータ。 PKZIPアプリケーションノートには、この bytes オブジェクトに含まれるデータの内部構造に関するコメントが含まれています。
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
圧縮されていないファイルのサイズ。


コマンドラインインターフェイス

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

コマンドラインオプション

-l <zipfile>

--list <zipfile>

zipファイル内のファイルを一覧表示します。
-c <zipfile> <source1> ... <sourceN>

--create <zipfile> <source1> ... <sourceN>

ソースファイルからzipファイルを作成します。
-e <zipfile> <output_dir>

--extract <zipfile> <output_dir>

zipfileをターゲットディレクトリに抽出します。
-t <zipfile>

--test <zipfile>

zipファイルが有効かどうかをテストします。