我有一个很长的文件,我只需要部分,切片,它。有新数据传入,所以文件可能会变长。
要从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
您可以使用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对象直接传递给genfromtext,但对于python3,您需要以二进制模式打开文件:
with open("sample.txt", "rb") as f:
from itertools import islice
print(np.genfromtxt(islice(f, start, end+1), delimiter=",", usecols=cols))
有趣的是,对于多个列使用itertools。如果所有的dtype都是相同的,那么Chain和重塑的效率将是原来的两倍。
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
按照这个例子,您应该能够使用itertools.islice
,而不需要imap
, map
或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})
从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)