使用python dtype作为压缩csv的头文件

时间:2012-07-23 17:42:16

标签: python csv numpy

我有1D numpy元组,结构为dtype。我正在使用np.savetxt将数组写入(压缩的)csv文件。我只想添加dtype中的字段名称作为第一行的标题。当我打印array.dtype时,我得到了

数组是类型为

的对象
[('time', '<u8'), ('timeStr', '|S27'), ('person', '|S24'), ...]

我认为从array.dtype创建一个元组('time', 'timeStr', 'person'...)并将其添加为数组中的第一个元组可能很简单但是dtype对象似乎很难处理(例如,你不能迭代它)。

有一种简单的方法吗?

编辑:senderle指出array.dtype.names存在,它解决了第一个问题。但是,理想情况下,我想输出一个gzip压缩的csv文件,而不先写出完整的csv文件,然后压缩它。 np.savetxt原生支持压缩,但是将头添加到numpy数组似乎会导致问题,因为它的类型错误。

1 个答案:

答案 0 :(得分:2)

这是获取字段名称元组的简单方法:

>>> a = numpy.array([(1, 2, 3), (4, 5, 6)], dtype=[('time', '<u8'), 
                                                   ('timeStr', '|S27'), 
                                                   ('person', '|S24')])
>>> a.dtype.names
('time', 'timeStr', 'person')

这是使用数据创建csv文件的简单方法:

>>> with open('data.txt', 'w') as datafile:
...     datafile.write(', '.join(a.dtype.names) + '\n')
...     numpy.savetxt(datafile, a, '%i, %s, %s')

之后data.txt的内容:

time, timeStr, person
1, 2, 3
4, 5, 6

如果您运行的是1.7或更高版本,则还可以将', '.join(a.dtype.names)传递给新的header参数。 (但请注意,最后一个断言未经测试,因为numpy的版本较旧。)

您可以使用gzip模块执行基本相同的操作。但是,这可能会更慢,因为numpy可能不再处理压缩。做一些测试。

>>> with gzip.GzipFile('data.gz', 'w') as datafile:
...     datafile.write(', '.join(a.dtype.names) + '\n')
...     numpy.savetxt(datafile, a, '%i, %s, %s')
... 

结果为data.gz,解压后的内容与上面列出的内容相同。