Download CSV from an iPython Notebook

谁说我不能喝 提交于 2019-11-30 08:13:53
Coen Jonker

How about using the FileLinks class from IPython? I use this to provide access to data directly from Jupyter notebooks. Assuming your data is in 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 this as a notebook cell and the result will be a list of links to files downloadable directly from the notebook. '/path/to' needs to be accessible for the notebook user of course.

For not too large tables you can use the following code:

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)
Kim C.

If you want to avoid storing CSVs on the server, you can use this Javascript alternative that create the CSV on the client-side:

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)

Basically, it creates a CSV string in python from the pd dataframe and use it in a small js script that creates a CSV file on the client side and open a saving dialog to save it on the user computer. I tested in my iPython env and it works like a charm!


Note that I am escaping the \n. If I don't do so, the js script string will have the CSV variable written on multiple lines.

For example, print "var csv = '%s'" % industries_revenues.to_csv(index=False).replace('\n','\\n') results to this:

var csv = 'Industry,sum_Amount\nBanking,65892584.0\n(...)Finance,20211917.0\n'

Instead of print "var csv = '%s'" % industries_revenues.to_csv(index=False) without the \n escaping that results on a multiple lined and therefore errored javascript:

var csv = 'Industry,sum_Amount
Banking,65892584.0
(...)
Finance,20211917.0
'

I also escape the ' not to break the variable string in javascript.

You can use the fact that the notebook can display html for objects, and data urls, to make the content of a csv downloadable:

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()

My simple approach to download all the files from the jupyter notebook would be by simply using this wonderful command

!tar cvfz my_compressed_file_name.tar.gz *

This will download all the files of the server including the notebooks.

In case if your server has multiple folders, you might be willing to use the following command. write ../ before the * for every step up the directory.

tar cvfz zipname.tar.gz ../../*

Hope it helps..

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!