Загрузите CSV из ноутбука iPython

Я запустил сервер iPython Notebook и хотел бы, чтобы пользователи могли загружать фреймворк pandas в виде файла csv, чтобы они могли использовать его в своей собственной среде. Там нет личных данных, поэтому, если решение предполагает запись файла на сервере (что я могу сделать), а затем загрузка этого файла, я был бы доволен этим.

Ответ 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../../*

Надеюсь, поможет..