如何合并主文件夹下多层子目录中的多个CSV文件?
问题分析与解决方案
原代码核心问题
- 函数提前返回:
list_files函数中return r语句在合并逻辑之前,导致后续合并CSV的代码完全不会执行。 - 变量定义顺序错误:调用
list_files(data_dir)时,data_dir变量还未定义,会触发NameError。 - 未定义变量:最后一段代码使用了不存在的
chat_files变量,应替换为files。 - 冗余操作:重复创建
combined_df和df,且os.chdir属于不必要操作,直接使用绝对路径即可。
修正后的代码
以下代码会精准定位主文件夹下第三层子目录中的所有CSV文件,并合并为单个文件:
import pandas as pd import os import glob # 定义主目录路径 data_dir = r'C:\Users\user\Downloads\top_folder' # 获取第三层子目录中的所有CSV文件(路径格式:top_folder/*/*/*.csv) csv_files = glob.glob(os.path.join(data_dir, "*", "*", "*.csv")) # 合并并保存文件 if csv_files: # 合并所有CSV,ignore_index=True重置索引避免重复 combined_df = pd.concat([pd.read_csv(file) for file in csv_files], ignore_index=True) # 将合并后的文件保存到主目录下 output_path = os.path.join(data_dir, "merged_all.csv") combined_df.to_csv(output_path, index=False) print(f"已成功合并{len(csv_files)}个CSV文件,结果保存至:{output_path}") else: print("未找到位于第三层子目录中的CSV文件")
可选:用os.walk精确控制目录深度
如果需要更严格地限制仅第三层子目录(避免匹配更深层级的文件),可以用os.walk判断目录深度:
import pandas as pd import os data_dir = r'C:\Users\user\Downloads\top_folder' csv_files = [] # 计算主目录的层级深度 base_depth = len(os.path.normpath(data_dir).split(os.sep)) for root, dirs, files in os.walk(data_dir): # 计算当前目录相对于主目录的深度 current_depth = len(os.path.normpath(root).split(os.sep)) # 仅处理第三层子目录(主目录为第0层,第三层即base_depth + 3) if current_depth == base_depth + 3: for file in files: if file.endswith(".csv"): csv_files.append(os.path.join(root, file)) # 合并逻辑同前 if csv_files: combined_df = pd.concat([pd.read_csv(file) for file in csv_files], ignore_index=True) output_path = os.path.join(data_dir, "merged_all.csv") combined_df.to_csv(output_path, index=False) print(f"已成功合并{len(csv_files)}个CSV文件,结果保存至:{output_path}") else: print("未找到位于第三层子目录中的CSV文件")
内容的提问来源于stack exchange,提问作者MDS
相关产品推荐
相关产品推荐

