【问题标题】:how to save file as zip without saving it to local folder如何将文件另存为zip而不将其保存到本地文件夹
【发布时间】: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 中做的事情,直到它完成

标签: python zipfile streamlit


【解决方案1】:

听起来您想在内存中创建 zip 文件并稍后使用它来构建 base64 编码。您可以将io.BytesIO() 对象与ZipFile 一起使用,将其倒回,然后将数据读回以进行base64 编码。

import io

def downloader(list_df, datafile, file_type):

    file = datafile.name.split(".")[0]
    
    #create zip file
    zip_buf = io.BytesIO()
    with zipfile.ZipFile(zip_buf, '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())
    zip_buf.seek(0)
    
    #pass it to front end for download
    zip_name = "{}.zip".format(file)
    b64 = base64.b64encode(zip_buf.read()).decode()
    del zip_buf
    href = f'<a href=\"data:file/zip;base64,{b64}\" download="{zip_name}">Click Here To download</a>'
    st.markdown(href, unsafe_allow_html=True)

【讨论】:

    猜你喜欢
    • 2019-09-05
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多