无法从 streamlit 下载 csv 格式

Unable to download from streamlit in csv format

我正在尝试以 csv 文件的形式从 streamlit 下载数据框。但是,它无法以 CSV 格式下载,而是以 object.I 格式下载,必须手动转换为 csv 才能满足我的要求 output.Below 是示例代码:

import pandas as pd
import base64
import streamlit as st

X = pd.DataFrame({'A':["bad",  "good", "better",   "good", "better",   "good", "better",   "good", "better",   "bad",  "good", "better",   "good", "better",   "bad",  "good", "better",   "bad",  "good", "better",   "good", "better",   "bad"],
                   'B': [3803,  1062,   4862,   6356,   2171,   532,    6982,   891,    1961,   3631,   1626,   1507,   3069,   2793,   721,    4288,   1601,   1439,   5807,   5054,   2411,   2913,   3505],
                   'C': [1318,  2537,   2315,   4967,   4483,   1433,   529,    1262,   1583,   506,    2576,   289,    3740,   3087,   309,    3493,   1862,   2666,   1231,   1828,   4144,   3503,   3102]
})

if X is not None:
            csv_exp = X.to_csv(index=False)
            b64 = base64.b64encode(csv_exp.encode()).decode()  # some strings <-> bytes conversions necessary here
            href = f'<a href="data:file/csv;base64,{b64}">Download Predicted File</a>(right-click and save as csv**)'
  
            st.markdown(href, unsafe_allow_html=True)

我运行 你的代码。当我单击 link 时,我看到它另存为 download.

我在保存过程中将其更改为download.csv,似乎可以使用。

当我打开 download 它没有在我的 csv 查看器中打开。
当我打开 download.csv 时,它会在我的 csv 查看器中打开。

当我 运行 cat downloadcat download.csv 时,输出是相同的并且是 csv 格式。所以数据是一样的。

看来你想要的是一种创建默认文件名的方法,其中包含 .csv

这是执行此操作的 csv 下载按钮的修改版本。

def st_pandas_to_csv_download_link(_df:pd.DataFrame, file_name:str = "dataframe.csv"): 
    csv_exp = _df.to_csv(index=False)
    b64 = base64.b64encode(csv_exp.encode()).decode()  # some strings <-> bytes conversions necessary here
    href = f'<a href="data:file/csv;base64,{b64}" download="{file_name}" > Download Dataframe (CSV) </a>'
    st.markdown(href, unsafe_allow_html=True)

st_pandas_to_csv_download_link(X, file_name = "my_file.csv")

href = 行上进行了更改。我已将 download= 添加到 link 以定义下载的文件名。我从this stack overflow thread

扫了一眼