使用numpy从csv加载一定数量的行

时间:2015-08-05 12:48:33

标签: python csv numpy genfromtxt

我有一个很长的文件,我只需要它的一部分,一片。 有新数据出现,因此文件可能会更长。

要从CSV加载数据,请使用numpy.genfromtxt

    np.genfromtxt(filename, usecols={col}, delimiter=",", skip_header=skip_head)

这在一开始就切断了文件的某些部分,这已经大大加快了加载数据的过程。 但是我最终无法使用skip_footer切断我想要使用的切片后的部分。

我想要的只是加载一定数量的行。例如假设我跳过前100行,然后加载接下来的50行,然后跳过其余的行。

编辑:我使用的是Python 3.4 编辑:示例文件:http://www.file-upload.net/download-10819938/sample.txt.html

3 个答案:

答案 0 :(得分:3)

您可以使用itertools获取切片,使用itemgetter获取列:

import  numpy as np
from operator import itemgetter
import csv
with open(filename) as f:
   from itertools import islice,imap
   r = csv.reader(f)
   np.genfromtxt(imap(itemgetter(1),islice(r,  start, end+1)))

对于python3,您可以使用fromiter和上面的代码来指定dtype:

import numpy as np
from operator import itemgetter
import csv
with open("sample.txt") as f:
   from itertools import islice
   r = csv.reader(f)
   print(np.fromiter(map(itemgetter(0), islice(r,  start, end+1)), dtype=float))

在另一个答案中,您也可以将islice对象直接传递给genfromtxt但是对于python3,您需要以二进制模式打开文件:

with open("sample.txt", "rb") as f:
    from itertools import islice
    print(np.genfromtxt(islice(f, start, end+1), delimiter=",", usecols=cols))

有趣的是,对于使用itertools.chain的多个列,如果所有dtypes都相同,则重新整形的效率会超过两倍:

from itertools import islice,chain
with open("sample.txt") as f:
   r = csv.reader(f)
   arr =np.fromiter(chain.from_iterable(map(itemgetter(0, 4, 10), 
                                            islice(r,  4, 10))), dtype=float).reshape(6, -1) 

在您的示例文件中:

In [27]: %%timeit
with open("sample.txt", "rb") as f:
    (np.genfromtxt(islice(f, 4, 10), delimiter=",", usecols=(0, 4, 10),dtype=float))
   ....: 

10000 loops, best of 3: 179 µs per loop

In [28]: %%timeit
with open("sample.txt") as f:
   r = csv.reader(f)                                                               (np.fromiter(chain.from_iterable(map(itemgetter(0, 4, 10), islice(r,  4, 10))), dtype=float).reshape(6, -1))

10000 loops, best of 3: 86 µs per loop

答案 1 :(得分:2)

关注this example,您应该可以使用itertools.islice,而无需imapmapcsv.reader

import numpy as np
import itertools

with open('sample.txt') as f:
    # this will skip 100 lines, then read the next 50
    d=np.genfromtxt(itertools.islice(f,100,150),delimiter=',',usecols={cols})

答案 2 :(得分:1)

Numpy 1.10开始,np.genfromtxt使用可选参数max_rows,该参数限制了要读取的行数。

结合其他可选参数skip_header,您可以选择文件的一部分(例如第100到150行):

import numpy as np

np.loadtxt('file.txt', skip_header=100, max_rows=50)