使用Numpy savetxt保存整数为CSV字符串
我有三个列表,想用csv文件保存它们,打算使用numpy里的savetxt
函数。
这三个列表list1、list2和list3的长度都是一样的,每个列表里只有一个值。
list1和list2是整数值,而list3是字符串值。
所以最后的结果应该是这样的:第一列=list1 第二列=list2 第三列=list3
如果list3也是整数的话,这个方法对我有效。但现在不行,因为list3是字符串。
我该如何处理,让list3可以是字符串,并找到c_
的解决办法呢?
savetxt('data/result.csv', c_(list1,list2,list3), delimiter=',', fmt='%d, %d, %d',
header='Name,Value,Value2', comments = '')
非常感谢你的帮助!
1 个回答
2
一个问题是这样的:
c_(list1, list2, list3)
c_
是一个比较特别的对象,用的时候要用 索引 的方式,而不是 调用 的方式。当你尝试调用它时,会出现评论中提到的错误:
In [42]: c_(list1, list2, list3)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-42-8fcbef857684> in <module>()
----> 1 c_(list1, list2, list3)
TypeError: 'CClass' object is not callable
所以,应该使用方括号,这样你就是在进行索引:
In [44]: c_[list1, list2, list3]
Out[44]:
array([['10', '15', 'foo'],
['20', '25', 'bar'],
['30', '35', 'baz']],
dtype='|S3')
注意,它会创建一个数据类型为 '|S3'
的数组。也就是说,数组里的所有元素都被转换成了字符串。要用 savetxt
保存这个数组,可以使用 fmt='%s, %s, %s'
:
In [45]: savetxt('result.csv', c_[list1, list2, list3], fmt='%s, %s, %s')
In [46]: !cat result.csv
10, 15, foo
20, 25, bar
30, 35, baz
另外,除了 c_[list1, list2, list3]
,你还可以使用 zip(list1, list2, list3)
。这样的话,savetxt
函数会自动把这个参数转换成数组。
In [57]: list1 = [100000, 200000, 300000]
In [58]: savetxt('result.csv', zip(list1, list2, list3), fmt='%s, %s, %s')
In [59]: !cat result.csv
100000, 15, foo
200000, 25, bar
300000, 35, baz
显然,c_
在判断字符串的合适长度方面做得不太好:
In [60]: c_[list1, list2, list3]
Out[60]:
array([['100', '15', 'foo'],
['200', '25', 'bar'],
['300', '35', 'baz']],
dtype='|S3')
顺便提一下,你的数据并不是已经在一个 numpy 数组里,所以我觉得用 savetxt
并没有比使用标准库的 csv
更有优势。例如,
In [61]: import csv
In [62]: with open('result.csv', 'w') as f:
....: wrtr = csv.writer(f)
....: wrtr.writerows(zip(list1, list2, list3))
....:
In [63]: !cat result.csv
100000,15,foo
200000,25,bar
300000,35,baz