You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:01:48