cargar un cierto número de filas de csv con numpy

Tengo un archivo muy largo y solo necesito partes, una porción de él. Están llegando nuevos datos, por lo que el archivo potencialmente se alargará.

Para cargar los datos del CSV utilizo numpy.genfromtxt

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

Esto corta algunas partes del archivo al principio, lo que ya acelera sustancialmente el proceso de carga de datos. Pero no puedo usar skip_footer al final para cortar la parte después de la porción que quiero usar.

Lo que quiero es cargar solo un cierto número de filas. por ejemplo, digamos que omito las primeras 100 filas, luego cargo las siguientes 50 filas y luego omito las demás.

Edición: estoy usando Python 3.4
edición: archivo de muestra: http://www.file-upload.net/download-10819938/sample.txt.html

Puede obtener la porción usando itertools, tomando la columna usando 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))) 

Para python3, puede usar fromiter con el código anterior que necesita para especificar el tipo de dty:

 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)) 

Como en la otra respuesta, también puede pasar el objeto islice directamente a genfromtxt pero para python3 necesitará abrir el archivo en modo binario:

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

Curiosamente, para varias columnas, el uso de itertools.chain y la remodelación son más del doble de eficientes si todos sus tipos de datos son iguales:

 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) 

En su archivo de muestra:

 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 

Siguiendo este ejemplo , debería poder usar itertools.islice , sin necesidad de imap , map o csv.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}) 

Iniciando Numpy 1.10 , np.genfromtxt toma un parámetro opcional max_rows que limita el número de líneas a leer.

Combinado con el otro parámetro opcional skip_header , puede seleccionar una porción de su archivo (por ejemplo, las líneas 100 a 150):

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