从iPython Notebook下载CSV

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)

  • 真好!大文件呢?:) (2认同)

小智 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)