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

Python如何读取多个子文件夹下的CSV文件并完成拼接合并

原代码问题点
  • 遍历逻辑错误:os.listdir()仅能获取指定路径下的一级条目,不会递归进入子文件夹查找文件,且返回值是不带路径的文件名,直接传入pd.read_csv()会触发文件不存在报错
  • 拼接逻辑错误:DataFrame.append()是pandas已弃用的实例方法,不支持传入生成器参数,原有写法不符合API调用规则
  • 缺少文件过滤:遍历过程没有筛选CSV后缀的文件,会将文件夹、其他格式文件传入读取逻辑,直接触发报错
正确实现代码

方案1:os.walk 通用兼容写法

适合所有Python、pandas版本,稳定性高:

import os
import pandas as pd

# 主目录路径
main_dir = "/main"
df_container = []

# 递归遍历主目录下所有层级的文件/文件夹
for root, _, files in os.walk(main_dir):
    for single_file in files:
        # 过滤出.csv格式的文件,不区分后缀大小写
        if single_file.lower().endswith(".csv"):
            # 拼接得到文件的完整路径
            file_path = os.path.join(root, single_file)
            # 读取CSV,可根据实际文件情况补充encoding、sep等参数
            temp_df = pd.read_csv(file_path)
            # 可选:新增列记录数据来源文件路径,方便后续校验
            temp_df["source_path"] = file_path
            df_container.append(temp_df)

# 一次性拼接所有DataFrame,重置索引
final_df = pd.concat(df_container, ignore_index=True)

方案2:pathlib 简洁写法

适合Python 3.4+、pandas 1.0+版本,代码更精简:

from pathlib import Path
import pandas as pd

main_dir = Path("/main")
# 递归匹配所有子目录下的CSV文件
csv_file_list = list(main_dir.rglob("*.csv"))
# 批量读取所有CSV
df_container = [pd.read_csv(file) for file in csv_file_list]
# 拼接得到最终结果
final_df = pd.concat(df_container, ignore_index=True)
使用说明
  • 若CSV文件编码为GBK/GB2312,读取时需要在pd.read_csv()中传入encoding="gbk"参数
  • 若不同CSV的列名、列顺序存在差异,pd.concat()会自动按列名对齐,缺失位置自动填充空值
  • 若单文件体积过大导致内存不足,可在pd.read_csv()中传入chunksize参数分块读取,或提前指定dtype参数压缩内存占用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:01:58