Using uploaded file in another python file in multipage

I have the following setup, where in the pages folder I have 2 python files:

pages
   |___ upload.py
   |___ app.py

I would like to use the data frame which I already cached in upload.py and use it in app.py. See the code from upload.py:

upload_csv = st.sidebar.file_uploader('Upload file(s) here!')
@st.experimental_memo
def readCSV(upload_file):
    if upload_file is not None:
        try:
            df = pd.read_csv(upload_file)
        except UnicodeDecodeError:
            df = pd.read_csv(upload_file, encoding='cp1252')
            df.drop(index=df.index[0], axis=0, inplace=True)
            df.reset_index(drop=True, inplace=True)
        except Exception:
            pass
            print('The file type is not recognised. Please upload CSV file!')
        return df

In app.py, I would like to import readCSV function and use the df for further processing.
Here is my attempt in app.py, which didn’t work.

df = readCSV(upload_csv)

Also, I don’t know how to import the upload.py module inside app.py. I read the suggestions about creating __init__.py in the same pages folder, but in that case it appears on my web interface as init which I don’t want.
Appreciate any help.

Use st.session_state to share data across modules.

1 Like

Thanks for the hint.
Can anyone help me to understand why the following code returns None?

import streamlit as st
import pandas as pd

upload_csv = st.sidebar.file_uploader('Upload file(s) here!')

@st.experimental_memo
def uploadFile(upload_file):
    if upload_file is not None:
        try:
            df = pd.read_csv(upload_file)
        except UnicodeDecodeError:
            df = pd.read_csv(upload_file, encoding='cp1252')
            df.drop(index=df.index[0], axis=0, inplace=True)
            df.reset_index(drop=True, inplace=True)
        except Exception:
            pass
            print('The file type is not recognised. Please upload CSV file!')
        return df   

df = uploadFile(upload_csv)

if 'df' not in st.session_state:    
    st.session_state['df'] = df

st.write(st.session_state.df)

If I simply try st.write(df) then it returns the df, but st.write(st.session_state.df) returns None.

Because st.session_state['df'] is assigned None in the first run and, in subsequent runs, 'df' not in st.session_state evaluates to False.

Maybe you should be unconditionally assigning st.session_state['df'] = df?

Thanks @Goyo
It worked when I removed the condition. In my understanding, I thought I was checking if ‘df’ exists in st.session_state dictionary, and if not, I am adding ‘df’ as a key, and df as a value. I didn’t think of it returning False.
Thanks :slight_smile: