新闻中心

合并嵌套子文件夹中的CSV文件并生成主数据表

2025-10-31
浏览次数:
返回列表

合并嵌套子文件夹中的CSV文件并生成主数据表

本教程详细介绍了如何使用python的`pathlib`模块高效遍历嵌套子文件夹,结合`pandas`库读取并合并散布在不同位置的多个csv文件,最终生成一个统一的、包含所有数据的csv主文件。文章将提供清晰的步骤、优化的代码示例及注意事项,帮助用户轻松实现复杂文件结构下的数据整合。

在数据分析和处理的场景中,我们经常会遇到数据分散存储在多个文件甚至多层嵌套的文件夹中的情况。例如,日志文件按日期或事件类型存储在不同的子目录中,或者实验数据按批次或条件存储。手动查找并合并这些文件不仅耗时,而且容易出错。本文将指导您如何利用Python的pathlib和pandas库,自动化地从复杂的文件结构中提取并合并CSV数据,生成一个统一的、可供进一步分析的主数据集。

1. 环境准备

在开始之前,请确保您的Python环境中已安装pandas库。如果尚未安装,可以通过以下命令进行安装:

pip install pandas

2. 理解文件结构与目标

假设我们有一个名为 Sessions 的父目录,其中包含多个子文件夹,如 day1, day2, day3 等。每个 dayX 文件夹下又有一个 weather 子文件夹,其中包含一个或多个 weather*.csv 文件。我们的目标是遍历 Sessions 目录下的所有 weather*.csv 文件,将它们的内容合并到一个名为 weather_All.csv 的主文件中,并将其保存在 Sessions/Weather/ 目录下。

示例文件结构如下:

Sessions/
├── day1/
│   └── weather/
│       └── weather1.csv
├── day2/
│   └── weather/
│       └── weather2.csv
├── day3/
│   └── weather/
│       └── weather3.csv
└── ...

目标输出文件:

Sessions/
└── Weather/
    └── weather_All.csv

3. 核心解决方案:pathlib与pandas

Python的pathlib模块提供了面向对象的文件系统路径操作,使得路径处理更加直观和强大。rglob()方法尤其适用于递归查找指定模式的文件。结合pandas库的数据读取和合并能力,我们可以高效地完成任务。

Musho Musho

AI网页设计Figma插件

Musho 76 查看详情 Musho

3.1 查找所有目标CSV文件

pathlib.Path.rglob()方法允许我们递归地搜索指定目录及其所有子目录中符合特定模式的文件。在这里,我们将使用它来查找所有以.csv结尾的文件。

from pathlib import Path
import pandas as pd

# 定义父目录和目标输出文件路径
parent_directory = 'Sessions'
output_dir = Path(parent_directory) / 'Weather'
output_file = output_dir / 'weather_All.csv'

# 确保输出目录存在,如果不存在则创建
output_dir.mkdir(parents=True, exist_ok=True)

# 用于存储所有DataFrame的列表
all_dfs = []

# 使用rglob递归查找所有.csv文件
print(f"开始在 '{parent_directory}' 中查找CSV文件...")
for file_path in Path(parent_directory).rglob('*.csv'):
    # 过滤掉目标输出文件本身,防止将其读入并合并
    if file_path == output_file:
        continue

    try:
        # 读取CSV文件
        df = pd.read_csv(file_path)
        all_dfs.append(df)
        print(f"已读取文件: {file_path}")
    except Exception as e:
        print(f"读取文件 '{file_path}' 时发生错误: {e}")
        # 根据需要决定是跳过错误文件还是中断程序

print("所有CSV文件读取完毕。")

3.2 合并DataFrame并保存

收集到所有单个CSV文件的DataFrame后,我们可以使用pd.concat()函数一次性将它们合并成一个大的DataFrame。这种方法比在循环中反复使用concat更高效,因为它避免了多次创建新的DataFrame对象。

# 检查是否有DataFrame需要合并
if all_dfs:
    # 使用pd.concat合并所有DataFrame
    # ignore_index=True 会重置合并后的DataFrame的索引
    combined_df = pd.concat(all_dfs, ignore_index=True)

    # 将合并后的DataFrame保存为新的CSV文件
    # index=False 避免将DataFrame的索引写入CSV文件
    # encoding='utf-8-sig' 确保在Windows等系统上正确处理中文字符和BOM
    combined_df.to_csv(output_file, index=False, encoding='utf-8-sig')

    print(f"\n成功合并 {len(all_dfs)} 个CSV文件,并保存至 '{output_file}'")
else:
    print(f"\n在 '{parent_directory}' 中未找到任何CSV文件进行合并。")

4. 完整代码示例

将上述步骤整合,得到完整的解决方案代码:

from pathlib import Path
import pandas as pd

