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

Soh*_*ail 17 python csv split

我有一个7GB的csv文件,我想分成更小的块,所以它在笔记本上用Python进行分析是可读的和更快的.我想从中拿一小套,也许是250MB,所以我该怎么做呢?

Tho*_*zco 28

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

$ split -l 100 data.csv
Run Code Online (Sandbox Code Playgroud)

将分成data.csv100行的块.

  • 注意:这不会使每个文件的标头保持完整。以防万一您想要每个块的标头字段。 (6认同)
  • 对于 csv 文件来说并非万无一失。如果长文本引用转义值中有换行符,则行可能会在两个文件之间拆分。 (4认同)

小智 20

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

for i,chunk in enumerate(pd.read_csv('bigfile.csv', chunksize=500000)):
    chunk.to_csv('chunk{}.csv'.format(i), index='False')
Run Code Online (Sandbox Code Playgroud)

  • “这会在原始 csv 中添加一个额外的索引列。” - 现在已通过添加 Index=False 修复了此问题。 (2认同)

Rob*_*rto 13

这是我用来将一个文件拆分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()
Run Code Online (Sandbox Code Playgroud)


Pow*_*ers 6

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

在此输入图像描述

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")
Run Code Online (Sandbox Code Playgroud)

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

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

我写了一篇博客文章更详细地讨论了这个问题。你也许可以谷歌一下并找到这篇文章。


jon*_*rpe 3

请参阅有关对象的Python 文档file(通过返回的对象open(filename)- 您可以选择read指定的字节数,或用于readline一次处理一行。