0

我一定遗漏了一些关于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小部件而变化,并且我可以看到每次更新后数据都不同。

但是,一旦我选择了一个文件,就会出现两个问题。首先,没有加载数据。其次,专栏停止对我的互动做出反应。

谁能告诉我我的问题是什么?

4

1 回答 1

1

上面代码中的问题是datafile函数中的变量f不是文件名而是文件内容,作为字节字符串。由于该错误,该函数会引发未处理的异常,不幸的是,该异常并未在任何地方注册。

因此,数据读取线应该是

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

于 2020-02-09T08:06:12.080 回答