numpy.loadtxt - 否定usecols?

时间:2014-01-09 14:22:52

标签: python numpy scipy

我想阅读numpy.loadtxt的CSV文件。我知道我可以使用usecols参数指定要读取的列。但是,我实际想要做的是指定要读取的列的列表。这是因为我实际上并不知道我的文件将包含多少列。

有没有办法做到这一点,除了阅读文件的前几行,确定列总数,然后手动计算要读取的列集?

1 个答案:

答案 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')