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

