Python教程:递归查找并合并多个子文件夹中的CSV文件

Python教程:递归查找并合并多个子文件夹中的CSV文件

本教程将指导您如何利用python的`pathlib`模块递归遍历复杂目录结构,并结合`pandas`库高效地将多个子文件夹中的csv文件合并成一个统一的csv文件。我们将通过一个实际示例,展示如何定位、读取并整合分散的数据,最终生成一个便于分析的汇总数据集。

理解需求:多层目录下的CSV文件合并挑战

在数据处理的日常工作中,我们经常会遇到数据文件分散存储在多层子目录中的情况。例如,日志文件、传感器数据或实验结果可能按照日期、类型或批次等维度,被组织成类似 Sessions/day1/weather/weather1.csv、Sessions/day2/weather/weather2.csv 这样的结构。当需要对所有这些分散的数据进行统一分析时,首要任务就是将它们合并成一个完整的数据集。

传统的文件操作方法,如使用 os.walk 遍历目录树,或者 glob 模块进行模式匹配,虽然能够实现文件查找,但在处理复杂路径和递归查找时,代码可能显得冗长且不够直观。结合 pandas 进行数据合并,则需要一个高效且简洁的机制来获取所有目标文件的路径。

核心工具:pathlib与pandas

Python标准库中的 pathlib 模块提供了一种面向对象的方式来处理文件系统路径,极大地简化了路径操作。其 Path.rglob() 方法尤其适用于递归地查找符合特定模式的文件。而 pandas 库作为数据分析的核心工具,提供了 read_csv() 用于读取CSV文件,以及 concat() 函数用于将多个DataFrame对象高效地合并在一起。

本教程将展示如何巧妙地结合这两个库,以简洁高效的方式完成多层子目录下的CSV文件合并任务。

立即学习“Python免费学习笔记(深入)”;

实现步骤与代码示例

我们将以一个典型的场景为例:假设有一个名为 Sessions 的父目录,其中包含多个 dayX 子目录,每个 dayX 子目录又包含一个 weather 子目录,最终在 weather 目录中存放着 weatherX.csv 文件。我们的目标是将所有 weatherX.csv 文件合并到 Sessions 目录下的一个 weather_all.csv 文件中。

步骤1:导入必要库

首先,我们需要导入 pathlib 用于路径操作,以及 pandas 用于数据处理。

梅子Ai论文 梅子Ai论文

无限免费生成千字论文大纲-在线快速生成论文初稿-查重率10%左右

梅子Ai论文 66 查看详情 梅子Ai论文

from pathlib import Pathimport pandas as pd

步骤2:定义目标父目录

指定包含所有子目录和CSV文件的父目录路径。在本例中,我们假设当前脚本与 Sessions 目录处于同一级别,或者提供 Sessions 的绝对路径。

parent_directory = Path('Sessions') # 相对路径,如果Sessions在当前工作目录下# 或者 parent_directory = Path('/path/to/your/Sessions') # 绝对路径,请替换为实际路径

步骤3:递归查找并收集CSV文件路径

使用 Path.rglob(‘*.csv’) 方法,我们可以递归地在 parent_directory 及其所有子目录中查找所有扩展名为 .csv 的文件。

csv_files = list(parent_directory.rglob('*.csv'))print(f"找到 {len(csv_files)} 个CSV文件。")if csv_files:    for file in csv_files[:5]: # 打印前5个文件路径作为示例        print(file)

步骤4:逐一读取CSV文件并存储到列表中

遍历找到的所有CSV文件路径,使用 pd.read_csv() 将每个文件读取为一个 pandas.DataFrame,并将这些DataFrame对象收集到一个列表中。

dfs_to_combine = []for file_path in csv_files:    try:        df = pd.read_csv(file_path)        dfs_to_combine.append(df)    except pd.errors.EmptyDataError:        print(f"警告: 文件 '{file_path}' 为空,跳过。")    except Exception as e:        print(f"错误: 读取文件 '{file_path}' 失败: {e},跳过。")

步骤5:合并所有数据框并保存

当所有DataFrame都读取完毕并存储在 dfs_to_combine 列表中后,使用 pd.concat() 函数将它们一次性合并成一个大的DataFrame。最后,将合并后的DataFrame保存为一个新的CSV文件。

