如何在Databricks Python笔记本中读取DBFS内的多个.csv文件
问题根源
Python标准库的glob模块无法识别dbfs:/开头的Databricks文件系统协议路径,执行glob.glob时会返回空列表,li为空列表时执行pd.concat就会抛出你遇到的ValueError: No objects to concatenate报错。
你可以单独读取单个文件是因为Databricks对pandas的文件读取接口做了专属适配,支持直接传入dbfs:/开头的路径。
解决方案
方案1:替换路径为本地挂载格式(无需修改原有代码逻辑)
Databricks运行节点会默认将DBFS文件系统挂载到本地/dbfs目录下,glob可以正常识别该本地路径格式,只需修改路径前缀即可:
# 仅修改路径前缀,将dbfs:/替换为/dbfs/ path = r'/dbfs/FileStore/shared_uploads/path/' all_files = glob.glob(path + "/*.csv") li = [] for filename in all_files: df = pd.read_csv(filename, index_col=None, header=0, low_memory=False) li.append(df) data = pd.concat(li, axis=0, ignore_index=True)
方案2:使用Databricks原生工具遍历文件(推荐)
用Databricks内置的dbutils.fs.ls接口遍历DBFS路径,原生支持dbfs:/协议,兼容性更好:
path = r'dbfs:/FileStore/shared_uploads/path/' # 遍历路径下所有csv文件 all_files = [f.path for f in dbutils.fs.ls(path) if f.name.endswith('.csv')] li = [] for filename in all_files: df = pd.read_csv(filename, index_col=None, header=0, low_memory=False) li.append(df) data = pd.concat(li, axis=0, ignore_index=True)
方案3:用Spark批量读取(适合大文件/多文件场景)
如果csv文件数量多、总数据量大,直接用Spark并行读取后转pandas,性能远高于循环读取单个文件:
# 批量读取路径下所有csv文件 spark_df = spark.read.csv("dbfs:/FileStore/shared_uploads/path/*.csv", header=True, inferSchema=True) # 单节点内存足够容纳全量数据时可转pandas DataFrame data = spark_df.toPandas()
内容的提问来源于stack exchange,提问作者Vladislava Gonchar
相关产品推荐
相关产品推荐

