如何强制genfromtxt将csv读取为记录数组?

1 投票
1 回答
616 浏览
提问于 2025-04-18 02:39

我正在尝试用以下代码读取CSV文件:

raw_data = genfromtxt(datafile,delimiter='\t',dtype=None)

好的,这个函数在遇到数据文件中的字符串数据时,会把文件读入记录数组。根据我的理解,当dtype设置为None时,文件也应该被读入记录数组,对吗?

但是,如果文件中没有字符串数据,只有数字数据,这个函数就会把数据读入ndarray(一个数组类型)。

如果不是,有没有简单的方法强制这个函数把文件读取为记录数组呢?

问题在于ndarray不适合我,因为我所有的代码都是为了处理记录数组而写的。

更新1:

如果有人想尝试这样做,这里有一个简单的解决方案。可能这不是最好的方法,但至少可以用:

从CSV文件读取数据为ndarray:

raw_data = genfromtxt(datafile,delimiter='\t',dtype=None)

为列生成默认的名称和数据类型:

names_=['f'+str(i) for i in range(raw_data.shape[1])];
names=[(name,raw_data.dtype) for name in names_];

最后,创建记录数组:

raw_data_as_ra = raw_data.ravel().view(names);

1 个回答

3

你可以使用 recfromcsv,它是从 genfromtxt 衍生出来的,来处理你的数据文件:

如果你的文件内容是这样的:

col1,col2,col3
1.1, 2.4, 3.2
4.1, 5.2, 6.3

那么你可以这样做:

a = np.recfromcsv('yourfile.csv')

这样会得到:

rec.array([(1.1, 2.4, 3.2), (4.1, 5.2, 6.3)], 
      dtype=[('col1', '<f8'), ('col2', '<f8'), ('col3', '<f8')])

注意,recfromcsv 会把第一行当作列名或记录名。

另外,你可以使用和 genfromtxt 一样的输入参数(比如 delimiter 参数)。如果你的文件是用制表符分隔的,你的代码可能看起来像这样:

np.recfromcsv(datafile,delimiter='\t'))

撰写回答