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:Usersadavie18.condaenvsprojectenvlibsite- packagesstreamlitscriptrunnerscript_runner.py", line 475, in _run_script exec(code, module.__dict__) File "M:DesktopAutomationProjectAutocallApp.py", line 179, in <module> express_gbp = pd.read_csv(filepath+autocall_gbp_file+".csv") File "C:Usersadavie18.condaenvsprojectenvlibsite- packagespandasutil_decorators.py", line 311, in wrapper return func(*args, **kwargs) File "C:Usersadavie18.condaenvsprojectenvlibsite- packagespandasioparsersreaders.py", line 680, in read_csv return _read(filepath_or_buffer, kwds) File "C:Usersadavie18.condaenvsprojectenvlibsite- packagespandasioparsersreaders.py", line 575, in _read parser = TextFileReader(filepath_or_buffer, **kwds) File "C:Usersadavie18.condaenvsprojectenvlibsite- packagespandasioparsersreaders.py", line 933, in __init__ self._engine = self._make_engine(f, self.engine) File "C:Usersadavie18.condaenvsprojectenvlibsite- packagespandasioparsersreaders.py", line 1217, in _make_engine self.handles = get_handle( # type: ignore[call-overload] File "C:Usersadavie18.condaenvsprojectenvlibsite- packagespandasiocommon.py", line 789, in get_handle handle = open(
Thanks in advance to anyone who can offer a suggestion!
Advertisement
Answer
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.