2014-09-23 140 views
1

我正在打开一个大的CSV文件,并且在将数据插入数组的过程中出现MemoryError。所以,我怎么可以读取CSV文件的特定行(例如,从第1行至10000)在Python中读取特定的CSV行

这里是代码:

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

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

你的csv文件有多大? – 2014-09-23 09:29:44

+0

为什么要将行放入一个数组('list'?'np.array'?),而不是迭代它们?你想达到什么目的? – jonrsharpe 2014-09-23 09:30:40

+0

Tim的答案效果不错,它大于1GB,大约9百万行。我需要的数据内容在线(这是网络包) – pafpaf 2014-09-23 09:38:44

回答

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,您可能想要接受此答案。 – 2014-09-23 09:48:27

+0

@Tim我不会对接受/代表感兴趣 - 只是开心对某人有用:) – 2014-09-23 09:53:38

+0

谢谢你们两位。 – pafpaf 2014-09-23 09:59:30

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 2014-09-23 09:36:18