27
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pythonを使ってzipファイルからファイルを取り出す

Posted at

#はじめに
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ファイルからファイルを取り出す方法に関してまとめてみました。ついでに、一旦ファイルとして保存することなく処理をする方法のサンプルを載せてみました。

27
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?