概要
スクレイピング等で urllib.request
や requests
を用いてネットワークから取得したzipファイルを解凍する際に、一時ファイルを介さずメモリ上で解凍する方法です。
ファイルを介さないことで、保存先のディレクトリの確保や解凍後の不要なファイルの削除が不要になり、スマートな処理が実装可能です。
デモに利用するデータ
気象庁ホームページのデータをデモ用のファイルとして利用します。
ホーム > 各種データ・資料 > 過去の気象データ検索 > 平年値ダウンロード
上記ページの「梅雨入り・明けの時期」のzipファイル(https://www.data.jma.go.jp/obd/stats/data/mdrr/normal/2020/data/normal_baiu.zip
)を対象とします。
メモリ上でzipファイルを解凍するスクリプト
urllib.request
を使用する場合
import io
import zipfile
import urllib.request
url = "https://www.data.jma.go.jp/obd/stats/data/mdrr/normal/2020/data/normal_baiu.zip"
extract_dir = "."
with (
urllib.request.urlopen(url) as res,
io.BytesIO(res.read()) as bytes_io,
zipfile.ZipFile(bytes_io) as zip,
):
zip.extractall(extract_dir)
withステートメントにおいて括弧書きで複数のオブジェクトを扱うのはPython 3.10以降でサポートされる記法です。
requests
を使用する場合
import io
import zipfile
import requests
url = "https://www.data.jma.go.jp/obd/stats/data/mdrr/normal/2020/data/normal_baiu.zip"
extract_dir = "."
with (
requests.get(url) as res,
io.BytesIO(res.content) as bytes_io,
zipfile.ZipFile(bytes_io) as zip,
):
zip.extractall(extract_dir)
参考文献