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

Azure Databricks遍历DBFS子目录CSV统计列数报PosixPath不可迭代问题求助

问题修复方案

错误根因

  • 第二层循环直接遍历PosixPath对象触发不可迭代报错:Path()生成的路径对象本身不是可迭代结构,不能直接用for循环遍历子文件,且Databricks的DBFS路径使用原生dbutils.fs.ls遍历适配性更强,无需引入pathlib处理。
  • 原代码未提前初始化cols字典,运行过程中会触发变量未定义报错。

修复后可运行代码

# 提前初始化存储列数的字典
cols = {}
# 第一层遍历根目录下的所有条目
root_files = dbutils.fs.ls("dbfs:/mnt/adls/ib/har/")
for fi in root_files:
    # 只处理子目录(对应目录结构里的日期文件夹)
    if fi.isDir():
        print(f"正在处理子目录:{fi.path}")
        # 第二层遍历子目录下的所有文件
        sub_files = dbutils.fs.ls(fi.path)
        for fii in sub_files:
            # 筛选CSV文件
            if ".csv" in fii.path:
                df2 = spark.read.option("header","true").option("sep", ";").option("escape", "\"").csv(fii.path)
                col_names = df2.columns
                col_count = len(col_names)
                print(f"{fii.path} 有 {col_count} 列,列名为:{col_names}")
                cols[fii.path] = col_count

# 输出列数最多的文件信息
max_file_path = max(cols, key=cols.get)
max_col_count = cols[max_file_path]
print(f"列数最多的文件为:{max_file_path},共{max_col_count}列")

逻辑说明

  • 第一层遍历根目录时先判断条目是否为目录,过滤掉根目录下非目录的无关文件
  • 第二层直接用dbutils.fs.ls遍历子目录路径获取该目录下所有文件,完全适配DBFS路径规则,不会出现路径类型不兼容问题
  • 提前初始化字典避免变量未定义错误,补充了最终结果的打印输出方便查看

内容的提问来源于stack exchange,提问作者Ram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:18:03