Pythonで使えるioストリーム配信

Python学習【365日チャレンジ!】272日目のマスターU(@Udemy11)です。

久しぶりによしもとの新喜劇をみたら、おもしろくてお腹を抱えて笑ってしまいました。

大体の流れはわかっているのに笑えてしまいます。

やっぱり予定調和のストーリーは安心できるんでしょうね。

ひとととり笑ったので、今日もPython学習を始めましょう。

昨日の復習

昨日は、ioストリームの簡単な使い方を学習しました。

withステートメントを使ってファイルを保存して、保存したファイルを読み込んで出力するのと同様に、ioストリームを使って書き込み読み込みができました。

詳細については昨日の記事をごらんください。

今日は、ioストリームを使ってZipファイルの中のファイルをハードディスクに保存せずに確認する方法を学習します。

インメモリに保存

インメモリとは

インメモリとは、ソフトウェアを実行する際、使用するプログラムやデータのすべてをメインメモリ(RAM)上に読み込み、ストレージ(外部記憶装置)を使わないこと。特に、そのような方式のデータベースを「インメモリデータベース」という。

ということで、インメモリを使ってZipファイルを開いて中身を読み込む作業をioストリームを使ってやってみます。

import io
import requests
import zipfile


url = ('https://files.pythonhosted.org/packages/a7/e0/'
       '30642b9c2df516506d40b563b0cbd080c49c6b3f11a70b4c7a670f13a78b/'
       'setuptools-50.3.2.zip')

f = io.BytesIO()

r = requests.get(url)
f.write(r.content)

with zipfile.ZipFile(f) as z:
    with z.open('setuptools-50.3.2/README.rst') as r:
        print(r.read().decode())

最初にインポートするライブラリはiorequestszipfileです。

6行目でZipファイルのURLを指定していますが、こちらは、PyPiに用意されているsetuptoolsの最新版で、ダウンロードページにいって、右クリックでリンクのアドレスをコピーして貼り付けています。

Pythonで使えるioストリーム配信

10行目でBytesIOオブジェクトを作成して、12行目のrequests.getでコンテンツをダウンロードして、13行目のf.writeでコンテンツをインメモリに書き込んでいます。

あとは、Zipファイルを開いて出力しますが、今回はパッケージに含まれるREADME.rstを開いて表示しています。

17行目はr.read()だけでも出力できますが、decode()で表示を整えています。

出力結果

Pythonで使えるioストリーム配信

まとめ

通常なら、ファイルをいちいちダウンロードして解凍したファイルをハードディスクに保存してファイルを読み込むという作業が必要ですが、ioストリームを使うことで、インメモリにファイルを保存して読み込んで、プログラムが終了したあとは、削除してくれます。

シンプルな使い方の紹介だけなので、これをどのように使うかは使う人次第です。

プログラムはプログラムを書く人がイメージをしてどのように組み立てていくかは自由なので、ブロックを積み上げて何かを作り上げるロゴと同じような楽しさがあります。

イメージを膨らませておもしろいプログラムを書けるようになりましょう!

それでは、明日もGood Python!