【发布时间】:2021-11-07 02:17:39
【问题描述】:
我正在尝试为我的 streamlit 应用程序创建下载功能。但是我目前拥有的内容允许我通过我的 streamlit 应用程序上的一个按钮下载一个 zip 文件,但不幸的是它也将它保存到我的本地文件夹中。我不希望它保存到我的本地文件夹。问题是当我初始化 file_zip 对象时。我希望具有特定名称的 zip 文件最好与用户上传的带有“.zip”扩展名的文件的名称相同(即包含字符串文件名作为函数参数的数据文件)。但每次我这样做时,它都会将 zip 文件保存在我的本地文件夹中。有没有替代方案?顺便说一句,我正在尝试将 pandas 数据框列表保存到一个 zip 文件中。
def downloader(list_df, datafile, file_type):
file = datafile.name.split(".")[0]
#create zip file
with zipfile.ZipFile("{}.zip".format(file), 'w', zipfile.ZIP_DEFLATED) as file_zip:
for i in range(len(list_df)):
file_zip.writestr(file+"_group_{}".format(i)+".csv", pd.DataFrame(list_df[i]).to_csv())
file_zip.close()
#pass it to front end for download
zip_name = "{}.zip".format(file)
with open(zip_name, "rb") as f:
bytes=f.read()
b64 = base64.b64encode(bytes).decode()
href = f'<a href=\"data:file/zip;base64,{b64}\" download="{zip_name}">Click Here To Download</a>'
st.markdown(href, unsafe_allow_html=True)
【问题讨论】:
-
请使用一些示例 zip 文件名更新您的问题,并使用您希望它们保存到的确切位置。
-
no where local .. 因为我在我的 streamlit 应用程序中创建了一个按钮来让用户下载文件。我尝试使用 io.BytesIO 替换给定的路径,但它没有写入 csv 文件。
-
我想我误解了这个问题——你想在服务器端创建一个 zip 文件而不是让用户下载它?而且您不希望在服务器文件夹中创建它?你想去哪里呢?仅在 RAM 中(直到下载完成)? /tmp 文件夹怎么样?
-
您是说要将 zip 文件写入其他文件夹吗?还是根本不写?使用
io.BytesIO时,“不写csv”是什么意思? CSV 应写入 bytesio 缓冲区,但您必须seek(0)再次读取。 -
@LevM。是的,这就是我只想在 RAM 中做的事情,直到它完成