0

I must be missing something basic about how FileInput widget works in pyviz panel.

In the following code, I let the user select a csv file and the number of rows to display. If a file isn't selected, I generate some random data.



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

Here's the problem. If I don't select a file and play with the head widget, the pane acts as expected: the number of displayed rows changes as I change the head widget, and I can see that the data is different after each update.

However, once I select a file, two problems occur. First, the data isn't loaded. Secondly, the column stops reacting to my interactions.

Can anybody tell me what my problem is?

Boris Gorelik
  • 29,945
  • 39
  • 128
  • 170

1 Answers1

1

The problem in the code above is that the datafile variable in function f is not a file name but the file contents, as a bytes string. Due to the error, the function throws an unhandled exception that, unfortunately, isn't registered anywhere.

Thus, the data reading line should be

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

Boris Gorelik
  • 29,945
  • 39
  • 128
  • 170
  • 1
    you can access the filename through datafile.filename, but this is only the filename not the directory/path of the file – Sander van den Oord Feb 09 '20 at 08:28
  • This almost works, and it is the right direction. Besides adding `import io` I had to do `data = pd.read_csv(io.BytesIO(datafile.value))` to properly load the file. – mic Nov 17 '21 at 23:01