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.Path
zipファイル用のpathlib互換ラッパー。 詳細については、セクションパスオブジェクトを参照してください。
バージョン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オブジェクトで説明されています。
- 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, *, strict_timestamps=True)
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_STORED 、 ZIP_DEFLATED 、 ZIP_BZIP2 、または ZIP_LZMAである必要があります。 ; 認識されない値により、 NotImplementedError が発生します。 ZIP_DEFLATED 、 ZIP_BZIP2 または ZIP_LZMA が指定されているが、対応するモジュール( zlib 、 bz2 または lzma )は使用できず、 RuntimeError が発生します。 デフォルトは ZIP_STORED です。
allowZip64 が
True
(デフォルト)の場合、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 を参照してください)。strict_timestamps 引数を
False
に設定すると、タイムスタンプを1980-01-01に設定する代わりに、1980-01-01より古いファイルを圧縮できます。 2107-12-31より新しいファイルでも同様の動作が発生し、タイムスタンプも制限に設定されます。ファイルがモード
'w'
、'x'
、または'a'
で作成され、アーカイブにファイルを追加せずにクローズされた場合、空のアーカイブがファイルに書き込まれます。ZipFileはコンテキストマネージャーでもあるため、 with ステートメントをサポートします。 この例では、 myzip は、
with
ステートメントのスイートが終了した後、例外が発生した場合でも閉じられます。with ZipFile('spam.zip', 'w') as myzip: myzip.write('eggs.txt')
バージョン3.2の新機能: ZipFile をコンテキストマネージャーとして使用する機能が追加されました。
バージョン3.4で変更: ZIP64拡張機能はデフォルトで有効になっています。
バージョン3.5で変更:シークできないストリームへの書き込みのサポートが追加されました。
'x'
モードのサポートが追加されました。バージョン3.6で変更:以前は、認識されない圧縮値に対してプレーンな RuntimeError が発生していました。
バージョン3.6.2で変更: file パラメーターは、パスのようなオブジェクトを受け入れます。
バージョン3.7で変更: compresslevel パラメーターを追加します。
バージョン3.8の新機能: strict_timestamps キーワードのみの引数
- 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/bar
はfoo/bar
になり、C:\foo\bar
は次のようになります。 Windowsではfoo\bar
。 また、メンバーファイル名のすべての".."
コンポーネントが削除されます。たとえば、../../foo../../ba..r
はfoo../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_STORED 、 ZIP_DEFLATED 、 ZIP_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
(またはfilename
、arcname
が指定されていない場合)にヌルバイトが含まれている場合、アーカイブ内のファイルの名前はヌルバイトで切り捨てられます。バージョン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 パラメーターとして渡す場合、使用される圧縮方法は、指定された ZipInfo の compress_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バイトを超えないようにする必要があります。 これより長いコメントは切り捨てられます。
パスオブジェクト
- class zipfile.Path(root, at=)
root
zipファイル( ZipFile コンストラクターに渡すのに適した ZipFile インスタンスまたはfile
の場合があります)からPathオブジェクトを作成します。at
は、zipファイル内のこのパスの場所を指定します。例: 'dir / file.txt'、 'dir /'、または 。 デフォルトは空の文字列で、ルートを示します。
パスオブジェクトは、 pathlib.Path オブジェクトの次の機能を公開します。
パスオブジェクトは、/
演算子を使用してトラバースできます。
- Path.name
- 最終パスコンポーネント。
- Path.open(*, **)
現在のパスで ZipFile.open()を呼び出します。 ZipFile.open()と同じ引数を受け入れます。
注意
この関数のシグネチャは、Python3.9では互換性のない方法で変更されます。 将来互換性のあるバージョンについては、サードパーティのzipp.Pathパッケージ(3.0以降)の使用を検討してください。
- Path.iterdir()
- 現在のディレクトリの子を列挙します。
- Path.is_dir()
- 現在のコンテキストがディレクトリを参照している場合は、
True
を返します。
- Path.is_file()
- 現在のコンテキストがファイルを参照している場合は、
True
を返します。
- Path.exists()
- 現在のコンテキストがzipファイル内のファイルまたはディレクトリを参照している場合は、
True
を返します。
- Path.read_text(*, **)
- 現在のファイルをUnicodeテキストとして読み取ります。 位置引数とキーワード引数は io.TextIOWrapper に渡されます(コンテキストによって暗示される
buffer
を除く)。
- Path.read_bytes()
- 現在のファイルをバイトとして読み取ります。
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
ファイルであり、必要に応じてコンパイルされます。PyZipFile の optimize パラメーターが
0
、1
、または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, *, strict_timestamps=True)
ファイルシステム上のファイルの ZipInfo インスタンスを作成し、zipファイルに追加する準備をします。
filename は、ファイルシステム上のファイルまたはディレクトリへのパスである必要があります。
arcname が指定されている場合、アーカイブ内の名前として使用されます。 arcname が指定されていない場合、名前は filename と同じになりますが、ドライブ文字と先頭のパス区切り文字が削除されます。
strict_timestamps 引数を
False
に設定すると、タイムスタンプを1980-01-01に設定する代わりに、1980-01-01より古いファイルを圧縮できます。 2107-12-31より新しいファイルでも同様の動作が発生し、タイムスタンプも制限に設定されます。バージョン3.6の新機能。
バージョン3.6.2で変更: filename パラメーターは、パスのようなオブジェクトを受け入れます。
バージョン3.8の新機能: strict_timestamps キーワードのみの引数
インスタンスには、次のメソッドと属性があります。
- 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ファイルが有効かどうかをテストします。
減圧の落とし穴
zipfileモジュールでの抽出は、以下にリストされているいくつかの落とし穴が原因で失敗する可能性があります。
ファイル自体から
パスワード/ CRCチェックサム/ ZIP形式が正しくないか、サポートされていない圧縮方法/復号化が原因で、解凍が失敗する場合があります。
ファイルシステムの制限
異なるファイルシステムの制限を超えると、解凍が失敗する可能性があります。 ディレクトリエントリで許可される文字、ファイル名の長さ、パス名の長さ、単一ファイルのサイズ、ファイル数など。
リソースの制限
メモリまたはディスクボリュームが不足すると、解凍に失敗します。 たとえば、解凍爆弾(別名 ZIP爆弾)は、ディスクボリュームの枯渇を引き起こす可能性のあるzipファイルライブラリに適用されます。
中断
control-Cを押したり、解凍プロセスを強制終了したりするなど、解凍中に中断すると、アーカイブの解凍が不完全になる場合があります。
抽出のデフォルトの動作
デフォルトの抽出動作がわからないと、予期しない解凍結果が発生する可能性があります。 たとえば、同じアーカイブを2回抽出すると、確認せずにファイルが上書きされます。