この記事では、ZIPファイルとは何か、そして、zipfileモジュールを使ってZIPファイルの操作を自動化するコードをpythonで実装します。
圧縮および解凍された zip ファイルを作成する方法と、zip ファイルからファイルを取り出す方法を学びます。
また、既に作成された zip ファイルに新しいファイルを追加する方法も紹介します。
zipファイルとは?
ZIP は、可逆データ圧縮をサポートするアーカイブファイル形式です。
1つまたは複数のファイルやフォルダを含み、圧縮されている場合もあればされていない場合もあります。
ZIP ファイルは、多くのプログラムで基本ファイル形式として使用され、.zip ファイル拡張子を使用します。
どうやったら zipfile モジュールで圧縮なしの zip ファイルを作れるの?
Python では、zipfile モジュールの ZipFile() メソッドを用いて zip ファイルを作成することができます。
そして、その zip ファイルに他のファイルを追加することができます。
次のスクリーンショットは、zipファイルを作成する前のフォルダ内のファイルを示しています。
#import moduleimport zipfile
#declare filenamefilename="zip_tutorial/tutorial.zip"
# create a ZipFile object by opening filezip_obj= zipfile.ZipFile(filename,"w")
#add files to zip filezip_obj.write("zip_tutorial/plane.xml")
zip_obj.write("zip_tutorial/sample.txt")
zip_obj.write("zip_tutorial/person.ini")
#close the file objectzip_obj.close() |
次にコードを見てみましょう。
ここでは、ZipFile() メソッドは第一引数に作成するzipファイルのファイル名を取り、書き込みモードでファイルを開くために “w “を受け取ります。
プログラムの最後にファイルをクローズすることを忘れないでください。
#import moduleimport zipfile
#declare filenamefilename="zip_tutorial/tutorial.zip"
# create a ZipFile object by opening filezip_obj= zipfile.ZipFile(filename,"w",compression=zipfile.ZIP_DEFLATED)
#add files to zip filezip_obj.write("zip_tutorial/plane.xml")
zip_obj.write("zip_tutorial/sample.txt")
zip_obj.write("zip_tutorial/person.ini")
#close the file objectzip_obj.close() |
下図は、ZIPファイル作成後のフォルダの内容です。
#import moduleimport zipfile
#declare filenamefilename="zip_tutorial/tutorial.zip"
# create a ZipFile object by opening filezip_obj= zipfile.ZipFile(filename,"r")
#print the content of zip fileprint("Content of the ZIP file are: ")
content_list=zip_obj.namelist()
for fname in content_list:
print(fname)
#close the file objectzip_obj.close() |
zipfile モジュールで圧縮された zip ファイルを作成するには?
圧縮された zip ファイルを作成するには、ZipFile() メソッドへの引数として、ファイルを圧縮するアルゴリズムを指定する必要があります。
一般に、zipファイルを作成する際には DEFLATED アルゴリズムを使用してファイルを圧縮します。
次の図は、圧縮されたZIPファイルを作成する前のフォルダの内容を示しています。
Content of the ZIP file are:
zip_tutorial/plane.xml
zip_tutorial/sample.txt
zip_tutorial/person.ini
|
圧縮されたZIPファイルを作成するためには、圧縮のためのアルゴリズムを指定するcompression引数を追加するだけです。
ここでは、zip_deflated アルゴリズムを使用しているので、ZipFile オブジェクトを作成するときに compression=zipfile.ZIP_DEFLATED が使用されています。
#import moduleimport zipfile#declare filenamefilename="zip_tutorial/tutorial.zip"# create a ZipFile object by opening filezip_obj= zipfile.ZipFile(filename,"r")#print the metadata of zip fileprint("Metadata of the ZIP file are: ")content_list=zip_obj.infolist()for info in content_list: print(info)
#close the file objectzip_obj.close() |
次の図は、圧縮された Zip ファイルが作成された後のフォルダの内容を示しています。
Metadata of the ZIP file are:
<ZipInfo filename='zip_tutorial/plane.xml' compress_type=deflate filemode='-rw-rw-r--' file_size=264 compress_size=174>
<ZipInfo filename='zip_tutorial/sample.txt' compress_type=deflate filemode='-rw-rw-r--' file_size=409 compress_size=215>
<ZipInfo filename='zip_tutorial/person.ini' compress_type=deflate filemode='-rw-rw-r--' file_size=183 compress_size=141>
|
zip フォルダ内のファイルを展開せずに中身を確認する方法は?
zip ファイルの内容をチェックするには、zipfile モジュールの namelist() メソッドを使用します。
ここで namelist() メソッドは、ZipFile オブジェクトに対して実行されると、zip ファイルに含まれるファイルの名前のリストを返します。
ここでは、ファイルを “read” モードでオープンしているので、 ZipFile() の第二引数として “r” が与えられています。
ここでは、zip ファイルの内容をループするために for ループを使用します。
#import moduleimport zipfile
#declare filenamefilename="zip_tutorial/tutorial.zip"
# create a ZipFile object by opening filezip_obj= zipfile.ZipFile(filename,"a")
#print the initial content of zip fileprint("Initial Content of the ZIP file are: ")
content_list=zip_obj.namelist()
for fname in content_list:
print(fname)
#Append a file to zip filezip_obj.write("zip_tutorial/sampleoutput.txt")
#close the file objeczzip_obj.close()#read final content of the file after appendingnzip_obj= zipfile.ZipFile(filename,"a")
#print the initial content of zip fileprint("Final Content of the ZIP file are: ")
ncontent_list=nzip_obj.namelist()
for fname in ncontent_list:
print(fname)
#close the filenzip_obj.close() |
上のコードの出力は次のようになります。
Initial Content of the ZIP file are:
zip_tutorial/plane.xml
zip_tutorial/sample.txt
zip_tutorial/person.ini
Final Content of the ZIP file are:
zip_tutorial/plane.xml
zip_tutorial/sample.txt
zip_tutorial/person.ini
zip_tutorial/sampleoutput.txt
|
How to check metadata of the zipped file?
ファイルのメタデータとは、任意のファイルの説明を含むデータのことです。
作成日、更新日、ファイルサイズ、その他の情報が含まれています。
ZIP ファイルのメタデータを取得するには、zipfile モジュールの infolist() メソッドを使用します。
#import moduleimport zipfile
#declare filenamefilename="zip_tutorial/tutorial.zip"
# create a ZipFile object by opening filezip_obj= zipfile.ZipFile(filename,"r")
#extract filezip_obj.extract("zip_tutorial/sampleoutput.txt")
#close the zip filezip_obj.close() |
上記のコードの出力は以下の通りです。
#import moduleimport zipfile
#declare filenamefilename="zip_tutorial/tutorial.zip"
# create a ZipFile object by opening filezip_obj= zipfile.ZipFile(filename,"r")
#extract all files zip_obj.extractall("zip_tutorial/tutorial_folder_after_extraction")
#close the zip filezip_obj.close() |
infolist()` が、zip ファイルに含まれる各ファイルのファイル名、実サイズ、圧縮サイズ、圧縮アルゴリズム、およびファイルアクセスモードに関する情報を返していることがわかります。
How to append files directly into the zip file?
zip ファイルを作成するときに行ったように、zipfile モジュールの write() メソッドを使えば、zip ファイルに直接追加することができます。
唯一の違いは、ファイルを追記モードで開く必要があるため、ZipFile() メソッドの第2引数として “a” が渡されることです。

結果は以下の通りです。

どうやったら圧縮されたフォルダから一つのファイルを取り出せるのでしょうか?
zipfileモジュールのextract()` メソッドを使用すると、zip フォルダから単一のファイルのみを抽出することができます。
以下は、ファイルを抽出する前のフォルダのスナップです。

extract()` メソッドは引数としてファイル名を受け取り、作業ディレクトリにあるファイルを取り出します。

下の画像は、zipファイルからファイルを取り出した後のフォルダのスナップです。

zipfile モジュールで ZIP したフォルダから全てのファイルを取り出すには?
単一のファイルではなく、zip フォルダ全体を取り出すには、zipfile モジュールの extractall() メソッドを使用することができます。
以下の画像は、zipファイルの中身を取り出す前のフォルダのスナップです。

extractall()` メソッドは出力ファイルの名前を引数にとり、zipファイルの内容全体を作業ディレクトリのフォルダに展開します。

以下の画像は、ZIPファイルの全内容が別のフォルダに展開された後のフォルダのスナップショットです。

まとめ
この記事では、zip ファイルとは何か、そして Python zipfile モジュールを使って zip ファイルを作成し操作する方法について見てきました。
また、単一のファイルだけでなく、zip ファイルの内容全体を取り出す方法も見てきました。