我想阅读numpy.loadtxt
的CSV文件。我知道我可以使用usecols
参数指定要读取的列。但是,我实际想要做的是指定要读取的列不的列表。这是因为我实际上并不知道我的文件将包含多少列。
有没有办法做到这一点,除了阅读文件的前几行,确定列总数,然后手动计算要读取的列集?
答案 0 :(得分:2)
正如你所提到的,并非没有阅读第一行。
但是,它可能更容易:
do_not_read_cols = [3, 4, 9]
data = np.loadtxt('filename')
data = np.delete(data, do_read_cols, axis=1)
这不会非常节省内存,但loadtxt
开始时并不会尝试提高内存效率。除非您删除了大部分列,否则调用loadtxt
时使用的内存将超过delete
后续临时副本所用的内存。
为了扩展我在下面的评论,如果你想要节省内存并且不想使用pandas
,另一种选择是这样的:(注意:写得有点懒散。)
import numpy as np
def generate_text_file(length=1e6, ncols=20):
data = np.random.random((length, ncols))
np.savetxt('large_text_file.csv', data, delimiter=',')
def iter_loadtxt(filename, delimiter=',', skiprows=0, skipcols=None,dtype=float):
if skipcols is None:
skipcols = []
def iter_func():
with open(filename, 'r') as infile:
for _ in range(skiprows):
next(infile)
for line in infile:
line = line.rstrip().split(delimiter)
for i, item in enumerate(line):
if i in skipcols:
continue
yield dtype(item)
iter_loadtxt.rowlength = len(line) - len(skipcols)
data = np.fromiter(iter_func(), dtype=dtype)
data = data.reshape((-1, iter_loadtxt.rowlength))
return data
#generate_text_file()
data = iter_loadtxt('large_text_file.csv')