Search code examples
pythonpycharmstreamlit

File doesnt exist error before user inputs file name


I am working with streamlit in python to produce a tool that takes a user's input of a csv filename, and then carries out cleaning/tabulating of the data within the file.

I have encountered an issue where before the user has entered their filename, my streamlit site shows a "FileNotFoundError: [Errno 2] No such file or directory:"

This is expected because the user has not entered their filename yet - however once filename is entered the code runs smoothly. I am hoping to overcome this issue but as a relative newcomer to Python I am quite unsure how!

Please see code snippet below

autocall_gbp_file = str(st.text_input("Please type in your Autocall File Name (GBP)"))

filepath = M:/Desktop/AutomationProject/

express_gbp = pd.read_csv(filepath + autocall_gbp_file + ".csv")

st.write('Saved!')

The exact error I get before any user input has been taken is:

FileNotFoundError: [Errno 2] No such file or directory: 
'M:/Desktop/AutomationProject/.csv'
Traceback:
File "C:\Users\adavie18\.conda\envs\projectenv\lib\site- 
packages\streamlit\scriptrunner\script_runner.py", line 475, in 
_run_script
    exec(code, module.__dict__)
File "M:\Desktop\AutomationProject\AutocallApp.py", line 179, in 
    <module>
    express_gbp = pd.read_csv(filepath+autocall_gbp_file+".csv")
File "C:\Users\adavie18\.conda\envs\projectenv\lib\site- 
 packages\pandas\util\_decorators.py", line 311, in wrapper
return func(*args, **kwargs)
 File "C:\Users\adavie18\.conda\envs\projectenv\lib\site- 
   packages\pandas\io\parsers\readers.py", line 680, in read_csv
 return _read(filepath_or_buffer, kwds)
File "C:\Users\adavie18\.conda\envs\projectenv\lib\site- 
    packages\pandas\io\parsers\readers.py", line 575, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
File "C:\Users\adavie18\.conda\envs\projectenv\lib\site- 
    packages\pandas\io\parsers\readers.py", line 933, in __init__
self._engine = self._make_engine(f, self.engine)
File "C:\Users\adavie18\.conda\envs\projectenv\lib\site- 
    packages\pandas\io\parsers\readers.py", line 1217, in _make_engine
  self.handles = get_handle(  # type: ignore[call-overload]
File "C:\Users\adavie18\.conda\envs\projectenv\lib\site- 
    packages\pandas\io\common.py", line 789, in get_handle
  handle = open(

Thanks in advance to anyone who can offer a suggestion!


Solution

  • The general pattern for both Streamlit and Python in general is to test for the value existing:

    
    if autocall_gbp_file:
        express_gbp = pd.read_csv(filepath + autocall_gbp_file + ".csv")
    

    When the Streamlit app runs before a user inputs something, the value of autocall_gbp_file is None. By writing if autocall_gbp_file:, you're only running the pandas read_csv after someone has entered a value.

    Separately, you're better off developing this with st.file_uploader than using text_input, as the Streamlit app doesn't necessarily have access to the user filesystem and same drive mapping as the machine you are developing on. By using st.file_uploader, you're literally providing the actual file, not a reference to where it might be located.