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
相关产品推荐
相关产品推荐

