Azure Databricks中Python查找tables目录文件报FileNotFoundError
问题场景
我在使用Microsoft Azure Databricks服务时,需要读取名为tables的文件夹下的文件,对应界面文件展示如下:
同一段文件遍历代码在Windows 10本地的PyCharm环境可以正常运行,迁移到Databricks环境后执行失败。
测试代码
import os from os.path import isfile, join working_dir = os.getcwd() print(f"working dir = {working_dir}") mypath = f"{working_dir}/tables" files = [f for f in os.listdir(mypath) if isfile(join(mypath, f))] for file in files: print(f"{file}")
运行结果对比
- Windows 10 PyCharm环境正常输出:
C:\Users\bruker\PycharmProjects\test\venv\Scripts\python.exe C:/Users/bruker/PycharmProjects/test/test.py working dir = C:\Users\bruker\PycharmProjects\test 1 2
- Databricks环境报错:
working dir = /databricks/driver FileNotFoundError: [Errno 2] No such file or directory: '/databricks/driver/tables'
我已经在Databricks界面确认目标文件存在,当前脚本从db-adapter路径运行:
回答
报错原因
核心问题是混淆了Databricks的两套独立文件系统:
- Python原生
os模块默认操作集群驱动节点的本地磁盘,os.getcwd()返回的/databricks/driver就是本地磁盘的当前工作目录 - Databricks UI文件浏览器里展示的文件默认存放在DBFS分布式文件系统中,和驱动节点本地磁盘是完全隔离的,代码去本地磁盘找存在DBFS里的
tables文件夹,自然会报文件不存在
本地Windows环境没有这种文件系统隔离,tables文件夹和脚本在同一磁盘目录下,所以代码可以正常运行。
解决方案
根据文件实际存放位置选择对应方法即可:
方案1:文件存放在DBFS(当前场景)
两种实现方式:
- 用Databricks原生
dbutils工具操作(推荐,全运行时版本兼容):
# 替换为你的tables文件夹实际DBFS路径 mypath = "dbfs:/tables" # 遍历路径,过滤掉子文件夹,只保留文件 files = [f.name for f in dbutils.fs.ls(mypath) if not f.isDir()] for file in files: print(file)
- 保留原有
os模块写法,使用DBFS的本地挂载前缀:
import os from os.path import isfile, join # DBFS默认挂载在本地磁盘的/dbfs路径下 mypath = "/dbfs/tables" files = [f for f in os.listdir(mypath) if isfile(join(mypath, f))] for file in files: print(file)
注意:部分定制版Databricks运行时可能禁用
/dbfs挂载点,如果该方法报错直接换dbutils方案即可。
方案2:文件随脚本存放在工作区目录
如果tables文件夹是和脚本一起上传到工作区db-adapter路径下,没有存到DBFS,直接把整个tables文件夹上传到驱动节点的/databricks/driver目录,原有代码不需要修改就能直接运行。
内容的提问来源于stack exchange,提问作者Europa
相关产品推荐
相关产品推荐

