Панель Pyviz: не работает с виджетом FileInput

Мне, должно быть, не хватает чего-то базового о том, как виджет FileInput работает в панель pyviz.

В следующем коде я позволяю пользователю выбрать файл csv и количество отображаемых строк. Если файл не выбран, я генерирую случайные данные.



import pandas as pd; import numpy as np; import matplotlib.pyplot as plt
import panel as pn
import panel.widgets as pnw
pn.extension()
datafile = pnw.FileInput()
head  = pnw.IntSlider(name='head', value=3, start=1, end=60)

@pn.depends(datafile, head)
def f(datafile, head):
    if datafile is None:
        data = pd.DataFrame({'x': np.random.rand(10)})
    else:
        data = pd.read_csv(datafile)

    return pn.Column(f'## {head} first rows', data.head(head))

widgets   = pn.Column(datafile, head)
col = pn.Column(widgets, f)
col

Вот в чем проблема. Если я не выбираю файл и не играю с виджетом head, панель работает так, как ожидалось: количество отображаемых строк изменяется по мере того, как я меняю виджет head, и я вижу, что данные меняются после каждого обновления.

Однако, как только я выбираю файл, возникают две проблемы. Во-первых, данные не загружаются. Во-вторых, колонка перестает реагировать на мои взаимодействия.

Кто-нибудь может сказать мне, в чем моя проблема?


person Boris Gorelik    schedule 09.02.2020    source источник


Ответы (1)


Проблема в приведенном выше коде заключается в том, что переменная datafile в функции f - это не имя файла, а его содержимое в виде строки байтов. Из-за ошибки функция выдает необработанное исключение, которое, к сожалению, нигде не регистрируется.

Таким образом, строка чтения данных должна быть

data = pd.read_csv(io.BytesIO(datafile))

person Boris Gorelik    schedule 09.02.2020
comment
вы можете получить доступ к имени файла через datafile.filename, но это только имя файла, а не каталог / путь к файлу - person Sander van den Oord; 09.02.2020