Pythonのzipfileモジュールの使い方|zipファイルの作成、取得、中身の確認の方法を解説

スポンサーリンク

この記事では、ZIPファイルとは何か、そして、zipfileモジュールを使ってZIPファイルの操作を自動化するコードをpythonで実装します。

圧縮および解凍された zip ファイルを作成する方法と、zip ファイルからファイルを取り出す方法を学びます。

また、既に作成された zip ファイルに新しいファイルを追加する方法も紹介します。

スポンサーリンク

zipファイルとは?

ZIP は、可逆データ圧縮をサポートするアーカイブファイル形式です。

1つまたは複数のファイルやフォルダを含み、圧縮されている場合もあればされていない場合もあります。

ZIP ファイルは、多くのプログラムで基本ファイル形式として使用され、.zip ファイル拡張子を使用します。

どうやったら zipfile モジュールで圧縮なしの zip ファイルを作れるの?

Python では、zipfile モジュールの ZipFile() メソッドを用いて zip ファイルを作成することができます

そして、その zip ファイルに他のファイルを追加することができます

次のスクリーンショットは、zipファイルを作成する前のフォルダ内のファイルを示しています。

#import module
import zipfile
 
#declare filename
filename="zip_tutorial/tutorial.zip"
 
# create a ZipFile object by opening file
zip_obj= zipfile.ZipFile(filename,"w")
 
#add files to zip file
zip_obj.write("zip_tutorial/plane.xml")
zip_obj.write("zip_tutorial/sample.txt")
zip_obj.write("zip_tutorial/person.ini")
 
#close the file object
zip_obj.close()

次にコードを見てみましょう。

ここでは、ZipFile() メソッドは第一引数に作成するzipファイルのファイル名を取り、書き込みモードでファイルを開くために “w “を受け取ります。

プログラムの最後にファイルをクローズすることを忘れないでください。

#import module
import zipfile
 
#declare filename
filename="zip_tutorial/tutorial.zip"
 
# create a ZipFile object by opening file
zip_obj= zipfile.ZipFile(filename,"w",compression=zipfile.ZIP_DEFLATED)
 
#add files to zip file
zip_obj.write("zip_tutorial/plane.xml")
zip_obj.write("zip_tutorial/sample.txt")
zip_obj.write("zip_tutorial/person.ini")
 
#close the file object
zip_obj.close()

下図は、ZIPファイル作成後のフォルダの内容です。

#import module
import zipfile
 
#declare filename
filename="zip_tutorial/tutorial.zip"
 
# create a ZipFile object by opening file
zip_obj= zipfile.ZipFile(filename,"r")
 
#print the content of zip file
print("Content of the ZIP file are: ")
content_list=zip_obj.namelist()
for fname in content_list:
    print(fname)
 
#close the file object
zip_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 module
import zipfile
 
#declare filename
filename="zip_tutorial/tutorial.zip"
 
# create a ZipFile object by opening file
zip_obj= zipfile.ZipFile(filename,"r")
 
#print the metadata of zip file
print("Metadata of the ZIP file are: ")
content_list=zip_obj.infolist()
for info in content_list:
    print(info)
 
#close the file object
zip_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 module
import zipfile
 
#declare filename
filename="zip_tutorial/tutorial.zip"
 
# create a ZipFile object by opening file
zip_obj= zipfile.ZipFile(filename,"a")
 
#print the initial content of zip file
print("Initial Content of the ZIP file are: ")
content_list=zip_obj.namelist()
for fname in content_list:
    print(fname)
 
#Append a file to zip file
zip_obj.write("zip_tutorial/sampleoutput.txt")
 
#close the file objecz
zip_obj.close()
 
#read final content of the file after appending
nzip_obj= zipfile.ZipFile(filename,"a")
 
#print the initial content of zip file
print("Final Content of the ZIP file are: ")
ncontent_list=nzip_obj.namelist()
for fname in ncontent_list:
    print(fname)
 
#close the file
nzip_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 module
import zipfile
 
#declare filename
filename="zip_tutorial/tutorial.zip"
 
# create a ZipFile object by opening file
zip_obj= zipfile.ZipFile(filename,"r")
 
#extract file
zip_obj.extract("zip_tutorial/sampleoutput.txt")
 
#close the zip file
zip_obj.close()

上記のコードの出力は以下の通りです。

#import module
import zipfile
 
#declare filename
filename="zip_tutorial/tutorial.zip"
 
# create a ZipFile object by opening file
zip_obj= zipfile.ZipFile(filename,"r")
 
#extract all files
zip_obj.extractall("zip_tutorial/tutorial_folder_after_extraction")
 
#close the zip file
zip_obj.close()

infolist()` が、zip ファイルに含まれる各ファイルのファイル名、実サイズ、圧縮サイズ、圧縮アルゴリズム、およびファイルアクセスモードに関する情報を返していることがわかります。

How to append files directly into the zip file?

zip ファイルを作成するときに行ったように、zipfile モジュールの write() メソッドを使えば、zip ファイルに直接追加することができます

唯一の違いは、ファイルを追記モードで開く必要があるため、ZipFile() メソッドの第2引数として “a” が渡されることです。

Folder Before Zipping
Folder Before Zipping

結果は以下の通りです。

Folder After Zipping
Folder After Zipping

どうやったら圧縮されたフォルダから一つのファイルを取り出せるのでしょうか?

zipfileモジュールのextract()` メソッドを使用すると、zip フォルダから単一のファイルのみを抽出することができます

以下は、ファイルを抽出する前のフォルダのスナップです。

Folder Before Zipping 1
Folder Before compressed Zipping

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

Folder After Zipping 1
Folder After Zipping 1

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

Folder Before Unzipping
Folder Before Unzipping

zipfile モジュールで ZIP したフォルダから全てのファイルを取り出すには?

単一のファイルではなく、zip フォルダ全体を取り出すには、zipfile モジュールの extractall() メソッドを使用することができます

以下の画像は、zipファイルの中身を取り出す前のフォルダのスナップです。

Extracted File From ZIP
Extracted File From ZIP

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

Folder Before Unzipping 1
Folder Before Unzipping whole file

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

Extracted Folder From ZIP
Extracted Folder From ZIP

まとめ

この記事では、zip ファイルとは何か、そして Python zipfile モジュールを使って zip ファイルを作成し操作する方法について見てきました。

また、単一のファイルだけでなく、zip ファイルの内容全体を取り出す方法も見てきました。

タイトルとURLをコピーしました