如何采样一个非常大的CSV文件(6GB)

lin*_*ing 2 python memory file

有一个很大的CSV文件(第一行作为标题),现在我想要100个样本(line_num%100例如),如何有效地使用主内存约束?

将文件分成100个较小的一个.或者每1/100行作为子文件1,每2/100行作为子文件2,...,每100/100行作为文件100.获得100个大小约600的文件M.

没有获得100行或1/100大小的样本.

我试着像这样执行:

fi  = [open('split_data//%d.csv'%i,'w') for i in range(100)]
i = 0
with open('data//train.csv') as fin:
    first = fin.readline()
    for line in fin:
        fi[i%100].write(line)
        i = i + 1
for i in range(100):
    fi[i].close()
Run Code Online (Sandbox Code Playgroud)

但是文件太大而无法运行它有限的内存,如何处理呢?我想用一轮〜来做

(我的代码有效,但它消耗了太多时间,我错误地认为它崩溃了,对不起~~)

Jon*_*nts 6

如评论中所述将文件拆分为100个部分(我想以模数方式将文件拆分为100个部分,即范围(200) - > | [0,100]; [1,101]; [2,102]是,单独一个大到几百个小文件)

import csv

files = [open('part_{}'.format(n), 'wb') for n in xrange(100)]
csvouts = [csv.writer(f) for f in files]
with open('yourcsv') as fin:
    csvin = csv.reader(fin)
    next(csvin, None) # Skip header
    for rowno, row in enumerate(csvin):
        csvouts[rowno % 100].writerow(row)

for f in files:
    f.close()
Run Code Online (Sandbox Code Playgroud)

您可以islice使用步骤而不是模数行号来覆盖文件,例如:

import csv
from itertools import islice

with open('yourcsv') as fin:
    csvin = csv.reader(fin)
    # Skip header, and then return every 100th until file ends
    for line in islice(csvin, 1, None, 100):
        # do something with line
Run Code Online (Sandbox Code Playgroud)

例:

r = xrange(1000)
res = list(islice(r, 1, None, 100))
# [1, 101, 201, 301, 401, 501, 601, 701, 801, 901]
Run Code Online (Sandbox Code Playgroud)