从iPython Notebook

时间:2015-08-08 14:08:19

标签: csv pandas ipython-notebook

我运行一个iPython Notebook服务器,并希望用户能够将pandas数据帧下载为csv文件,以便他们可以在自己的环境中使用它。没有个人数据,所以如果解决方案涉及在服务器上写文件(我可以做)然后下载该文件,我会对此感到满意。

7 个答案:

答案 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')