Search code examples
pythoncallbackplotly-dashattributeerror

AttributeError - 'Div' object has no attribute 'set_index'


I am trying to run this code:

def parse_data(contents, filename):
    content_type, content_string = contents.split(',')

    decoded = base64.b64decode(content_string)
    try:
        if 'csv' in filename:
            # Assume that the user uploaded a CSV or TXT file
            df = pd.read_csv(
                io.StringIO(decoded.decode('utf-8')))
        elif 'xls' in filename:
            # Assume that the user uploaded an excel file
            df = pd.read_excel(io.BytesIO(decoded))
        elif 'txt' or 'tsv' in filename:
            # Assume that the user upl, delimiter = r'\s+'oaded an excel file
            df = pd.read_csv(
                io.StringIO(decoded.decode('utf-8')), delimiter = r'\s+')
    except Exception as e:
        print(e)
        return html.Div([
            'There was an error processing this file.'
        ])

    return df

def update_graph(contents, filename):
    fig = {
        'layout': go.Layout(
            plot_bgcolor=colors["graphBackground"],
            paper_bgcolor=colors["graphBackground"])
    }

    if contents:
        contents = contents[0]
        filename = filename[0]
        df = parse_data(contents, filename)
        df = df.set_index(df.columns[0])
        fig['data'] = df.iplot(asFigure=True, kind='scatter', mode='lines+markers', size=1)


    return fig

And get this error:

Traceback (most recent call last):
  File "/Users/.../PycharmProjects/pythonProject2/main.py", line 93, in update_graph
    df = df.set_index(df.columns[0])
AttributeError: 'Div' object has no attribute 'set_index'

Any ideas what might be wrong? Thanks a lot!


Solution

  • All problem is with your parse_data(). If it can't read file then it runs return html.Div() so running df = parse_data() means df = html.Div() and later you don't check if you really get data in df and df.set_index() means html.Div().set_index().

    Maybe better use return None and check this after df = parse_data()

    def parse_data(contents, filename):
        # ... code ...
    
        try:
    
           # ... code ...
    
        except Exception as e:
            print(e)
            return None
    
        return df
    

    and later

        df = parse_data(contents, filename)
    
        if df is None:
            html.Div(['There was an error processing this file.'])
        else:
            df = df.set_index(df.columns[0])
            fig['data'] = df.iplot(asFigure=True, kind='scatter', mode='lines+markers', size=1)
    

    But this still can have problem with fig['data'] when it can't read file.

    I can't test your code but maybe it should do assign Div to fig['data']

    if df is None:
        fig['data'] = html.Div(['There was an error processing this file.'])
    else:
        df = df.set_index(df.columns[0])
        fig['data'] = df.iplot(asFigure=True, kind='scatter', mode='lines+markers', size=1)