Cargar archivos usando el botón de navegación en Jupyter y usarlos / guardarlos

Encontré este fragmento para cargar archivos en Jupyter, sin embargo, no sé cómo guardar este archivo en la máquina que ejecuta el código o cómo mostrar las primeras 5 líneas del archivo cargado. Básicamente, estoy buscando los comandos adecuados para acceder al archivo después de que se haya cargado:

import io from IPython.display import display import fileupload def _upload(): _upload_widget = fileupload.FileUploadWidget() def _cb(change): decoded = io.StringIO(change['owner'].data.decode('utf-8')) filename = change['owner'].filename print('Uploaded `{}` ({:.2f} kB)'.format( filename, len(decoded.read()) / 2 **10)) _upload_widget.observe(_cb, names='data') display(_upload_widget) _upload() 

Se llama a _cb cuando finaliza la carga. Como se describe en el comentario anterior, puede escribir en un archivo allí o almacenarlo en una variable. Por ejemplo:

 from IPython.display import display import fileupload uploader = fileupload.FileUploadWidget() def _handle_upload(change): w = change['owner'] with open(w.filename, 'wb') as f: f.write(w.data) print('Uploaded `{}` ({:.2f} kB)'.format( w.filename, len(w.data) / 2**10)) uploader.observe(_handle_upload, names='data') display(uploader) 

Una vez finalizada la carga, puede acceder al nombre de archivo como:

 uploader.filename 

Estoy trabajando en ML con el cuaderno Jupyter, y estaba buscando una solución para seleccionar los archivos locales que contienen los conjuntos de datos mediante la navegación entre el sistema de archivos local. Aunque, la pregunta aquí se refiere más a cargar que a seleccionar un archivo. Pongo aquí un fragmento que encontré aquí porque cuando buscaba una solución para mi caso particular, el resultado de la búsqueda me llevó varias veces hasta aquí.

 import os import ipywidgets as widgets class FileBrowser(object): def __init__(self): self.path = os.getcwd() self._update_files() def _update_files(self): self.files = list() self.dirs = list() if(os.path.isdir(self.path)): for f in os.listdir(self.path): ff = os.path.join(self.path, f) if os.path.isdir(ff): self.dirs.append(f) else: self.files.append(f) def widget(self): box = widgets.VBox() self._update(box) return box def _update(self, box): def on_click(b): if b.description == '..': self.path = os.path.split(self.path)[0] else: self.path = os.path.join(self.path, b.description) self._update_files() self._update(box) buttons = [] if self.files: button = widgets.Button(description='..', background_color='#d0d0ff') button.on_click(on_click) buttons.append(button) for f in self.dirs: button = widgets.Button(description=f, background_color='#d0d0ff') button.on_click(on_click) buttons.append(button) for f in self.files: button = widgets.Button(description=f) button.on_click(on_click) buttons.append(button) box.children = tuple([widgets.HTML("

%s

" % (self.path,))] + buttons)

Y para usarlo:

 f = FileBrowser() f.widget() #  # in a separate cell: f.path # returns the selected path 

Me tropecé en este hilo ~ 2 años tarde. Para aquellos que todavía están confundidos acerca de cómo trabajar con el widget fileupload, he desarrollado la excelente respuesta publicada por minrk con algunos otros ejemplos de uso a continuación.

 from IPython.display import display import fileupload uploader = fileupload.FileUploadWidget() def _handle_upload(change): w = change['owner'] with open(w.filename, 'wb') as f: f.write(w.data) print('Uploaded `{}` ({:.2f} kB)'.format( w.filename, len(w.data) / 2**10)) uploader.observe(_handle_upload, names='data') display(uploader) 

De la documentación del widget:

 class FileUploadWidget(ipywidgets.DOMWidget): '''File Upload Widget. This widget provides file upload using `FileReader`. ''' _view_name = traitlets.Unicode('FileUploadView').tag(sync=True) _view_module = traitlets.Unicode('fileupload').tag(sync=True) label = traitlets.Unicode(help='Label on button.').tag(sync=True) filename = traitlets.Unicode(help='Filename of `data`.').tag(sync=True) data_base64 = traitlets.Unicode(help='File content, base64 encoded.' ).tag(sync=True) data = traitlets.Bytes(help='File content.') def __init__(self, label="Browse", *args, **kwargs): super(FileUploadWidget, self).__init__(*args, **kwargs) self._dom_classes += ('widget_item', 'btn-group') self.label = label def _data_base64_changed(self, *args): self.data = base64.b64decode(self.data_base64.split(',', 1)[1]) 

Obtenga los datos en formato bytestring:

 uploader.data 

Obtenga los datos en una cadena regular de utf-8:

 datastr= str(uploader.data,'utf-8') 

Cree un nuevo dataframe de pandas desde la cadena utf-8 (por ejemplo, desde una entrada .csv):

 import pandas as pd from io import StringIO datatbl = StringIO(datastr) newdf = pd.read_table(datatbl,sep=',',index_col=None)