1
1

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 1 year has passed since last update.

urllib.request や requests でダウンロードしたzipファイルを一時ファイルを介さずに解凍する

Posted at

概要

スクレイピング等で urllib.requestrequests を用いてネットワークから取得した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)

参考文献

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?