if dfs_to_combine: # 确保列表不为空    combined_df = pd.concat(dfs_to_combine, ignore_index=True)    destination_path = parent_directory / 'weather_all.csv' # 合并后的文件路径    # 确保输出目录存在,如果destination_path包含子目录    destination_path.parent.mkdir(parents=True, exist_ok=True)    combined_df.to_csv(destination_path, index=False, encoding='utf-8-sig')    print(f"所有CSV文件已成功合并并保存到: {destination_path}")else:    print("没有可合并的数据。")

ignore_index=True 参数在合并时会重置索引,这对于新的合并数据集通常是期望的行为。encoding=’utf-8-sig’ 确保了在不同系统上的兼容性,尤其是在处理包含特殊字符的数据时。

完整代码示例

将上述步骤整合在一起,形成一个完整的脚本:

from pathlib import Pathimport pandas as pddef combine_nested_csvs(parent_dir_path, output_filename='weather_all.csv'):    """    递归查找指定父目录及其子目录中的所有CSV文件,    并将它们合并成一个单一的CSV文件。    Args:        parent_dir_path (str or Path): 包含CSV文件的父目录路径。        output_filename (str): 合并后CSV文件的名称。    """    parent_directory = Path(parent_dir_path)    if not parent_directory.is_dir():        print(f"错误: 目录 '{parent_dir_path}' 不存在。")        return    csv_files = list(parent_directory.rglob('*.csv'))    if not csv_files:        print(f"在 '{parent_dir_path}' 中没有找到任何CSV文件。")        return    print(f"找到 {len(csv_files)} 个CSV文件,开始读取和合并...")    dfs_to_combine = []    for file_path in csv_files:        try:            # 尝试读取文件,可以根据需要添加更多pd.read_csv的参数            df = pd.read_csv(file_path)            dfs_to_combine.append(df)        except pd.errors.EmptyDataError:            print(f"警告: 文件 '{file_path}' 为空,跳过。")        except Exception as e:            print(f"错误: 读取文件 '{file_path}' 失败: {e},跳过。")    if dfs_to_combine:        combined_df = pd.concat(dfs_to_combine, ignore_index=True)        destination_path = parent_directory / output_filename        # 确保输出目录存在        destination_path.parent.mkdir(parents=True, exist_ok=True)        combined_df.to_csv(destination_path, index=False, encoding='utf-8-sig')        print(f"所有CSV文件已成功合并并保存到: {destination_path}")    else:        print("没有可合并的数据。")# 示例调用# 假设你的 'Sessions' 目录与你的脚本在同一目录下# combine_nested_csvs('Sessions', 'weather_all.csv')# 如果 'Sessions' 在其他位置,请提供完整路径# combine_nested_csvs('/Users/YourUser/Documents/Sessions', 'weather_all.csv')

注意事项与最佳实践

