2015-08-08 16 views
10

Bir iPython Dizüstü bilgisayar sunucusu çalıştırıyorum ve kullanıcıların kendi ortamlarında kullanabilmeleri için bir panda veri dosyasını bir csv dosyası olarak indirmelerini istiyorum. Kişisel bir veri yok, bu yüzden eğer çözüm sunucuda dosya yazmayı içeriyorsa (ki bunu yapabilirim) ve o dosyayı indirirseniz, bundan memnun olurum.Bir iPython Dizüstü Bilgisayardan CSV'yi İndirme

+0

, ama her zaman gerçekleştirir Python rutin kodu yazabilirsiniz indirin ve kullanıcılarınız için not defterine ekleyin. Sadece bir fikir. Umarım yardımcı olur. – lrnzcig

+0

Teşekkürler lrnzcig: bana öyle görünüyor. Önerinizi deneyebilirim. –

+0

Merhaba, f pd.to_csv() 'ile bir csv'ye dataframe yazabilir ve daha sonra csv'yi doğrudan ipython sunucusundan açabilir ve daha sonra dosya> Download? – johnchase

cevap

1

Sen dizüstü nesneler için html görüntüleyebilir ve veri URL'ler, bir csv indirilebilir içeriğini yapmak gerçeğini kullanabilirsiniz:

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

Nasıl ipython dan FileLinks sınıfını kullanmaya ne dersiniz? Bunu doğrudan Jupyter notebook'lardan veriye erişim sağlamak için kullanıyorum. Verilerinizi varsayarsak pandalar dataframe p_df içinde: Bir defter hücre ve sonuç olarak

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/') 

çalıştırın bu dosyalara bağlantılar listesi olmak dizüstü doğrudan indirilebilir olacak. '/path/to', notebook kullanıcısı için elbette erişilebilir olmalıdır. sunucuda CSV'leri depolamak önlemek istiyorsanız

3

, istemci tarafında CSV oluşturmak bu Javascript alternatifi kullanabilirsiniz: Temelde

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) 

, bu pd gelen Python bir CSV dize oluşturur dataframe ve onu küçük bir js betiğinde creates a CSV file on the client side kullanın ve kullanıcı bilgisayarına kaydetmek için bir kaydetme diyaloğu açın. IPython env'de test ettim ve bir çekicilik gibi çalışıyor! Ben \n kaçan am


Not. Bunu yapmazsam, js komut dizisi CSV değişkenini birden çok satıra yazacaktır. Örneğin

Buna print "var csv = '%s'" % industries_revenues.to_csv(index=False).replace('\n','\\n') sonuçları:

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

Ben de ' değil kaçış: Bir çoklu astarlı ve bu nedenle Hatalı javascript üzerindeki sonuçları kaçan \n olmadan

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

yerine print "var csv = '%s'" % industries_revenues.to_csv(index=False) javascript'te değişken dizeyi kırmak için

+0

Çıkış ekleyerek Javascript hatası alıyorum! SyntaxError: missing; önce ifade Daha fazla bilgi için tarayıcınızın Javascript konsoluna bakın. – AlexLordThorsen

1
aşağıdaki kodu kullanabilirsiniz değil çok büyük tabloları için

: Ben ipython ne soran çözmek için herhangi bir özellik vardır sanmıyorum

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) 
İlgili konular