Я запустил сервер iPython Notebook и хотел бы, чтобы пользователи могли загружать фреймворк pandas в виде файла csv, чтобы они могли использовать его в своей собственной среде. Там нет личных данных, поэтому, если решение предполагает запись файла на сервере (что я могу сделать), а затем загрузка этого файла, я был бы доволен этим.
Загрузите CSV из ноутбука iPython
Ответ 1
Как насчет использования класса FileLinks из IPython? Я использую это для предоставления доступа к данным непосредственно из ноутбуков 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'
должен быть доступен для пользователя ноутбука, конечно.
Ответ 2
Для не слишком больших таблиц вы можете использовать следующий код:
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)
Ответ 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)
В принципе, он создает строку CSV в python из фрейма данных pd и использует его в небольшом js script, который создает CSV файл на стороне клиента и откройте диалоговое окно сохранения, чтобы сохранить его на компьютере пользователя. Я тестировал в своем iPython env, и он работает как шарм!
Обратите внимание, что я избегаю \n
. Если я этого не сделаю, строка js script будет иметь переменную 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.
Ответ 4
Вы можете использовать тот факт, что ноутбук может отображать 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()
Ответ 5
Мой простой подход к загрузке всех файлов с ноутбука jupyter был бы просто с помощью этой замечательной команды
!tar cvfz my_compressed_file_name.tar.gz *
Это позволит загрузить все файлы сервера, включая записные книжки.
Если на вашем сервере есть несколько папок, вы можете использовать следующую команду. пишите../перед * для каждого шага вверх по каталогу.
tar cvfz zipname.tar.gz../../*
Надеюсь, поможет..