使用Numpy savetxt保存整数为CSV字符串

0 投票
1 回答
3133 浏览
提问于 2025-04-18 09:01

我有三个列表,想用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

撰写回答