我运行一个iPython Notebook服务器,并希望用户能够将pandas数据帧下载为csv文件,以便他们可以在自己的环境中使用它。没有个人数据,所以如果解决方案涉及在服务器上写文件(我可以做)然后下载该文件,我会对此感到满意。
答案 0 :(得分:21)
如何使用IPython中的FileLinks类?我使用它来直接从Jupyter笔记本中访问数据。假设您的数据位于pandas dataframe p_df:
中from IPython.display import FileLink, FileLinks
p_df.to_csv('/path/to/data.csv', index=False)
p_df.to_excel('/path/to/data.xlsx', index=False)
FileLinks('/path/to/')
将其作为笔记本电脑单元运行,结果将是可直接从笔记本电脑下载文件的链接列表。当然,笔记本用户需要可以访问'/path/to'
。
答案 1 :(得分:9)
对于不太大的表,您可以使用以下代码:
import base64
import pandas as pd
from IPython.display import HTML
def create_download_link( df, title = "Download CSV file", filename = "data.csv"):
csv = df.to_csv()
b64 = base64.b64encode(csv.encode())
payload = b64.decode()
html = '<a download="{filename}" href="data:text/csv;base64,{payload}" target="_blank">{title}</a>'
html = html.format(payload=payload,title=title,filename=filename)
return HTML(html)
df = pd.DataFrame(data = [[1,2],[3,4]], columns=['Col 1', 'Col 2'])
create_download_link(df)
答案 2 :(得分:3)
如果您想避免在服务器上存储CSV,您可以使用此Javascript替代方案在客户端创建CSV:
from IPython.display import Javascript
js_download = """
var csv = '%s';
var filename = 'results.csv';
var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
if (navigator.msSaveBlob) { // IE 10+
navigator.msSaveBlob(blob, filename);
} else {
var link = document.createElement("a");
if (link.download !== undefined) { // feature detection
// Browsers that support HTML5 download attribute
var url = URL.createObjectURL(blob);
link.setAttribute("href", url);
link.setAttribute("download", filename);
link.style.visibility = 'hidden';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
}
""" % data_in_dataframes.to_csv(index=False).replace('\n','\\n').replace("'","\'")
Javascript(js_download)
基本上,它从pd数据帧在python中创建一个CSV字符串,并在creates a CSV file on the client side的小js脚本中使用它,并打开一个保存对话框将其保存在用户计算机上。我在我的iPython环境中进行了测试,它就像一个魅力!
请注意,我正在逃避\n
。如果我不这样做,js脚本字符串将在多行上写入CSV变量。
例如,print "var csv = '%s'" % industries_revenues.to_csv(index=False).replace('\n','\\n')
会产生这样的结果:
var csv = 'Industry,sum_Amount\nBanking,65892584.0\n(...)Finance,20211917.0\n'
而不是print "var csv = '%s'" % industries_revenues.to_csv(index=False)
没有\n
转义导致多行且因此错误的javascript:
var csv = 'Industry,sum_Amount
Banking,65892584.0
(...)
Finance,20211917.0
'
我也逃避'
不要破坏javascript中的变量字符串。
答案 3 :(得分:1)
您可以使用笔记本可以显示对象和数据网址的html这一事实,以使csv的内容可下载:
import urllib
class CSV(object):
def _repr_html_(self):
html = []
html.append("{},{},{}".format(
"user",
"age",
"city"
)
)
html.append("{},{},{}".format(
"Alice",
"39",
"New York"
)
)
html.append("{},{},{}".format(
"Bob",
"30",
"Denver"
)
)
html.append("{},{},{}".format(
"Carol",
"27",
"Tulsa"
)
)
export = '\n'.join(html)
export = urllib.quote(export.encode("utf-8"))
csvData = 'data:application/csv;charset=utf-8,' + export
return "<a download='export.csv' href='{}' target='_blank'>csv file</a>".format(csvData)
CSV()
答案 4 :(得分:0)
从jupyter笔记本中下载所有文件的简单方法就是使用此妙用命令
!tar cvfz my_compressed_file_name.tar.gz *
这将下载服务器的所有文件,包括笔记本。
如果服务器有多个文件夹,则您可能愿意使用以下命令。在目录的每一步中,在*之前写../。
tar cvfz zipname.tar.gz ../../*
希望有帮助。
答案 5 :(得分:0)
根据Coen Jonker的回答创建一个csv下载链接的功能。
该功能具有可选的删除提示,因此您可以在下载后删除文件以保持笔记本服务器的清洁。
def csv_download_link(df, csv_file_name, delete_prompt=True):
"""Display a download link to load a data frame as csv from within a Jupyter notebook"""
df.to_csv(csv_file_name, index=False)
from IPython.display import FileLink, FileLinks
display(FileLink(csv_file_name))
if delete_prompt:
a = input('Press enter to delete the file after you have downloaded it.')
import os
os.remove(csv_file_name)
# Diplay download link:
csv_download_link(df, 'file_name.csv')
答案 6 :(得分:0)
我发现的简单方法是:
df.to_csv('~/Desktop/file_name.csv')