Я думаю, вы можете просто открыть тот же самый файл в 10 раз, а затем манипулировать (чтение) каждый из них независимо друг от друга эффективно расщепляя его на суб-файл фактически не делают.
К сожалению, для этого необходимо заранее знать, сколько строк в файле, и что нужно прочитывать все это раз, чтобы подсчитать их. С другой стороны, это должно быть относительно быстрым, поскольку никакой другой обработки не происходит.
Для иллюстрации и проверить этот подход, который я создал простой — только один элемент в строке — и гораздо меньший тест CSV-файл, который выглядел примерно так (первая строка строка заголовка и не учитываются):
line_no
1
2
3
4
5
...
9995
9996
9997
9998
9999
10000
Вот код и пример вывода:
from collections import deque
import csv
# count number of rows in csv file
# (this requires reading the whole file)
file_name = 'mycsvfile.csv'
with open(file_name, 'rb') as csv_file:
for num_rows, _ in enumerate(csv.reader(csv_file)): pass
rows_per_section = num_rows // 10
print 'number of rows: {:,d}'.format(num_rows)
print 'rows per section: {:,d}'.format(rows_per_section)
csv_files = [open(file_name, 'rb') for _ in xrange(10)]
csv_readers = [csv.reader(f) for f in csv_files]
map(next, csv_readers) # skip header
# position each file handle at its starting position in file
for i in xrange(10):
for j in xrange(i * rows_per_section):
try:
next(csv_readers[i])
except StopIteration:
pass
# read rows from each of the sections
for i in xrange(rows_per_section):
# elements are one row from each section
rows = [next(r) for r in csv_readers]
print rows # show what was read
# clean up
for i in xrange(10):
csv_files[i].close()
выход:
number of rows: 10,000
rows per section: 1,000
[['1'], ['1001'], ['2001'], ['3001'], ['4001'], ['5001'], ['6001'], ['7001'], ['8001'], ['9001']]
[['2'], ['1002'], ['2002'], ['3002'], ['4002'], ['5002'], ['6002'], ['7002'], ['8002'], ['9002']]
...
[['998'], ['1998'], ['2998'], ['3998'], ['4998'], ['5998'], ['6998'], ['7998'], ['8998'], ['9998']]
[['999'], ['1999'], ['2999'], ['3999'], ['4999'], ['5999'], ['6999'], ['7999'], ['8999'], ['9999']]
[['1000'], ['2000'], ['3000'], ['4000'], ['5000'], ['6000'], ['7000'], ['8000'], ['9000'], ['10000']]
Вы хотите только прочитать каждую 1/100-ю строку? – ErikR
Я обновил свой ответ (в случае, если вы не просмотрели его через некоторое время.) – ErikR