2015-08-08 140 views
10

我运行iPython Notebook服务器,并希望用户能够将熊猫数据框下载为csv文件,以便他们可以在自己的环境中使用它。没有个人数据,所以如果解决方案涉及将文件写入服务器(我可以这样做)然后下载该文件,我会很高兴。从iPython笔记本下载CSV

+0

我不认为IPython中具有任何功能来解决你在问什么,但你总是代码Python中的例程执行下载,并将其包含在用户的笔记本中。只是一个想法。希望能帮助到你。 – lrnzcig

+0

谢谢lrnzcig:这就是它对我的看法。我可以尝试你的建议。 –

+0

嗨,是否可以使用'pd.to_csv()'将数据框写入csv,然后直接从ipython服务器打开csv,然后选择file> Download? – johnchase

回答

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

如何使用从IPython中的Filelinks类?我使用它来直接从Jupyter笔记本提供数据访问。假设你的数据在数据帧大熊猫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'需要可供笔记本用户使用。

3

如果你想避免在服务器上存储的CSV,您可以使用在客户端创建CSV此Javascript替代:

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字符串数据帧并在一个小型的js脚本中使用它,并打开一个保存对话框将其保存在用户计算机上。我在我的iPython env中测试过,它的功能就像一个魅力!


请注意,我正在逃避\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中打破可变字符串。

+0

我收到Javascript错误添加输出! SyntaxError:missing;在声明之前 查看您的浏览器Javascript控制台了解更多详情。 – AlexLordThorsen

1

对于您可以使用下面的代码不会太大表:

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)