お疲れ様です。
今日は「Streamlitの使い方ーファイルを保存、ダウンロード」について部分いたします。
2020年頃より、機械学習エンジニアやデータサイエンティストが Python でお手軽にウェブアプリを構築できる Streamlit が流行っていて、最近では業務で使っている人も多いのではないかと思います。
Streamlit は、その設計思想から、シンプルな可視化であればほとんど困ることはないだと思います。
アップロードしたファイルを保存する
Streamlit には、ファイルのアップロード機能が実装されていて、簡単に手元のデータをサーバーにアップロードできます。アップロードしたファイルはメモリ上に配置され、ディスク上に保存されるわけではないので、ファイルを保存したい場合や、パスが必要な処理を施したい場合は、ファイルを開いて書き込んでやる必要があります。
サンプルコード
import os
import streamlit as st
from PIL import Image
IMG_PATH = 'imgs'
def main():
st.markdown('# 画像を保存するデモ')
file = st.file_uploader('画像をアップロードしてください.', type=['jpg', 'jpeg', 'png'])
if file:
st.markdown(f'{file.name} をアップロードしました.')
img_path = os.path.join(IMG_PATH, file.name)
# 画像を保存する
with open(img_path, 'wb') as f:
f.write(file.read())
# 保存した画像を表示
img = Image.open(img_path)
st.image(img)
if __name__ == '__main__':
main()
ファイルをダウンロードする
以前はダウンロード専用の機能がなく、独自に実装する必要がありましたが、0.88.0 以降では st.download_button
を使って、簡単にダウンロードリンクを作ることができるようになりました
サンプルコード
import os
import streamlit as st
from PIL import Image
IMG_PATH = 'imgs'
def list_imgs():
# IMG_PATH 内の画像ファイルを列挙
return [
filename
for filename in os.listdir(IMG_PATH)
if filename.split('.')[-1] in ['jpg', 'jpeg', 'png']
]
def main():
st.markdown('# 画像を保存するデモ')
file = st.file_uploader('画像をアップロードしてください.', type=['jpg', 'jpeg', 'png'])
if file:
st.markdown(f'{file.name} をアップロードしました.')
img_path = os.path.join(IMG_PATH, file.name)
# 画像を保存する
with open(img_path, 'wb') as f:
f.write(file.read())
# 保存した画像を表示
img = Image.open(img_path)
st.image(img)
# IMG_DIR 以下の画像から選択
filename = st.selectbox('ダウンロードする画像を選択', list_imgs())
# ダウンロード
st.download_button(
'ダウンロード',
open(os.path.join(IMG_PATH, filename), 'br'),
filename
)
if __name__ == '__main__':
main()
Streamlit アプリを公開する
2021/11/2 に公開された Streamlit Cloud の機能を使うと、アプリを簡単に公開することができます。
アプリの公開機能は、もともと Streamlit Sharing と呼ばれて提供されていましたが、 使い勝手が大幅に改善され利用内容に応じた料金プランも設定されました。
使い方はとても簡単で、コードを GitHub にあげ、リポジトリとブランチ、ファイルを指定するだけです。コードを修正した場合も、GitHub に push するだけで自動的に更新されます。また、無料のコミュニティプランであっても、メールアドレスによるアクセス制御をしてくれるプライベートアプリを1つ作れます。
最後に、Streamlitはあくまでダッシュボードやプロトタイピングのためのツールで、ほどほどの柔軟性と素晴らしい開発体験が得られる一方、認証周りを含め本格的なアプリには向いていない側面もあります。
今日は以上です。
ありがとうございました。
よろしくお願いいたします。