steamlitのデータのダウンロード、アップロード

import base64
import numpy as np
import pandas as pd
import streamlit as st


@st.cache
def sample():
    return pd.DataFrame(np.random.randint(0, 10, (6, 3)), columns=["A", "B", "C"])


def download_link(df): 
    s = base64.b64encode(df.to_csv(index=False).encode()).decode()
    return f'<a href="data:file/csv;base64,{s}" download="sample.csv">Download CSV</a>'

ダウンロードは、残念ながら用意されていません。本問では便宜的にHTMLのAタグでダウンロードできるようにします。


df = sample()
st.sidebar.markdown(download_link(10 - df), True)  # CSVダウンロードのリンク

if file := st.sidebar.file_uploader('Upload'):  アップロードボタンの作成
    # アップロードされていたらdfを置き換える
    df = pd.read_csv(file)

# グラフのコマンドを値とする辞書
dc = {"line": st.line_chart, "bar": st.bar_chart, "area": st.area_chart}
kind = st.sidebar.selectbox("Kind", list(dc))  # 選択ボックス
sl = st.sidebar.slider("lower", 0, 4)  # 開始位置のスライダー
dc[kind](df[sl:])  # グラフ出力
if st.checkbox("DataFrame"):
    st.dataframe(df[sl:].T)

st.file_uploaderを使うとファイルのアップロード機能が簡単にできます。
下記のように、返り値は、Noneまたは「アップロードされたファイル」になります。

  • アップロードされていないとき:返り値はNoneです。
  • アップロードされたとき:返り値はUploadedFileクラスのオブジェクトです。
    • UploadedFileクラスはByteIOクラスのサブクラスなので、ファイルオブジェクトのように利用できます。
  • ここでは説明を省きますが、複数ファイルのアップロードも可能です

コメント

タイトルとURLをコピーしました