Databricks Notebook中使用dbutils.fs.cp复制目录失败
问题:dbutils.fs.cp从DBFS复制文件到本地目录后为空
代码与错误信息
用户代码:
# Define the base directory on DBFS and local directories dbfs_base_dir = 'dbfs:/FileStore/tables/cnh_dataset/' local_base_dir = '/tmp/cnh_dataset/' # Create the local directories if they don't exist os.makedirs(local_base_dir + 'train', exist_ok=True) os.makedirs(local_base_dir + 'val', exist_ok=True) # Copy data from DBFS to local directories dbutils.fs.cp(dbfs_base_dir + 'train/', local_base_dir + 'train/', recurse=True) # Updated paths dbutils.fs.cp(dbfs_base_dir + 'val/', local_base_dir + 'val/', recurse=True) # Updated paths # Print the contents of the local directory after the copy operation print("Contents of /tmp/cnh_dataset/train:", os.listdir('/tmp/cnh_dataset/train')) # Check that the expected folder structure is present print("Files in /tmp/cnh_dataset/train:", os.listdir(local_base_dir + 'train')) print("Files in /tmp/cnh_dataset/val:", os.listdir(local_base_dir + 'val'))
执行后错误:
Contents of /tmp/cnh_dataset/train: [] Files in /tmp/cnh_dataset/train: [] Files in /tmp/cnh_dataset/val: [] FileNotFoundError: Couldn't find any class folder in /tmp/cnh_dataset/train.
核心原因
你踩了Databricks的常见坑:dbutils.fs默认把绝对路径解析为DBFS路径,而非集群节点的本地文件系统路径。当你直接写/tmp/cnh_dataset/train作为目标时,dbutils.fs.cp实际是把文件复制到了DBFS的/tmp/cnh_dataset/train目录,而非Notebook所在驱动节点的本地/tmp——这就是os.listdir查看本地目录为空的原因。
修正方案
访问集群本地文件系统必须给路径加file://前缀,修正后的代码如下:
import os # Define the base directory on DBFS and local directories dbfs_base_dir = 'dbfs:/FileStore/tables/cnh_dataset/' # 本地路径添加file://前缀供dbutils.fs使用 local_base_dir = 'file:///tmp/cnh_dataset/' # 原生os模块操作本地目录用不带前缀的路径 local_os_base_dir = '/tmp/cnh_dataset/' # 创建本地目录 os.makedirs(local_os_base_dir + 'train', exist_ok=True) os.makedirs(local_os_base_dir + 'val', exist_ok=True) # 执行复制 dbutils.fs.cp(dbfs_base_dir + 'train/', local_base_dir + 'train/', recurse=True) dbutils.fs.cp(dbfs_base_dir + 'val/', local_base_dir + 'val/', recurse=True) # 验证本地目录内容 print("Contents of /tmp/cnh_dataset/train:", os.listdir('/tmp/cnh_dataset/train')) print("Files in /tmp/cnh_dataset/train:", os.listdir(local_os_base_dir + 'train')) print("Files in /tmp/cnh_dataset/val:", os.listdir(local_os_base_dir + 'val'))
额外验证步骤
- 先确认DBFS源路径有文件:
dbutils.fs.ls(dbfs_base_dir + 'train/')
如果输出为空,说明源路径本身无数据,需先排查DBFS上的文件是否存在。
- 复制后也可以用
dbutils.fs查看本地路径(带file://)确认结果:
dbutils.fs.ls(local_base_dir + 'train/')
内容的提问来源于stack exchange,提问作者Ericson Willians
相关产品推荐
相关产品推荐

