如何将Jupyter Lab生成的Excel文件下载到本地系统下载文件夹?
解决Jupyter Lab生成Excel文件直接下载到本地下载文件夹的问题
你遇到的问题核心在于:当Jupyter Lab运行在远程服务器(或容器)中时,os.path.expanduser("~")指向的是服务器端的用户目录,而非你本地电脑的下载文件夹,所以文件会被存在服务器上,无法直接同步到本地。要让文件下载到每个用户自己的本地Downloads文件夹,需要通过浏览器触发下载,把文件从服务器传输到客户端。
下面提供两种可行的实现方式:
方法一:使用ipywidgets的FileDownload组件(推荐)
这个方法直观易用,生成一个可点击的下载按钮,用户点击后文件会自动下载到本地默认下载目录。
修改后的代码如下:
import pandas as pd import numpy as np import xlsxwriter from io import BytesIO from ipywidgets import FileDownload from IPython.display import display def create_dataframes(): df = pd.DataFrame(np.array([["A", 2021, 200, 400], ["B", 2020, 600, 300], ["A", 2021, 500, 250], ["B", 2030, 350, 432], ["C", 2022, 250, 532], ["C", 2022, 150, 232],]), columns=['Category', 'Year', 'Value_1', 'Value_2']) df1 = pd.DataFrame(np.array([["D", 2021, 200, 400], ["D", 2020, 600, 300], ["B", 2021, 500, 250], ["B", 2020, 350, 432], ["C", 2022, 250, 532], ["C", 2022, 150, 232],]), columns=['Category', 'Year', 'Value_1', 'Value_2']) # 将Excel文件写入内存缓冲区,而非本地文件 output = BytesIO() with pd.ExcelWriter(output, engine='xlsxwriter') as writer: df.to_excel(writer, sheet_name='A') df1.to_excel(writer, sheet_name='C') # 重置缓冲区指针到起始位置 output.seek(0) # 创建并显示下载按钮 download_btn = FileDownload(output, filename="test_output.xlsx") display(download_btn) # 调用函数生成下载按钮 create_dataframes()
方法二:使用HTML生成下载链接
如果不想依赖ipywidgets,可以用HTML的a标签生成下载链接,利用data URI实现浏览器直接下载:
import pandas as pd import numpy as np import xlsxwriter from io import BytesIO from IPython.display import HTML import base64 def create_dataframes(): df = pd.DataFrame(np.array([["A", 2021, 200, 400], ["B", 2020, 600, 300], ["A", 2021, 500, 250], ["B", 2030, 350, 432], ["C", 2022, 250, 532], ["C", 2022, 150, 232],]), columns=['Category', 'Year', 'Value_1', 'Value_2']) df1 = pd.DataFrame(np.array([["D", 2021, 200, 400], ["D", 2020, 600, 300], ["B", 2021, 500, 250], ["B", 2020, 350, 432], ["C", 2022, 250, 532], ["C", 2022, 150, 232],]), columns=['Category', 'Year', 'Value_1', 'Value_2']) output = BytesIO() with pd.ExcelWriter(output, engine='xlsxwriter') as writer: df.to_excel(writer, sheet_name='A') df1.to_excel(writer, sheet_name='C') output.seek(0) # 将文件内容编码为base64,生成下载链接 b64_content = base64.b64encode(output.read()).decode() download_link = f'<a href="data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,{b64_content}" download="test_output.xlsx">点击下载Excel文件</a>' display(HTML(download_link)) create_dataframes()
关键说明
- 两种方法都是先把Excel文件写入内存的
BytesIO对象,避免在服务器端创建文件; - 通过浏览器的下载机制,直接把内存中的文件传输到用户本地,兼容本地和远程Jupyter Lab场景,每个用户点击后都会下载到自己电脑的默认下载文件夹;
- 若你是在本地运行Jupyter Lab(服务器就是自己的电脑),也可以直接用
os.path.expanduser("~/Downloads/test_output.xlsx")作为pd.ExcelWriter的路径,但这种方法仅适用于本地场景。
内容的提问来源于stack exchange,提问作者Green Finance
相关产品推荐
相关产品推荐

