Databricks Notebook代码报FileNotFoundError,原可行代码失效求因
代码在Databricks Notebook中失效的原因分析
问题场景
4年前可正常运行的Databricks Python代码,现在执行时抛出FileNotFoundError,报错提示找不到/dbfs/FileStore/NJ/file1.txt,且已确认目标目录存在。
原代码:
%python import pandas as pd from io import StringIO data = """ CODE,L,PS 5d8A,N,P60490 5d8b,H,P80377 5d8C,O,P60491 """ df = pd.read_csv(StringIO(data), sep=',') #print(df) df.to_csv('/dbfs/FileStore/NJ/file1.txt') pandas_df = pd.read_csv("/dbfs/FileStore/NJ/file1.txt", header='infer') print(pandas_df)
报错信息:
FileNotFoundError: [Errno 2] No such file or directory: '/dbfs/FileStore/NJ/file1.txt'
核心失效原因
1. DBFS FUSE挂载默认禁用
早期Databricks集群默认通过FUSE将DBFS挂载到节点本地的/dbfs路径,因此可以直接用本地文件路径方式读写。但后续版本(尤其是Serverless Runtime集群)默认关闭了FUSE挂载,此时直接访问/dbfs路径会找不到对应的文件系统。
2. 权限模型变更
即使目录存在,当前Notebook的执行身份(比如Workspace用户权限、集群IAM角色)可能没有对/FileStore/NJ路径的读写权限。Databricks后续加强了Workspace和DBFS的权限控制,原有的权限配置可能不再适用。
3. 文件同步延迟
df.to_csv通过本地路径写入时,虽然代码执行完成,但DBFS的文件同步可能存在异步延迟,导致立刻读取时文件还未完全同步到存储层,出现文件不存在的错误。
4. 大小写敏感问题
DBFS底层存储(如S3、ADLS)是大小写敏感的,若实际目录/文件名的大小写与代码中不一致(比如实际是/FileStore/nj/而代码写的是/FileStore/NJ/),也会触发找不到文件的错误。
验证与修复方案
验证FUSE挂载状态
在Notebook中执行以下命令,若报错则说明FUSE未挂载:
!ls /dbfs/FileStore/NJ
修复后的示例代码
改用Databricks原生的dbutils.fs工具或dbfs:/协议路径操作文件:
import pandas as pd from io import StringIO data = """ CODE,L,PS 5d8A,N,P60490 5d8b,H,P80377 5d8C,O,P60491 """ df = pd.read_csv(StringIO(data), sep=',') # 使用dbutils写入DBFS,支持覆盖已有文件 dbutils.fs.put("/FileStore/NJ/file1.txt", df.to_csv(index=False), overwrite=True) # 用dbfs:/协议路径读取文件,兼容FUSE未挂载的场景 pandas_df = pd.read_csv("dbfs:/FileStore/NJ/file1.txt", header='infer') print(pandas_df)
内容的提问来源于stack exchange,提问作者Ged
相关产品推荐
相关产品推荐

