如何在Python中拆分大文件csv文件(7GB)

时间:2013-11-17 17:31:40

标签: python csv split

我有一个7GB csv文件,我想将其拆分成更小的块,因此在笔记本上用Python进行分析时,它是可读的,速度更快。我想从中拿一小套,可能是250MB,所以我该怎么做呢?

7 个答案:

答案 0 :(得分:27)

您不需要Python来拆分csv文件。使用你的shell:

$ split -l 100 data.csv

data.csv分成100行的块。

答案 1 :(得分:17)

我不得不做一个类似的任务,并使用了pandas包:

for i,chunk in enumerate(pd.read_csv('bigfile.csv', chunksize=500000)):
    chunk.to_csv('chunk{}.csv'.format(i))

答案 2 :(得分:3)

请参阅file对象上的Python docsopen(filename)返回的对象 - 您可以选择read指定的字节数,或使用readline一次完成一行。

答案 3 :(得分:3)

也许是这样的?

#!/usr/local/cpython-3.3/bin/python

import csv

divisor = 10

outfileno = 1
outfile = None

with open('big.csv', 'r') as infile:
    for index, row in enumerate(csv.reader(infile)):
        if index % divisor == 0:
            if outfile is not None:
                outfile.close()
            outfilename = 'big-{}.csv'.format(outfileno)
            outfile = open(outfilename, 'w')
            outfileno += 1
            writer = csv.writer(outfile)
        writer.writerow(row)

答案 4 :(得分:2)

这是我用来将文件 data.csv 拆分为多个 CSV 部分文件的一个小 Python 脚本。部分文件的数量可以通过chunk_size(每个部分文件的行数)来控制。

将原始文件的标题行(列名)复制到每个部分的 CSV 文件中。

它适用于大文件,因为它使用 readline() 一次读取一行,而不是一次将整个文件加载到内存中。

#!/usr/bin/env python3

def main():
    chunk_size = 9998  # lines

    def write_chunk(part, lines):
        with open('data_part_'+ str(part) +'.csv', 'w') as f_out:
            f_out.write(header)
            f_out.writelines(lines)

    with open('data.csv', 'r') as f:
        count = 0
        header = f.readline()
        lines = []
        for line in f:
            count += 1
            lines.append(line)
            if count % chunk_size == 0:
                write_chunk(count // chunk_size, lines)
                lines = []
        # write remainder
        if len(lines) > 0:
            write_chunk((count // chunk_size) + 1, lines)

if __name__ == '__main__':
    main()

答案 5 :(得分:1)

我同意@jonrsharpe readline应该能够一次读取一行甚至是大文件。

如果您正在处理大型csv文件,我建议使用pandas.read_csv。我经常使用它来达到同样的目的,总是觉得它很棒(而且很快)。需要一些时间来习惯DataFrames的想法。但是一旦你克服了这一点,就会大大加速你的大型运营。

希望它有所帮助。

答案 6 :(得分:0)

此图显示了其他海报概述的不同方法的运行时差异(在 8 核机器上,将具有 1180 万行数据的 2.9 GB 文件拆分为约 290 个文件时)。

enter image description here

shell 方法来自 Thomas Orozco,Python 方法来自 Roberto,Pandas 方法来自 Quentin Febvre,这里是 Dask 代码段:

ddf = dd.read_csv("../nyc-parking-tickets/Parking_Violations_Issued_-_Fiscal_Year_2015.csv", blocksize=10000000, dtype=dtypes)
ddf.to_csv("../tmp/split_csv_dask")

我推荐使用 Dask 来分割文件,尽管它不是最快的,因为它是最灵活的解决方案(你可以写出不同的文件格式,在写之前执行处理操作,轻松修改压缩格式等)。 Pandas 的方法几乎一样灵活,但不能对整个数据集进行处理(比如在写入之前对整个数据集进行排序)。

Bash / 本机 Python 文件系统操作显然更快,但这不是我通常在拥有大型 CSV 时寻找的内容。我通常对将大型 CSV 文件拆分为较小的 Parquet 文件感兴趣,以进行高性能的生产数据分析。我通常不在乎实际拆分是否需要多花几分钟时间。我对准确分割更感兴趣。

我写了一篇博文,更详细地讨论了这一点。你可能可以谷歌搜索并找到帖子。