首页 > 解决方案 > 如何在 python 中合并大型 csv 文件?

问题描述

我有 18 个 csv 文件,每个文件大约 1.6Gb,每个文件包含大约 1200 万行。每个文件代表一年的数据。我需要合并所有这些文件,提取特定地区的数据,然后分析时间序列。做这个的最好方式是什么?

我已经厌倦了使用 pd.read_csv 但我达到了内存限制。我曾尝试包含一个块大小参数,但这给了我一个 TextFileReader 对象,我不知道如何将它们组合成一个数据框。我也尝试过 pd.concat 但这也不起作用。

标签: pythonpandascsv

解决方案


这是使用 pandas 组合非常大的 csv 文件的优雅方式。该技术是每次迭代将行数(定义为 CHUNK_SIZE)加载到内存中,直到完成。这些行将以“附加”模式附加到输出文件。

import pandas as pd

CHUNK_SIZE = 50000
csv_file_list = ["file1.csv", "file2.csv", "file3.csv"]
output_file = "./result_merge/output.csv"

for csv_file_name in csv_file_list:
    chunk_container = pd.read_csv(csv_file_name, chunksize=CHUNK_SIZE)
    for chunk in chunk_container:
        chunk.to_csv(output_file, mode="a", index=False)

但是,如果您的文件包含标题,那么跳过除第一个文件之外的后续文件中的标题是有意义的。由于重复标题是出乎意料的。在这种情况下,解决方案如下:

import pandas as pd

CHUNK_SIZE = 50000
csv_file_list = ["file1.csv", "file2.csv", "file3.csv"]
output_file = "./result_merge/output.csv"

first_one = True
for csv_file_name in csv_file_list:

    if not first_one: # if it is not the first csv file then skip the header row (row 0) of that file
        skip_row = [0]
    else:
        skip_row = []

    chunk_container = pd.read_csv(csv_file_name, chunksize=CHUNK_SIZE, skiprows = skip_row)
    for chunk in chunk_container:
        chunk.to_csv(output_file, mode="a", index=False)
    first_one = False

推荐阅读