Download CSV from an iPython Notebook

后端 未结 6 1028
一个人的身影
一个人的身影 2020-12-02 23:17

I run an iPython Notebook server, and would like users to be able to download a pandas dataframe as a csv file so that they can use it in their own environment. There\'s no

6条回答
  •  心在旅途
    2020-12-02 23:33

    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.

提交回复
热议问题