Python - 合并文件夹中的所有 CSV 文件

2025年3月17日 | 阅读 3 分钟

在本教程中,我们将演示几种基于 Python 的方法,用于将多个 CSV 数据合并到一个文件中(此方法也适用于文本和其他类型的文件)。还将有一个关于如何快速合并多个 CSV 文件的奖励课程,适用于 Linux。最后,通过将所有 CSV 文件转换为 Pandas DataFrame,然后为每一行标记其来源的 CSV 文件,您可以完全控制导入数据,合并数千个文件。

如何使用 Python 合并多个相同的 CSV 文件?请注意,我们假设所有文件都包含相同的列和信息。使用简短的代码示例连接下载文件夹中的 CSV 文件。

数据集

在下一步教程中,我将使用五个名为 sales 的虚拟 CSV 格式文件,这些文件可以在此文件夹中找到。每个文件都有完全相同的列数和 100 万行。例如,`sales_recors_n1.csv` 文件打开时的格式如下。

在将文件下载到笔记本上的特定目录后,可以使用 `os` Python 模块中的 `listdir()` 方法列出文件内容。

为了使用此方法,您必须提供目录的确切路径,如下所示。

请注意此方法生成的 Python 列表,其中包含 `sales csv` 目录中的所有文件。这很有用,因为它允许使用该对象进行迭代文件读取。

  • 合并多个 CSV 文件

第一步的目的是使用 Python 将五个 CSV 文件合并成一个包含 500 万行的单个数据集。我将使用 `os` 或 `pandas` 包来完成此操作。以下是完成此操作的完整 Python 脚本。

Python - Combine all CSV Files in Folder

现在,我将逐步为您讲解代码的执行过程。

  1. 首先,我导入必要的 Python 包,然后指定 CSV 文件的位置。我建议您将所有要合并的 CSV 文件放在一个文件夹中。这样会使我们的工作更轻松。
  2. 接下来,我通过添加符合特定命名模式的每个记录的路径来创建一个文件列表——在这种情况下,是所有以“sales records n”开头的文件——然后将这些文件列表合并为一个。有时,根据名称选择文件至关重要,因为我们的工作目录可能包含大量无关文件。请注意,文件列表是如何使用列表推导式生成的。

当我们打印 `file list` 的内容时,我们得到以下结果。

输出

['/Users/anbento/Documents/sales/sales_csv/sales_records_n5.csv', '/Users/anbento/Documents/sales/sales_csv/sales_records_n4.csv', '/Users/anbento/Documents/sales/sales_csv/sales_records_n1.csv', '/Users/anbento/Documents/sales/sales_csv/sales_records_n3.csv', '/Users/anbento/Documents/sales/sales_csv/sales_records_n2.csv']

所有文件现在都可以解析,并且已关联其路径。

请记住,尽管列表是无序的,但如果文件合并的顺序很重要,那么在迭代列表时,我们将需要使用 `sorted()` 函数。

3. 我们现在开始创建一个空的 CSV 列表。然后,我们使用 `pandas` 的 `read_csv()` 方法连续读取文件列表中的任何 CSV 文件,并将这些数据集添加到 CSV 列表中。

需要注意的是,当使用 `read_csv()` 解析 CSV 文件时,数据集会自动转换为 pandas DataFrame,因此 `csv_list` 现在包含 5 个不同的 pandas DataFrame。但是,除了解析文件之外,我们还添加了以下命令。

这会向每个 DataFrame 添加一个新列,标题为源 CSV 文件的名称,这样,当文件合并时,就可以清楚地知道哪个文件是哪个。

最终,通过将 `concat()` 方法应用于 CSV DataFrame,将文件合并到一个单独的 DataFrame 中。如果 `ignore_index` 设置为 `True`,将创建一个新的有序索引。

最后一步是将 `csv_merged` 从 pandas DataFrame 保存到同一目录。要实现这一点,请使用 `to_csv()` 命令。当使用 `index=False` 时,表示不应添加包含索引的列。

输出

['sales_records_full.csv',
 'sales_records_n1.csv',
 'sales_records_n2.csv',
 'sales_records_n3.csv',
 'sales_records_n4.csv',
 'sales_records_n5.csv']

除了包导入之外,仅需 7 行代码和几秒钟的运行时间即可获得此结果。