#はじめに
Pythonのプログラム中でzipファイルからファイルを取り出したいことがあります。
この目的のためには、zipfileモジュールを使うことになります。そこで、簡単にzipfileモジュールの使い方をまとめてみました。Mac上のpython 3.6.8で動作を確認してあります。
#zipファイルからのファイルの抽出
zipfileモジュールを利用したいので、当然zipfileモジュールをimportします。
import zipfile
ZipFileオブジェクトを通して、zipファイルにアクセスすることになります。
例えば、zipファイルに含まれているファイルリストの取得、ファイルの取り出しなどができます。
プログラムを終了する前にcloseを呼び出さないといけないので、この面倒を避けるためにwith文を利用しています。
import zipfile
# zipファイルに含まれているファイル名の取得
with zipfile.ZipFile(zipファイル名) as myzip:
print(myzip.filename) # zipファイル名の表示
myzip.printdir() # zipファイルに含まれているファイル名をsys.stdoutに出力
with zipfile.ZipFile(zipファイル名) as myzip:
for f in myzip.namelist(): #zipファイルに含まれているファイルのリストを返す
print(f)
# zipファイルに含まれているファイルの取り出す
with zipfile.ZipFile(zipファイル名) as myzip:
myzip.extractall() # zipファイルに含まれているファイルを全て取り出す
# zipファイルからファイル名を指定して取り出す
with zipfile.ZipFile(zipファイル名) as myzip:
myzip.extract(ファイル名) # zipファイルに含まれているファイルを取り出す
# zipファイルからファイル名を指定して取り出す(パスワード付きの場合)
with zipfile.ZipFile(zipファイル名) as myzip:
myzip.extract(ファイル名, pwd="パスワード") # zipファイルに含まれているファイルを取り出す
内容 | |
---|---|
filename | zipファイル名を保持 |
printdir() | zipファイルに含まれているファイル名をsys.stdoutに出力 |
namelist() | zipファイルに含まれているファイルのリストを返す |
extractall() | zipファイルに含まれているファイルを全て取り出す |
extract(ファイル名) | zipファイルからファイル名を指定して取り出す |
もしパスワードがかかっているzipファイルの場合には、extractなどの引数にpwdキーワードでパスワードを指定します。
zipファイルに含まれるテキストファイルの処理
extractなどを利用するとzipファイルからファイルを取り出すことができます。
いちいちファイルを保存してから処理をすることが面倒な場合もあります。そこでopenを利用すると、ファイルを保存することなく処理を行うことができます。
import zipfile
# zipファイルに含まれているテキストファイルの読み込み
with zipfile.ZipFile(zipファイル名) as myzip:
with myzip.open(処理をしたいファイル名) as myfile: # openを利用してファイルにアクセス
print(myfile.read()) # この場合はreadで読み込みを行った
内容 | |
---|---|
open() | ZipExtFileを返す。これを利用してファイルのように処理ができる |
zipファイルに含まれる画像ファイル(バイナリファイル)の処理
画像ファイルのようなバイナリファイルを扱う場合は、ioモジュールも利用します。
下の例では画像ファイルの処理のためにPILモジュール(Pillow)を使用しています。
ここで利用しているio.ByteIOはメモリ上でバイナリデータを扱うための機能を提供しています。
import zipfile
import io
from PIL import Image
with zipfile.ZipFile(zipファイル名) as myzip:
with myzip.open(処理をしたいファイル名) as img_file:
img_bin = io.BytesIO(img_file.read()) # メモリ上のデータを読み込む
img = Image.open(img_bin) #読み込んだバイトストリームを利用して画像ファイルを生成
実のこのサンプルを少し変更することで、ネット上にある画像フィアルをファイルとして保存することなく処理をすることができます。こんな感じになります。
import io
from PIL import Image
import urllib.request
img_read = urllib.request.urlopen(url).read() # urlで指定され得た画像データを取得
img_bin = io.BytesIO(img_read) # メモリ上のデータを読み込む
img = Image.open(img_bin) #読み込んだバイトストリームを利用して画像ファイルを生成
おわりに
pythonを利用してzipファイルからファイルを取り出す方法に関してまとめてみました。ついでに、一旦ファイルとして保存することなく処理をする方法のサンプルを載せてみました。