はじめに
Web上に公開された画像やPDFを利用したいシーンは多いですが、いちいちダウンロードして保存先のパスを参照してませんか?
ここではわざわざ保存せずにURLから直接データを取得して利用する方法を紹介します。
方法
結論から言います。
BytesIOを使いましょう。
io
は標準ライブラリなのでインストールせずとも使えるはずです。
from io import BytesIO
使用例
使用例ですが、厚生労働省から新型コロナウイルスの陽性者数のPDFでも取得してtabula
で表を抽出してみましょう。
(ちなみにtabula
はPDFから表を抽出してくれる関数などを含むライブラリの名前です。インストールはpip install tabula-py
でできます。)
まずは、データの取得から、
requests
でも標準ライブラリのurllib
でも構いませんがrequests
のほうが扱いが楽なのでそちらでいきます。
from requests import get
url = 'https://www.mhlw.go.jp/content/10906000/000699602.pdf'
content = get(url).content
これでcontent
にはPDFのデータがバイト列で格納されます。
バイト列をそのまま使用できる関数の場合はBytesIO
を使うまでも有りませんが、大抵のファイルを扱う関数はPC上のパスを引数に取りますよね。
BytesIO
を使うことで
そのような関数にバイト列を渡すことができます。
from tabula import read_pdf
pdf_data = BytesIO(content)
df = read_pdf(pdf_data, pages='1', multiple_tables=False)[0]
df
結果
抽出の精度はまずまずですがそれはさておき、正常にデータを渡せていますね。
画像でもやってみますか。
import matplotlib.pyplot as plt
url = 'https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F501281%2F428a2cd3-9005-a88d-85fa-648fe37c9618.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=21e8bcf27cad307545ed42fe9dfeaf31'
img = plt.imread(BytesIO(get(url).content))
plt.imshow(img)
plt.show()
結果
OK
さいごに
受ける側の関数との相性によっては必ずしも万能ではないかもしれませんが、使用機会は多いと思いますので覚えておくと捗るかも。