Tom*_*lee 21 csv pandas ipython-notebook
我运行一个iPython Notebook服务器,并希望用户能够将pandas数据帧下载为csv文件,以便他们可以在自己的环境中使用它.没有个人数据,所以如果解决方案涉及在服务器上写入文件(我可以做),然后下载该文件,我会很高兴.
小智 25
如何使用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/')
Run Code Online (Sandbox Code Playgroud)
将其作为笔记本电脑单元运行,结果将是可直接从笔记本电脑下载文件的链接列表.'/path/to'当然,需要为笔记本用户访问.
小智 10
如果您想避免在服务器上存储 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)
Run Code Online (Sandbox Code Playgroud)
基本上,它从 pd 数据帧在 python 中创建一个 CSV 字符串,并在一个小的 js 脚本中使用它,该脚本在客户端创建一个 CSV 文件并打开一个保存对话框以将其保存在用户计算机上。我在我的 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'
Run Code Online (Sandbox Code Playgroud)
而不是print "var csv = '%s'" % industries_revenues.to_csv(index=False)没有\n转义导致多行并因此错误的javascript:
var csv = 'Industry,sum_Amount
Banking,65892584.0
(...)
Finance,20211917.0
'
Run Code Online (Sandbox Code Playgroud)
我也逃避了'不破坏javascript中的变量字符串。
小智 10
对于不太大的表,您可以使用以下代码:
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)
Run Code Online (Sandbox Code Playgroud)
小智 1
您可以利用笔记本可以显示对象的 html 和数据 url 的事实来使 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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22847 次 |
| 最近记录: |