Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中拆分大文件csv文件(7GB)_Python_Csv_Split - Fatal编程技术网

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

如何在Python中拆分大文件csv文件(7GB),python,csv,split,Python,Csv,Split,我有一个7GBcsv文件,我想把它分成更小的块,这样在笔记本上用Python进行分析时,它可读性更强,速度更快。我想从中获取一个小集合,可能是250MB,那么我如何才能做到这一点呢?请参阅文件中的对象(由打开(文件名)返回的对象)-您可以选择读取指定数量的字节,或者使用读取行一次处理一行。您不需要Python来拆分csv文件。使用shell: $ split -l 100 data.csv 将data.csv拆分为100行的块。可能是这样的吗 #!/usr/local/cpython-3.3/

我有一个7GB
csv
文件,我想把它分成更小的块,这样在笔记本上用Python进行分析时,它可读性更强,速度更快。我想从中获取一个小集合,可能是250MB,那么我如何才能做到这一点呢?

请参阅
文件中的
对象(由
打开(文件名)返回的对象)
-您可以选择
读取指定数量的字节,或者使用
读取行
一次处理一行。

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

$ split -l 100 data.csv

data.csv
拆分为100行的块。

可能是这样的吗

#!/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)

我必须做一个类似的任务,并使用熊猫包:

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

我同意@jornsharpe readline应该能够一次读取一行,即使是大文件

如果您处理的是大型csv文件,我建议您使用。我经常出于同样的目的使用它,而且总是觉得它很棒(而且速度很快)。需要一点时间来习惯数据帧的概念。但一旦您克服了这一点,它会大大加快像您这样的大型操作


希望有帮助。

这里有一个小python脚本,我用来将一个文件
data.csv
拆分为几个csv部分文件。部分文件的数量可以通过
chunk\u 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()

注意:这不会使每个文件的标题保持不变。只是为了防止您需要每个区块的标题字段。对于csv文件,这不是傻瓜式的。如果长文本引号转义值中有换行符,则行可能会在两个文件之间拆分。最后一个参数可以添加到前缀文件中,并使用有用的名称
split-l 100 data.csv data\u split\uu
我认为这个解决方案不好。我有一个2GB(16m行),pandas无法在内存中处理它。分块并不意味着不将整个df加载到内存(RAM)中,这只是意味着您可以使用
chunksize
中指定的行数立即阅读。这是一个很好的答案。但请注意,这会向原始csv添加一个额外的索引列。“这会向原始csv添加一个额外的索引列。”-现在通过添加Index=False解决了这一问题。这确实会分割CSV,但输出CSV中的每一行之间都有空行。熊猫实际上是处理大型CSV文件的一个非常糟糕的解决方案,因为它们只能一次真正处理可存储在RAM中的数据。建议使用其他库,如Dask。这答案并不能解释它为什么起作用,人们如何从中学习?