使用Streamlit开发的Python待办App出现FileNotFoundError问题排查
问题:Streamlit待办App出现FileNotFoundError但文件实际存在,属于语法还是逻辑错误?
问题描述
我用Python的Streamlit框架开发了一款待办事项App,终端运行时一直报FileNotFoundError,但docs.txt文件确实存在。想问问这个问题属于语法错误还是逻辑错误?
to-dos.py
import streamlit as st import get_todos todos = get_todos.getTodos() def add_todos(): todo1 = st.session_state["new_todo"] + "\n" todos.append(todo1) get_todos.writeTodos(todos) st.title("My TO-DO App") ...
get_todos.py
def getTodos(): with open("docs.txt", "r") as file: data = file.readlines() return data def writeTodos(adder): with open("docs.txt", "w") as file: file.writelines(adder)
错误回溯信息
报错内容为FileNotFoundError: [Errno 2] No such file or directory: 'docs.txt',调用栈指向get_todos.py第2行的文件打开语句,随后追踪到to-dos.py第4行调用get_todos.getTodos()的位置。
项目结构
项目根目录下包含三个同级文件:to-dos.py、get_todos.py、docs.txt。
问题类型判断及原因分析
这个问题属于逻辑错误,并非语法错误:
- 语法错误是代码违反Python语法规则导致的启动失败,而你的代码能执行到文件读取步骤,说明语法完全合规。
- 报错核心原因是:Streamlit运行时的工作目录与项目根目录不一致。使用相对路径
"docs.txt"时,Python会从终端当前工作目录查找文件,而非脚本所在目录。如果启动Streamlit时终端不在项目根目录,就会找不到目标文件。
解决方法
修改get_todos.py,使用脚本所在目录的绝对路径定位docs.txt,避免工作目录差异的影响:
import os def getTodos(): # 获取当前脚本所在目录的绝对路径 script_dir = os.path.dirname(os.path.abspath(__file__)) file_path = os.path.join(script_dir, "docs.txt") with open(file_path, "r") as file: data = file.readlines() return data def writeTodos(adder): script_dir = os.path.dirname(os.path.abspath(__file__)) file_path = os.path.join(script_dir, "docs.txt") with open(file_path, "w") as file: file.writelines(adder)
内容的提问来源于stack exchange,提问作者Samik Pandit
相关产品推荐
相关产品推荐

