csv 如何连接 Dataframe 并下载为文件,而无需先创建临时文件?

ui7jx7zq  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(65)

我构建了一个streamlit应用程序,它需要以非常特定的格式创建一个csv文件。一个最小的例子看起来像这样:

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

def main():
    df1 = pd.DataFrame(np.random.randint(0, 100, size=(5, 4)))
    df2 = pd.DataFrame(np.random.randint(0, 100, size=(5, 4)))
    df3 = pd.DataFrame(np.random.randint(0, 100, size=(5, 4)))

    di = {'df1': df1, 'df2': df2, 'df3': df3}

    fn = 'export.csv'
    with open(fn, 'w+') as f:
        for k, v in di.items():
            f.write(f'{k}\n')
            v.to_csv(f, header=False, index=False)
            f.write('\n')

    with open(fn, 'rb') as file:
        st.download_button(
            'Download file',
            data=file,
            file_name=fn,
            mime='text/csv'
        )

if __name__ == "__main__":
    main()

字符串
在这个例子中,它看起来是这样的


的数据
虽然这是可行的,但我不喜欢我首先创建一个文件,我需要存储,以后再次打开它。
我怎样才能获得完全相同的输出,但不先创建此文件?我尝试使用v.to_string()通过字符串连接,但输出似乎是空格分隔的,而不是逗号分隔的。

643ylb08

643ylb081#

好吧,看来我是在正确的轨道上与字符串,但我仍然需要BytesIO;这段代码现在似乎可以用了:

import streamlit as st
import pandas as pd
import numpy as np
from io import BytesIO

def main():
    df1 = pd.DataFrame(np.random.randint(0, 100, size=(5, 4)))
    df2 = pd.DataFrame(np.random.randint(0, 100, size=(5, 4)))
    df3 = pd.DataFrame(np.random.randint(0, 100, size=(5, 4)))

    di = {'df1': df1, 'df2': df2, 'df3': df3}

    result_string = ""
    for key, df in di.items():
        result_string += f"{key}\n"
        result_string += df.to_csv(index=False, header=False)
        result_string += "\n"

    csv_bytes = BytesIO(result_string.encode())
    st.download_button(
        'Download file',
        data=csv_bytes,
        file_name='export.csv',
        mime='text/csv'
    )

if __name__ == "__main__":
    main()

字符串

相关问题