列名一致性: pd.concat() 在合并时会尝试对齐列。如果所有CSV文件的列名和顺序完全一致,合并将非常顺利。如果列名不一致,pd.concat 会创建所有列的并集,并在缺失值处填充 NaN。在合并前,建议检查并标准化所有CSV文件的列结构。内存管理: 对于数量巨大或单个文件很大的CSV数据集,将所有DataFrame一次性加载到内存中可能会导致内存溢出。在这种情况下,可以考虑以下策略:分块读取: 使用 pd.read_csv(…, chunksize=…) 分块读取并处理数据。逐步写入: 读取一个文件,写入输出文件(追加模式),然后读取下一个。使用 dask.dataframe: 对于超大数据集,dask 提供了类似于 pandas 的API,但能够处理超出内存限制的数据。错误处理: 在读取CSV文件时,应考虑文件可能为空 (pd.errors.EmptyDataError)、文件损坏或编码问题等异常情况。在示例代码中已加入了基本的 try-except 块来处理这些情况。文件编码: 确保 pd.read_csv() 和 df.to_csv() 使用正确的编码(如 ‘utf-8’ 或 ‘utf-8-sig’),以避免乱码问题。文件复制: 如果除了合并之外,你确实需要将每个单独的CSV文件复制到一个目标目录,可以在读取文件的循环中添加 `shutil

以上就是Python教程:递归查找并合并多个子文件夹中的CSV文件的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/577746.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 09:20:52
下一篇 2025年11月10日 09:22:11

相关推荐

  • C++框架与其他流行框架(如Python、Java)相比有何优劣势?

    c++++ 框架在性能、内存效率和灵活性方面胜过 python 和 java 框架,但它具有陡峭的学习曲线和缺乏动态性。优势:性能卓越内存效率灵活跨平台支持劣势:陡峭的学习曲线缺乏动态性缺乏社区支持 C++ 框架与其他流行框架(Python、Java)的优劣势 引言 C++ 是一种强大的编程语言,拥…

    2025年12月18日
    000
  • C++框架江湖:开源与商业之争

    现代 c++++ 编程中选择框架至关重要,开源和商业框架各有优缺点。开源框架优点:免费、可定制、社区支持庞大;缺点:可能缺乏文档和支持。商业框架优点:经过全面测试、专业支持、预构建功能;缺点:需付费、定制能力有限。选择框架需考虑项目规模、开发团队经验、技术堆栈整合和预算。开源框架案例:boost 和…

    2025年12月18日
    000
  • 在 C++ 框架中实施并行算法优化性能的方法

    在 c++++ 框架中实施并行算法以优化性能的方法有:使用 multithread 标准库(std::thread)使用 openmp(#pragma omp parallel for)使用第三方库(如 tbb、cilk plus、concurrency toolkit)通过并行化图像转换等任务,可…

    2025年12月18日
    000
  • C++框架选择指南:初学者的最佳选择

    c++++框架选择指南:初学者最佳框架:qt:易学、全面,适合gui设计。boost:实用工具库,简化开发。选择标准:学习曲线文档社区支持适用性 C++框架选择指南:初学者最佳之选 对于初学者来说,选择合适的C++框架对于构建稳固且可扩展的应用程序至关重要。本指南将提供一个全面的框架选择指南,重点关…

    2025年12月18日
    000
  • C++框架与其他语言框架的比较

    c++++ 框架以性能、类型安全和可扩展性著称,而其他语言框架(如 python django、java spring framework 和 javascript angular)则更注重易用性和跨平台支持。实战案例表明,c++ 框架适用于高性能科学计算和跨平台桌面应用程序,而 python 和 …

    2025年12月18日
    000
  • 如何评估C++框架对不同平台和操作系统的兼容性?

    评估 c++++ 框架跨平台兼容性的指南:查看文档和支持论坛以确定受支持平台。运行兼容性测试以验证在目标平台上的功能性。检查依赖项以确保兼容性。关注平台差异并考虑特定平台特征。实战案例:使用 qt 框架的兼容性评估(包括文档审查、兼容性测试、依赖项检查和平台差异考虑)。 评估 C++ 框架跨平台兼容…

    2025年12月18日
    000
  • C++ 框架的文档和沟通策略

    稳健的 c++++ 框架文档和沟通至关重要,为用户提供清晰的指导、api 参考和故障排除技巧。有效的沟通包括:建立社区论坛、主动使用社交媒体和组织网络研讨会。成功的框架如 boost 库和 qt 框架,通过结构化组织、清晰示例和活跃社区支持,提供出色的文档和沟通。 C++ 框架的文档和沟通策略 文档…

    2025年12月18日
    000
  • 特定领域C++框架的用例和成功案例分享

    特定领域 c++++ 框架为软件开发提供了健壮的基础,广泛应用于游戏开发、金融技术、科学计算和企业应用程序。成功案例包括虚幻引擎(游戏)、quantlib(金融)、armadillo(科学)和 boost(企业),证明了这些框架的有效性。 特定领域 C++ 框架的用例和成功案例分享 简介 C++ 框…

    2025年12月18日
    000
  • 哪些C++框架正在主导市场,它们提供的功能是什么?

    c++++ 框架市场的主导者包括:qt:跨平台 ui 开发框架,提供跨平台部署能力和现代化 ui 工具。boost:库集合,提供广泛的工具,包括数据结构、网络和并行编程。eigen:线性代数库,提供高效矩阵和向量运算。google test:测试框架,用于编写单元和自动化测试,具有简单易用的断言语法…

    2025年12月18日
    000
  • 新兴的C++框架有哪些?它们将如何影响C++开发?

    近年来,一批新兴的 c++++ 框架为 c++ 开发带来了变革性力量,解决了复杂性、可维护性和可扩展性等痛点。主要框架包括:qt framework:跨平台 ui 库,广泛用于 gui 应用程序开发。boost c++ libraries:库集合,扩展了 c++ 标准库,提供算法、数据结构等设施。c…

    2025年12月18日
    000
  • 特定领域C++框架与其他编程语言框架的比较

    c++++ 框架以其高性能、内存控制和跨平台支持而著称,但也存在陡峭的学习曲线、手动内存管理和较少的高级功能。python、java 和 node.js 框架分别以其简洁性、面向对象性和高并发性而闻名,适合不同应用场景,如数据科学、企业级应用和服务器端开发。选择框架时,应根据应用需求、团队技能、性能…

    2025年12月18日
    000
  • 哪些C++框架最适合移动开发?

    最佳 c++++ 移动开发框架:qt:功能丰富、易用、高性能,适用于桌面、移动和嵌入式应用程序。juce:轻量跨平台框架,专为音频和多媒体应用设计,适用于音乐制作软件、音频工具。cocos2d-x:开源游戏开发框架,支持多种语言,适合各种移动游戏开发。unreal engine:高保真游戏开发引擎,…

    2025年12月18日
    000
  • C++ 框架如何节省时间?

    c++++ 框架通过提供预构建组件和代码库,简化了应用程序开发,节省了时间和精力。具体而言,它提供了以下好处:预构建组件和代码库,用于创建界面、网络和数据库管理。通过 boost 实施的多线程,简化了并发代码的编写。 C++ 框架:节约时间的利器 简介 C++ 框架通过提供预先构建的组件和代码库,帮…

    2025年12月18日
    000
  • C++框架与其他语言框架的对比

    c++++ 框架以其速度和细粒度控制著称,但学习曲线较陡峭。与其他语言框架相比:python:c++ 速度更快,但 python 更易读且采用自动内存管理。java:c++ 通常更快,但 java 跨平台性更好且采用自动内存管理。在需要高性能、细粒度控制且不需要跨平台性的项目中,c++ 框架更合适。…

    2025年12月18日
    000
  • 在C++中,如何使用框架优化内存管理和性能?

    智能指针优化了 c++++ 中的内存管理和性能,提供了自动回收内存的特殊指针类型。标准库中的智能指针类型有:unique_ptr:独占所有权,程序生命周期结束后自动删除。shared_ptr:共享所有权,最后一个指针销毁时释放。weak_ptr:非所有权,不再被其他指针指向时释放。使用智能指针简单,…

    2025年12月18日
    000
  • 依赖项管理在C++框架中扮演什么角色?

    在 c++++ 框架中使用依赖项管理工具可以带来诸多好处,包括自动解析和安装依赖项、确保版本一致性、管理冲突和提升开发效率。流行的依赖项管理工具包括 conan、cmake、hunter 和 vcpkg。本文以使用 conan 管理依赖项为例,展示了在 c++ 框架中实际使用依赖项管理工具的步骤。 …

    2025年12月18日
    000
  • 采用 C++ 框架在大型项目中管理依赖关系和集成问题

    在大型 c++++ 项目中,框架提供了以下工具管理依赖关系和集成:依赖关系管理使用包管理系统(如 cmake、conan)定义和自动化依赖项的下载、构建和安装。集成遵循特定步骤和惯例,如分层架构,实现组件松耦合和简化通信。通过使用这些工具,团队可以高效地构建和维护大型、模块化的 c++ 项目。 在大…

    2025年12月18日
    000
  • C++ 框架的开源选项有哪些?

    c++++ 开发中的开源框架提供了众多优势,包括可重用代码、设计模式和最佳实践。本文重点介绍了五个流行的开源 c++ 框架:qt:用于创建跨平台 gui,提供丰富的组件、布局管理和信号/槽机制。boost:c++ 标准库的扩展,包含容器、算法、并发和字符串处理等功能。wxwidgets:跨平台 gu…

    2025年12月18日
    000
  • C++ 框架与其他语言框架有何区别?

    c++++框架在结构和类型安全、指针和引用、范式支持、性能和内存管理方面与其他语言框架不同。它提供静态类型安全、指针和引用支持、多范式支持、高性能以及手动内存管理。与python和javascript等使用动态类型或垃圾收集器的语言框架相比,c++框架更注重类型安全和直接硬件访问,从而提供更好的性能…

    2025年12月18日
    000
  • C++ 框架有哪些流行的选择?

    热门 c++++ 框架及其优势:boost 库:广泛的功能、模块化、高性能。qt 框架:跨平台 gui、数据库访问、网络功能。c++ standard library (stl):标准化、效率、与 c++ 标准集成。grpc:分布式系统、rpc 定义、类型安全、传输优化。 C++ 框架的热门选择 C…

    2025年12月18日
    000

发表回复

登录后才能评论
关注微信