def combine_nested_csvs(parent_directory: str, output_filename: str = 'weather_All.csv'):
    """
    从指定父目录及其所有子目录中查找并合并所有CSV文件。

    Args:
        parent_directory (str): 包含CSV文件的根目录。
        output_filename (str): 合并后输出的CSV文件名。
                                 该文件将保存在 parent_directory/Weather/ 目录下。
    """

    # 定义父目录和目标输出文件路径
    base_path = Path(parent_directory)
    output_dir = base_path / 'Weather'
    output_file = output_dir / output_filename

    # 确保输出目录存在,如果不存在则创建
    output_dir.mkdir(parents=True, exist_ok=True)

    # 用于存储所有DataFrame的列表
    all_dfs = []

    print(f"--- 开始在 '{base_path}' 中查找并合并CSV文件 ---")

    # 使用rglob递归查找所有.csv文件
    for file_path in base_path.rglob('*.csv'):
        # 过滤掉目标输出文件本身,防止将其读入并合并
        if file_path == output_file:
            print(f"跳过目标输出文件: {file_path}")
            continue

        try:
            # 读取CSV文件
            df = pd.read_csv(file_path)
            all_dfs.append(df)
            print(f"已读取文件: {file_path}")
        except pd.errors.EmptyDataError:
            print(f"警告: 文件 '{file_path}' 为空,已跳过。")
        except Exception as e:
            print(f"错误: 读取文件 '{file_path}' 时发生异常: {e}")
            # 根据需要决定是跳过错误文件还是中断程序

    # 检查是否有DataFrame需要合并
    if all_dfs:
        print(f"\n--- 正在合并 {len(all_dfs)} 个DataFrame ---")
        # 使用pd.concat合并所有DataFrame
        combined_df = pd.concat(all_dfs, ignore_index=True)

        # 将合并后的DataFrame保存为新的CSV文件
        combined_df.to_csv(output_file, index=False, encoding='utf-8-sig')

        print(f"\n--- 成功合并所有CSV文件,并保存至 '{output_file}' ---")
        print(f"合并后的DataFrame包含 {len(combined_df)} 行数据。")
    else:
        print(f"\n--- 在 '{base_path}' 中未找到任何CSV文件进行合并。---")

# 调用函数执行合并操作
if __name__ == "__main__":
    # 假设您的父目录名为 'Sessions'
    combine_nested_csvs('Sessions', 'weather_All.csv')

5. 注意事项与最佳实践

  1. 列名一致性: 确保所有待合并的CSV文件具有相同或兼容的列名和数据类型。pd.concat会根据列名进行对齐,如果列名不一致,可能会引入额外的列并用NaN填充。
  2. 文件编码: 在读取和写入CSV文件时,指定正确的编码(如encoding='utf-8-sig')可以避免乱码问题,特别是处理包含非英文字符或在不同操作系统(如Windows)之间传输的文件时。
  3. 错误处理: 示例代码中包含了try-except块来捕获读取CSV文件时可能发生的错误(如文件损坏、格式不正确或为空)。您可以根据实际需求增强错误处理逻辑,例如记录错误日志或跳过特定文件。
  4. 内存效率: 对于数量巨大或单个文件非常大的情况,将所有DataFrame一次性加载到内存中可能会导致内存溢出。在这种情况下,可以考虑使用dask等库进行并行处理,或者逐块读取和写入数据。
  5. 目标文件过滤: 务必在遍历文件时跳过最终的合并输出文件,否则程序可能会尝试读取自身,导致无限循环或错误。
  6. ignore_index=True: 在pd.concat中使用ignore_index=True是一个好习惯,它会为合并后的DataFrame生成一个新的连续索引,避免原始文件索引的重复或冲突。
  7. 实际复制文件: 本教程的目的是合并数据,而不是复制文件。如果您确实需要将所有单独的CSV文件复制到一个目标目录,可以在读取每个文件后,使用shutil.copy()函数进行复制操作。

总结

通过结合pathlib的强大文件系统导航能力和pandas高效的数据处理功能,我们可以轻松应对从复杂目录结构中聚合数据的挑战。本文提供的解决方案不仅自动化了这一过程,而且考虑了效率和健壮性,是处理类似数据整合任务的专业级实践。

以上就是合并嵌套子文件夹中的CSV文件并生成主数据表的详细内容,更多请关注其它相关文章!


# 面向对象  # 如何做好淘系seo  # 自己网站优化如何做  # 南通营销推广厂家有哪些  # 山东seo优化价格  # 搬家公司类网站建设  # 顺德网站建设及托管  # 初创的seo  # 西藏网站建设网络推广  # seo基本薪资很低吗  # 临海建设规划局网站  # 我们可以  # 将其  # 并保存  # 夹中  # python  # 您的  # 遍历  # 多个  # 跳过  # 递归  # csv文件  # win  # ai  # csv  # session  # app  # 编码  # 操作系统  # windows 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法  内存检查:在VS Code中调试C++时的内存视图  2026春节假期票务安排_2026春节放假购票指南  composer的"require-dev"部分是用来做什么的?  AO3最新官网入口公告_2025AO3镜像站实时查询方法  win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】  蛙漫官方正版入口 蛙漫网页在线全集免费观看  抖音从哪里进入网页版_抖音官方入口链接  电脑IP地址怎么查 查看本机IP地址的几种方法  Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  Centos/Linux 系统下安装 composer 的完整步骤  响应式容器内容自动缩放与宽高比维持教程  LINUX怎么设置定时任务_LINUX crontab配置教程  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  “在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法  jQuery Mask 插件中实现电话号码固定前导零的教程  EMS快递官网app_中国邮政速递物流手机客户端  晋江读书网页版在线登录 晋江读书电脑版官网  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突  iwriter统一登录平台 iwrite账号密码登录页面  响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  批改网学生版PC登录 批改网官网登录系统入口  实现分段式页面滚动导航:CSS与J*aScript教程  反效果?《战地6》免费试玩开启后玩家数不升反降  12306选座系统怎么选连座_12306选座多人连坐操作方法  新手怎么开始学化妆 零基础化妆入门教程  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  微信网页版官方入口教程 微信网页版网页版快速登录步骤  J*a递归快速排序中静态变量导致数据累积问题的解决方案  必由学官方登录入口 必由学教师学生账号快速访问  Win11怎么查看电脑配置_Win11硬件配置检测工具使用  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  学习通网页版快速入口 学习通官网网页版直接打开  如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略  ACG动漫视频网入口 ACG动漫*免费正版观看地址  虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画  微信商城在哪里打开【步骤】 

搜索