2014-09-23 3 views
1

Я открываю большой файл CSV и при вставке данных в массив получил MemoryError. Так как я могу читать отдельные строки этого CSV файла (например, из строки 1 до 10000)Чтение до определенной строки CSV в Python

здесь код:

datafile=open('test.csv','r') 
datareader=csv.reader(datafile,delimiter=';') 

for row in datareader: 
    MyArray.append(row) 
+0

Насколько велик ваш файл csv? –

+0

Почему вы помещаете строки в массив ('list'?' Np.array??), А не просто перебираете их? Чего вы пытаетесь достичь? – jonrsharpe

+0

Ответ Тима работает хорошо, это больше, чем 1 ГБ, около 9 миллионов строк. Мне нужно содержание данных в строке (это сетевой пакет) – pafpaf

ответ

2

Я хотел бы использовать islice вместо enumerate:

from itertools import islice 

# First 10000 
MyArray.extend(islice(datareader, 10000)) 

# Or, specify start/stop ranges (10000-20000 (non inclusive)) 
MyArray.extend(islice(datareader, 10000, 20000)) 

# Or read in chunks of 10k 
for chunk in iter(lambda: list(islice(datareader, 10000)), []): 
    # do something with 10k rows 
+0

О, гораздо приятнее. Раньше я никогда не использовал для 'islice', но это, безусловно, идеальный случай. @ user3636424, вы можете принять этот ответ вместо этого. –

+0

@Tim Я не суетился о принятии/повторениях - просто счастлив, что это полезно для кого-то :) –

+0

Спасибо вам обоим. – pafpaf

2

Использование enumerate():

for i, row in enumerate(datareader): 
    MyArray.append(row) 
    if i == 10000: 
     break 

или для любого диапазон:

start = 1000 
stop = 2000 
for i, row in enumerate(datareader): 
    if i < start: 
     continue  # skip this row 
    elif i > stop: 
     break  # abort the loop 
    else:   # ("else" is not strictly necessary here, but more explicit) 
     MyArray.append(row) 
+0

спасибо, он работает – pafpaf

Смежные вопросы